(57)【要約】【課題】管理領域を設ける必要がなく、またアクセス負荷を軽減することができる、データ格納用フラッシュメモリの管理方法を提供する。【解決手段】消去単位であるブロックをｊ個（ｊは２以上の偶数）含むフラッシュメモリに、時間と共に変化するｋ個（ｋは正の整数）のパラメータを記憶する、データ格納用フラッシュメモリの管理方法であって、以下のように構成される。ｊ個のブロックをそれぞれｊ／２個ずつのブロックからなる２つの領域に分け、１次マクロブロックと２次マクロブロックとする。１次マクロブロックと２次マクロブロックは、それぞれが等しい記憶容量を持つｋ個以上のセグメントをそれぞれ備え、一方を現用系、他方を待機系とする。ｋ個のパラメータのそれぞれは、ｋ個以上のうちのｋ個のセグメントと１：１で対応付けられ、現用系マクロブロックにおける対応するセグメントに書き込まれ、そのセグメントから読み出される。【選択図】図１
2015082166.tif 000002
【特許請求の範囲】
【請求項１】
消去単位であるブロックをｊ個（ｊは２以上の偶数）含むフラッシュメモリに、変化するｋ個（ｋは正の整数）のパラメータを記憶する、データ格納用フラッシュメモリの管理方法であって、
前記ｊ個のブロックをそれぞれｊ／２個ずつのブロックからなる２つの領域に分け、１次マクロブロックと２次マクロブロックとし、
前記１次マクロブロックと前記２次マクロブロックは、それぞれが等しい記憶容量を持つｋ個以上のセグメントをそれぞれ備え、一方を現用系、他方を待機系とし、
前記ｋ個のパラメータのそれぞれは、前記ｋ個以上のセグメントのうちのｋ個のセグメントと１：１で対応付けられ、現用系マクロブロックにおける対応するセグメントに書き込まれ、また、前記現用系マクロブロックにおける対応する前記セグメントから読み出される、
データ格納用フラッシュメモリの管理方法。
【請求項２】
請求項１において、前記ｋ個のパラメータに含まれる第Ｍパラメータ（Ｍはｋ以下の正の整数）は、ヘッダ情報が付加されて、前記現用系マクロブロックの第Ｍセグメントの先頭アドレスから書き込まれ、以降に第Ｍパラメータが書き込まれるときは、前記第Ｍセグメントのブランク領域の先頭アドレスから書き込まれ、
前記ヘッダ情報は、前記１次マクロブロックと前記２次マクロブロックがそれぞれ含むセグメント数と、次に前記第Ｍパラメータを書き込むべき領域の先頭アドレスを算出可能な、アドレスオフセット情報を含む、
データ格納用フラッシュメモリの管理方法。
【請求項３】
請求項１において、前記１次マクロブロックと前記２次マクロブロックのそれぞれにおけるセグメントの数がｋ＋１以上であり、前記ｋ個のパラメータに含まれる第Ｍパラメータについて、前記現用系マクロブロックにおける対応する第Ｍセグメントへの書き込みを試みたとき、前記第Ｍセグメントの全ての領域が書き込み済みの場合、前記現用系マクロブロックにおける第１から第ｋセグメント以外のセグメントに、前記第Ｍパラメータの値の全部または一部を書き込み、
前記第Ｍパラメータのヘッダ情報に含まれるアドレスオフセット情報は、次に前記第Ｍパラメータを書き込むべき領域の、書き込み対象とされた前記セグメントにおける先頭アドレスを示す情報を含む、
データ格納用フラッシュメモリの管理方法。
【請求項４】
請求項３において、前記第Ｍパラメータの書き込みを試みたとき、前記現用系マクロブロックにおけるに未使用セグメントがなくなったとき、前記第Ｍパラメータの書き込みを前記待機系マクロブロックの第Ｍセグメントの先頭アドレスから行い、
その後、前記第Ｍパラメータ以外のパラメータについて、それぞれ最新の値を前記現用系マクロブロックから読み出し、前記待機系マクロブロックにおける対応するセグメントに書き込み、
その後、前記現用系マクロブロックの全ての領域のデータを消去し、
その後、前記待機系マクロブロックを新たに現用系マクロブロックとし、前記現用系マクロブロックを新たに待機系マクロブロックとする、
データ格納用フラッシュメモリの管理方法。
【請求項５】
請求項２において、前記第Ｍパラメータの書き込みを実行するとき、前記現用系マクロブロックの先頭から前記ヘッダ情報に含まれる前記アドレスオフセット情報を読み出し、
前記アドレスオフセット情報に基づいて、前記第Ｍパラメータが次に更新され書き込まれる領域の先頭アドレスを算出し、さらに当該領域のデータを読み出すことにより、当該領域が既にデータが書き込まれた書き込み済み領域か、ブランク領域かを判定するステップを、ブランク領域を発見するまで繰り返し、
発見したブランク領域に、前記第Ｍパラメータを書き込む、
データ格納用フラッシュメモリの管理方法。
【請求項６】
請求項２において、前記第Ｍパラメータの読み出しを実行するとき、前記現用系マクロブロックの先頭から前記ヘッダ情報に含まれる前記アドレスオフセット情報を読み出し、
前記アドレスオフセット情報に基づいて、前記第Ｍパラメータが次に更新され書き込まれる領域の先頭アドレスを算出し、さらに当該領域のデータを読み出すことにより、当該領域が既にデータが書き込まれた書き込み済み領域か、ブランク領域かを判定するステップを、ブランク領域を発見するまで繰り返し、
発見したブランク領域の直前に書き込まれている前記第Ｍパラメータを、前記第Ｍパラメータの最新の値として読み出す、
データ格納用フラッシュメモリの管理方法。
【請求項７】
請求項２において、前記ヘッダ情報は、前記第Ｍパラメータが書き込まれるセグメントのセグメント識別情報をさらに含む、
データ格納用フラッシュメモリの管理方法。
【請求項８】
請求項７において、前記セグメント識別情報とアプリケーションプログラムが使用する配列名とを対応付ける変換テーブルを、前記データ格納用フラッシュメモリ内に保持する、
データ格納用フラッシュメモリの管理方法。
【請求項９】
請求項８において、前記変換テーブルに、同じ前記セグメント識別情報に対して複数回の前記配列名の対応付けが許され、偶数回の対応付けにより当該セグメント識別情報に対する配列名の対応付けを無効とし、次の奇数回目の当該セグメント識別情報に対する配列名の対応付けを有効とする、
データ格納用フラッシュメモリの管理方法。
【請求項１０】
フラッシュメモリに、変化するｋ個（ｋは正の整数）のパラメータを繰り返し更新するための書き込み、前記パラメータの最新データを読み出すためのプログラムであって、前記フラッシュメモリにアクセス可能なプロセッサによって実行されることにより、
前記フラッシュメモリ内に、消去単位であるブロックをそれぞれ同数ずつ備える１次マクロブロックと２次マクロブロックを定義し、前記１次マクロブロックと前記２次マクロブロックの一方を現用系、他方を待機系とし、前記１次マクロブロック内に、それぞれが等しい記憶容量を持つｋ個以上のセグメントを定義し、前記２次マクロブロック内に、それぞれが等しい記憶容量を持つｋ個以上のセグメントを定義し、
前記ｋ個のパラメータのそれぞれを、前記ｋ個以上のセグメントのうちのｋ個のセグメントと１：１で対応付け、
前記パラメータを前記フラッシュメモリに書き込むときには、現用系マクロブロックにおける対応するセグメントに対して書き込むための書き込みステップを実行し、
前記パラメータの最新値を前記フラッシュメモリから読み出すときには、前記現用系マクロブロックにおける対応するセグメントに対して読み出しステップを実行する、
プログラム。
【請求項１１】
請求項１０において、前記ｋ個のパラメータに含まれる第Ｍパラメータ（Ｍはｋ以下の正の整数）は、ヘッダ情報が付加され、前記現用系マクロブロックにおいて対応する第Ｍセグメントの先頭アドレスから順次書き込まれており、
前記ヘッダ情報は、前記１次マクロブロックと前記２次マクロブロックがそれぞれ含むセグメント数と、次に前記第Ｍパラメータを書き込むべき領域の先頭までのオフセットを示す、アドレスオフセット情報を含み、
第Ｍパラメータを書き込むための前記書き込みステップは、前記第Ｍセグメントの先頭アドレスから前記ヘッダに含まれる前記アドレスオフセット情報を読み出し、前記アドレスオフセット情報から次のヘッダ情報が格納されるアドレスを算出して次のヘッダ情報を読み出すステップを、ヘッダ情報の格納されていないブランク領域に到達するまで繰り返し、前記第Ｍパラメータにヘッダ情報を付加して、前記ブランク領域に書き込むステップを含み、
第Ｍパラメータの最新値を読み出すための前記読み出しステップは、前記第Ｍセグメントの先頭アドレスから前記ヘッダに含まれる前記アドレスオフセット情報を読み出し、前記アドレスオフセット情報から次のヘッダ情報が格納されるアドレスを算出して次のヘッダ情報を読み出すステップを、ヘッダ情報の格納されていないブランク領域に到達するまで繰り返し、前記ブランク領域に到達する直前に読み出したヘッダ情報が付加されたパラメータを前記第Ｍパラメータの最新値として読み出すステップを含む、
プログラム。
【請求項１２】
請求項１１において、前記１次マクロブロックと前記２次マクロブロックのそれぞれにおけるセグメントの数がｋ＋１以上であり、第Ｍパラメータを書き込むための前記書き込みステップは、前記現用系マクロブロックにおける対応する第Ｍセグメントへの書き込みを試みたとき、前記第Ｍセグメントの全ての領域が書き込み済みの場合、前記現用系マクロブロックにおける第１から第ｋセグメント以外のセグメントに、前記第Ｍパラメータの値の全部または一部を書き込むステップを含み、
前記第Ｍパラメータのヘッダ情報に含まれるアドレスオフセット情報は、次に前記第Ｍパラメータを書き込むべき領域の、書き込み対象とされた前記セグメントにおける先頭アドレスを算出可能な情報を含む、
プログラム。
【請求項１３】
請求項１２において、前記第Ｍパラメータの書き込みを試みたとき、前記現用系マクロブロックにおける未使用セグメントがなくなったとき、
前記プログラムは、前記第Ｍパラメータの書き込みを、前記待機系マクロブロックの第Ｍセグメントの先頭アドレスから行うステップを含み、
その後、前記第Ｍパラメータ以外のパラメータについて、それぞれ最新の値を前記現用系マクロブロックから読み出し、前記待機系マクロブロックにおける対応するセグメントに書き込むステップを含み、
その後、前記現用系マクロブロックの全ての領域のデータを消去するステップを含み、
その後、前記待機系マクロブロックを新たに現用系マクロブロックとし、前記現用系マクロブロックを新たに待機系マクロブロックとするステップを含む、
プログラム。
【請求項１４】
請求項１１において、前記ヘッダ情報は、前記第Ｍパラメータが書き込まれるセグメントのセグメント識別情報をさらに含む、
プログラム。
【請求項１５】
請求項１４において、前記セグメント識別情報とアプリケーションプログラムが使用する配列名とを対応付ける変換テーブルを、前記フラッシュメモリ内に保持するステップを含む、
プログラム。
【請求項１６】
請求項１５において、前記変換テーブルに、同じ前記セグメント識別情報に対して複数回の前記配列名の対応付けが許され、偶数回の対応付けにより当該セグメント識別情報に対する配列名の対応付けを無効とし、次の奇数回目の当該セグメント識別情報に対する配列名の対応付けを有効とするステップを含む、
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ格納用フラッシュメモリの管理方法およびそのプログラムに関し、特に当該フラッシュメモリへのアクセス負荷の低減に好適に利用できるものである。
【背景技術】
【０００２】
ロボット、工作機器等の産業機器では制御の指令値、及び状態値の計算に回転数、角度、位置を表す種々のパラメータを使用する。また、携帯電話、サーバー等の通信機器でもTCP/IP（Transmission Control Protocol / Internet Protocol）やUSB（Universal Serial Bus）通信等で通信相手のIP（Internet Protocol）アドレスやベンダID（IDentification）等のパラメータを使用する。これらパラメータは機器を停止後（電源遮断後）、再度の起動後にも使用するので不揮発性メモリに格納する必要がある。また、読み出しは頻繁に行なわれ、読み出し程には頻度でないが、時間と共に変化するパラメータもあるので、その場合は値の更新も必要である。そのような機器の不揮発性メモリにはフラッシュメモリが多用され、ＣＰＵ（Central Processing Unit）と同一半導体チップに混載され、上述のパラメータのようなデータの格納に用いられる、データフラッシュと呼ばれるフラッシュメモリが用いられる。
【０００３】
フラッシュメモリは、ブロックと呼ばれる数ＫＢ（キロバイト）の領域を１つの単位として一括して消去することができる点に特徴がある。書き込み単位は数Ｂ（バイト）であるが、一度書き込みを行ったアドレス領域において、別の値を上書きすることはできず、一旦ブロック単位で消去した後でないと再度書き込むことができない。上記のようなパラメータを格納するフラッシュメモリでは、格納されたパラメータの値を更新するときには、更新された値（最新の値）を新たなアドレス領域に追記する方法が、一般に採用されている。そのため、フラッシュメモリからパラメータを読み出すときに、最新の値が格納されているアドレスを求める、種々の管理方法が提案されている。
【０００４】
特許文献１には、フラッシュメモリを内蔵するマイクロコントローラが開示されている。内蔵されるフラッシュメモリを構成する複数のブロックは、１つの管理ブロックと複数のエリアのいずれかに属する複数のブロックに分割される。ここで「エリア」とは、フラッシュメモリに書き込むレコードの記録先を、そのレコードが含むデータの種別に応じて仕分けするために設けられた領域である。どの種別のデータがどのエリアに記録されているかの情報は、データＩＤとエリアとの対応関係を示すエリア対応テーブルとして、フラッシュメモリとは別のＲＯＭに格納されている（第００１７段落〜第００１８段落）。また、管理ブロックには、各エリアでデータの最新値が記録されているブロックの情報が書き込まれている（第００２２段落）。マイクロコントローラに内蔵されているＣＰＵは、管理ブロックに記録されている情報と、エリア対応テーブルを参照して、所望のデータを読み出し、或いは追記、ブロック単位の消去などの動作を行う。
【０００５】
特許文献２には、フラッシュメモリ等の不揮発性メモリを使ったデータバックアップ方法が開示されている。同一種別のデータに対する書き込み領域を、２つのメモリ媒体上にそれぞれ設け、一方のメモリ媒体のデータを消去する際には、他方のメモリ媒体に入力データの書き込みを行う。各メモリ媒体の運用状況は、それぞれに設けられた管理データ記憶領域を利用して管理される。データ種別ごとの書き込み領域は、消去単位であるブロック（同文献では「セクタ」と呼ばれている）を単位として、１乃至複数のブロックが割り当てられている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１３−３６５５号公報
【特許文献２】特開平１１−３５３２４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１及び２について本発明者が検討した結果、以下のような新たな課題があることがわかった。
【０００８】
時間的に変化する、制御用あるいは通信用などのパラメータを、機器の電源遮断に備えて不揮発に保持するため、フラッシュメモリに格納する場合に、上記のような従来技術を用いると、パラメータのアクセスに際してＣＰＵやメモリコントローラなどのアクセス主体に対して求められる負荷が重いことがわかった。上述のように、フラッシュメモリは、消去単位であるブロックを複数備えており、さらに消去単位（数ＫＢ）が書き込み単位（数Ｂ）と比較して著しく大きいため、データのアクセスは設けられた何らかの管理領域を利用して管理される。特許文献１ではフラッシュメモリ上に管理ブロックを設け、さらに、フラッシュメモリとは別のＲＯＭにデータＩＤとエリアとの対応関係を示すエリア対応テーブルを有している。特許文献２では管理データ記憶領域が設けられている。所望のデータを読み出す場合には、まず管理領域にアクセスして当該データが格納されているブロックを特定し、さらにそのブロックの中を探索して、最新の（最後に更新された）データを読み出す。データが変化し、書き込みが必要になった場合には、管理領域にアクセスして当該データを追記するブロックを特定し、さらにそのブロックの中の未使用領域（ブランク領域）を探索して書き込む。
【０００９】
以上のように、ＣＰＵやメモリコントローラなどのアクセス主体は、まず管理領域にアクセスして探索対象のブロックを特定し、次に特定されたブロックの中を探索するなど、何段階かのアクセス手順を採らなければならず、アクセスのための負荷が重いことが分かった。
【００１０】
このような課題を解決するための手段を以下に説明するが、その他の課題と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１１】
一実施の形態によれば、下記の通りである。
【００１２】
すなわち、消去単位であるブロックをｊ個（ｊは２以上の偶数）含むフラッシュメモリに、時間と共に変化するｋ種（ｋは正の整数、「個」を単位とする場合もある）のパラメータを記憶する、データ格納用フラッシュメモリの管理方法であって、以下のように構成される。
【００１３】
ｊ個のブロックをそれぞれｊ／２個ずつのブロックからなる２つの領域に分け、１次マクロブロックと２次マクロブロックとする。１次マクロブロックと２次マクロブロックは、それぞれが等しい記憶容量を持つｋ個以上のセグメントをそれぞれ備え、一方を現用系、他方を待機系とする。ｋ種のパラメータのそれぞれは、ｋ個以上のセグメントのうちのｋ個のセグメントと１：１で対応付けられ、現用系マクロブロックにおける対応するセグメントに書き込まれ、また、そのセグメントから読み出される。
【発明の効果】
【００１４】
前記一実施の形態によって得られる効果を簡単に説明すれば下記のとおりである。
【００１５】
すなわち、フラッシュメモリ上に管理領域を設ける必要がなく、またアクセスに際して管理領域をアクセスするステップを不要として、アクセス負荷を軽減することができる。
【図面の簡単な説明】
【００１６】
【図１】図１は、データ格納用フラッシュメモリ（データフラッシュ）上のデータ構成を表す説明図である。
【図２】図２は、データフラッシュ上のレコードの構成を表す説明図である。
【図３】図３は、ヘッダの構成を表す説明図である。
【図４】図４は、データフラッシュが適用されたシステムの構成例を表す説明図である。
【図５】図５は、システムにおけるソフトウェアとデータフラッシュの構成例を表す説明図である。
【図６】図６は、パラメータのデータフラッシュへの書き込み動作を表すフローチャート（前半）である。
【図７】図７は、パラメータのデータフラッシュへの書き込み動作を表すフローチャート（後半）である。
【図８】図８は、パラメータのデータフラッシュへの書き込み動作（連結なし）を表す説明図である。
【図９】図９は、図８におけるレコード(M,N)の内容を表す説明図である。
【図１０】図１０は、パラメータのデータフラッシュへの書き込み動作（連結あり）を表す説明図である。
【図１１】図１１は、図１０におけるレコード(M,N+1)とレコード(M,N+2)の内容を表す説明図である。
【図１２】図１２は、パラメータのデータフラッシュへの書き込みによりブロック消去が発生する場合の動作を表す説明図である。
【図１３】図１３は、図１２におけるレコード(M,N+1)の内容を表す説明図である。
【図１４】図１４は、１次と２次マクロブロック間で現用系と待機系を交替する動作を表す説明図である。
【図１５】図１５は、交替動作における最新レコードの転送動作を表す説明図である。
【図１６】図１６は、パラメータのデータフラッシュからの読み出し動作を表すフローチャートである。
【図１７】図１７は、実施形態２に係るデータフラッシュ上の変換テーブルの構成を表す説明図である。
【図１８】図１８は、実施形態２に係るデータフラッシュへの書き込み動作を表すフローチャートである。
【図１９】図１９は、実施形態２に係るデータフラッシュからの読み出し動作を表すフローチャートである。
【図２０】図２０は、実施形態３に係るデータフラッシュ上の変換テーブルの構成を表す説明図である。
【発明を実施するための形態】
【００１７】
１．実施の形態の概要
先ず、本願において開示される代表的な実施の形態について概要を説明する。代表的な実施の形態についての概要説明で括弧を付して参照する図面中の参照符号はそれが付された構成要素の概念に含まれるものを例示するに過ぎない。
【００１８】
〔１〕＜パラメータとセグメントの１：１関連付け＞
消去単位であるブロック（３）をｊ個（ｊは２以上の偶数）含むフラッシュメモリ（１）に、変化するｋ個（ｋは正の整数、「種」を単位とする場合もある）のパラメータを記憶する、データ格納用フラッシュメモリの管理方法であって、以下のように構成される。
【００１９】
前記フラッシュメモリは、前記ｊ個のブロックをそれぞれｊ／２個ずつのブロックからなる２つの領域に分けられ、１次マクロブロック（２＿１）と２次マクロブロック（２＿２）とされる。
【００２０】
前記１次マクロブロックと前記２次マクロブロックは、それぞれが等しい記憶容量を持つｋ個以上のセグメント（４）をそれぞれ備え、一方を現用系、他方を待機系とされる。
【００２１】
前記ｋ個のパラメータ（５）のそれぞれは、前記ｋ個以上のセグメントのうちのｋ個のセグメントと１：１で対応付けられ、現用系マクロブロックにおける対応するセグメントに書き込まれ、また、前記現用系マクロブロックにおける対応する前記セグメントから読み出される。
【００２２】
これにより、フラッシュメモリ上に管理領域を設ける必要がなく、またアクセスに際して管理領域をアクセスするステップを不要として、アクセス負荷を軽減することができる。
【００２３】
〔２〕＜レコード＝ヘッダ（分割数、オフセット、他）＋データ＞
項１において、前記ｋ個のパラメータに含まれる第Ｍパラメータ（Ｍはｋ以下の正の整数）は、ヘッダ情報（１０）が付加されて、前記現用系マクロブロックの第Ｍセグメントの先頭アドレスから書き込まれ（Ｓ７）、以降に第Ｍパラメータが書き込まれるときは、前記第Ｍセグメントのブランク領域の先頭アドレスから書き込まれる（Ｓ１４）。
【００２４】
前記ヘッダ情報は、前記１次マクロブロックと前記２次マクロブロックがそれぞれ含むセグメント数（１５）と、次に前記第Ｍパラメータを書き込むべき領域の先頭アドレスを算出可能な、アドレスオフセット情報（１６）を含む。
【００２５】
これにより、ブランク領域の先頭アドレスを簡単に算出することができる。
【００２６】
〔３〕＜対応するセグメントに空きがなくなったときブランクセグメントに書き込み＞
項１または項２において、前記１次マクロブロックと前記２次マクロブロックのそれぞれにおけるセグメントの数がｋ＋１以上であるとする。前記ｋ個のパラメータに含まれる第Ｍパラメータについて、前記現用系マクロブロックにおける対応する第Ｍセグメントへの書き込みを試みたとき、前記第Ｍセグメントの全ての領域が書き込み済みの場合、前記現用系マクロブロックにおける第１から第ｋセグメント以外のセグメントに、前記第Ｍパラメータの値の全部または一部を書き込む（Ｓ１６〜Ｓ２０）。
【００２７】
前記第Ｍパラメータのヘッダ情報に含まれるアドレスオフセット情報（１６）は、次に前記第Ｍパラメータを書き込むべき領域の、書き込み対象とされた前記セグメントにおける先頭アドレスを示す情報を含む。
【００２８】
これにより、対応するセグメントに空きがなくなったときに、未使用のセグメントを探索して新たな書き込み対象セグメントとして活用することができる。また、さらに次の第Ｍパラメータの書き込みの際に、どのセグメントが新たな書き込み対象セグメントとして選択されたかは、第Ｍセグメントに最後に書き込まれたデータのヘッダ情報から簡単に算出される。
【００２９】
〔４〕＜ブランクセグメントがなくなった場合のマクロブロックの交替＞
項３において、前記第Ｍパラメータの書き込みを試みたとき、前記現用系マクロブロックにおけるに未使用セグメントがなくなったとき、前記第Ｍパラメータの書き込みを前記待機系マクロブロックの第Ｍセグメントの先頭アドレスから行う（Ｓ２１）。
【００３０】
その後、前記第Ｍパラメータ以外のパラメータについて、それぞれ最新の値を前記現用系マクロブロックから読み出し、前記待機系マクロブロックにおける対応するセグメントに書き込む（Ｓ２３〜Ｓ２８）。
【００３１】
その後、前記現用系マクロブロックの全ての領域のデータを消去する（Ｓ２７）。
【００３２】
その後、前記待機系マクロブロックを新たに現用系マクロブロックとし、前記現用系マクロブロックを新たに待機系マクロブロックとする。
【００３３】
これにより、１次マクロブロックと２次マクロブロックを、現用系と待機系として交互に交替させて使用することができる。
【００３４】
〔５〕＜ブランクチェック（書き込み時）＞
項２において、前記第Ｍパラメータの書き込みを実行するとき、前記現用系マクロブロックの先頭から前記ヘッダ情報に含まれる前記アドレスオフセット情報を読み出す（Ｓ４）。
【００３５】
前記アドレスオフセット情報に基づいて、前記第Ｍパラメータが次に更新され書き込まれる領域の先頭アドレスを算出し（Ｓ１０〜Ｓ１１）、さらに当該領域のデータを読み出すことにより、当該領域が既にデータが書き込まれた書き込み済み領域か、ブランク領域かを判定するステップ（Ｓ９〜Ｓ１２）を、ブランク領域を発見するまで繰り返す。
【００３６】
発見したブランク領域に、前記第Ｍパラメータを書き込む（Ｓ１４）。
【００３７】
これにより、短い探索時間（探索ステップ）により、ブランク領域を発見して、そこに書き込むことができる。
【００３８】
〔６〕＜最新パラメータの判別（読み出し時）＞
項２において、前記第Ｍパラメータの読み出しを実行するとき、前記現用系マクロブロックの先頭から前記ヘッダ情報に含まれる前記アドレスオフセット情報を読み出す（Ｓ３５）。
【００３９】
前記アドレスオフセット情報に基づいて、前記第Ｍパラメータが次に更新され書き込まれる領域の先頭アドレスを算出し、さらに当該領域のデータを読み出すことにより、当該領域が既にデータが書き込まれた書き込み済み領域か、ブランク領域かを判定するステップ（Ｓ３９〜Ｓ４３）を、ブランク領域を発見するまで繰り返す。
【００４０】
発見したブランク領域の直前に書き込まれている前記第Ｍパラメータを、前記第Ｍパラメータの最新の値として読み出す（Ｓ４４）。
【００４１】
これにより、短い探索時間（探索ステップ）により、最新パラメータを発見して読み出すことができる。
【００４２】
〔７〕＜ヘッダにセグメントＩＤを含む＞
項２において、前記ヘッダ情報は、前記第Ｍパラメータが書き込まれるセグメントのセグメント識別情報（１３）をさらに含む。
【００４３】
これにより、読み出されたデータに含まれるヘッダ情報から、パラメータ種別を判別することができる。
【００４４】
〔８〕＜セグメントＩＤと配列名を対応付ける変換テーブル＞
項７において、前記セグメント識別情報とアプリケーションプログラム（９１）が使用する配列名とを対応付ける変換テーブル（７）を、前記データ格納用フラッシュメモリ内に保持する。
【００４５】
これにより、アプリケーションプログラムからは、配列名によってアクセスすることができ、高級言語で記述されたアプリケーションプログラムからも、データ格納用フラッシュメモリ上のデータを扱うことができる。
【００４６】
〔９〕＜変換テーブルにおけるセグメントＩＤと配列名の対応関係の更新＞
項８において、前記変換テーブルに、同じ前記セグメント識別情報に対して複数回の前記配列名の対応付けが許され、偶数回の対応付けにより当該セグメント識別情報に対する配列名の対応付けを無効とし、次の奇数回目の当該セグメント識別情報に対する配列名の対応付けを有効とする。
【００４７】
これにより、セグメントＩＤに対応付けられる配列名を、変更可能とすることができる。
【００４８】
〔１０〕＜プログラム（パラメータとセグメントの１：１関連付け）＞
フラッシュメモリ（１）に、時間と共に変化するｋ個（ｋは正の整数）のパラメータ（５）を繰り返し更新するための書き込み、前記パラメータの最新データを読み出すためのプログラム（９２）であって、前記フラッシュメモリにアクセス可能なプロセッサ（８１）によって実行されることにより、以下の各処理を実行する。
【００４９】
前記フラッシュメモリ内に、消去単位であるブロック（３）をそれぞれ同数ずつ備える１次マクロブロック（２＿１）と２次マクロブロック（２＿２）を定義し、前記１次マクロブロックと前記２次マクロブロックの一方を現用系、他方を待機系とする。前記１次マクロブロック内に、それぞれが等しい記憶容量を持つｋ個以上のセグメント（４）を定義し、前記２次マクロブロック内に、それぞれが等しい記憶容量を持つｋ個以上のセグメント（４）を定義する。
【００５０】
前記ｋ個のパラメータのそれぞれを、前記ｋ個以上のセグメントのうちのｋ個のセグメントと１：１で対応付ける。
【００５１】
前記パラメータを前記フラッシュメモリに書き込むときには、現用系マクロブロックにおける対応するセグメントに対して書き込むための書き込みステップ（Ｓ４〜Ｓ２０）を実行する。
【００５２】
前記パラメータの最新値を前記フラッシュメモリから読み出すときには、前記現用系マクロブロックにおける対応するセグメントに対して読み出しステップ（Ｓ３５〜Ｓ４５）を実行する。
【００５３】
これにより、データ格納用フラッシュメモリとそれにアクセス可能なプロセッサを備えるデータ処理装置において、フラッシュメモリ上に管理領域を設ける必要がなく、またアクセスに際して管理領域をアクセスするステップを不要として、プロセッサによるアクセス負荷を軽減することができる、データ格納用フラッシュメモリの管理プログラムを提供することができる。
【００５４】
〔１１〕＜ブランク領域を探索する書き込みステップと最新値を探索する読み出しステップ；  レコード＝ヘッダ（分割数、オフセット、他）＋データ＞
項１０において、前記ｋ個のパラメータに含まれる第Ｍパラメータ（Ｍはｋ以下の正の整数）は、ヘッダ情報（１０）が付加され、前記現用系マクロブロックにおいて対応する第Ｍセグメントの先頭アドレスから順次書き込まれている。
【００５５】
前記ヘッダ情報は、前記１次マクロブロックと前記２次マクロブロックがそれぞれ含むセグメント数（１５）と、次に前記第Ｍパラメータを書き込むべき領域の先頭までのオフセットを示す、アドレスオフセット情報（１６）を含む。
【００５６】
第Ｍパラメータを書き込むための前記書き込みステップは、前記第Ｍセグメントの先頭アドレスから前記ヘッダに含まれる前記アドレスオフセット情報を読み出し（Ｓ４）、前記アドレスオフセット情報から次のヘッダ情報が格納されるアドレスを算出して次のヘッダ情報を読み出すステップ（Ｓ９〜Ｓ１２）を、ヘッダ情報の格納されていないブランク領域に到達するまで繰り返す。前記第Ｍパラメータにヘッダ情報を付加して、前記ブランク領域に書き込むステップ（Ｓ１４、Ｓ２０）を含む。
【００５７】
第Ｍパラメータの最新値を読み出すための前記読み出しステップは、前記第Ｍセグメントの先頭アドレスから前記ヘッダに含まれる前記アドレスオフセット情報を読み出す（Ｓ３６，Ｓ３９）。前記アドレスオフセット情報から次のヘッダ情報が格納されるアドレスを算出して次のヘッダ情報を読み出すステップ（Ｓ３９〜Ｓ４３）を、ヘッダ情報の格納されていないブランク領域に到達するまで繰り返す。前記ブランク領域に到達する直前に読み出したヘッダ情報が付加されたパラメータを前記第Ｍパラメータの最新値として読み出すステップ（Ｓ４４）を含む。
【００５８】
これにより、短い探索時間（探索ステップ）により、ブランク領域を発見して、そこに書き込むことができ、また、最新パラメータを発見して読み出すことができる。
【００５９】
〔１２〕＜対応するセグメントに空きがなくなったときブランクセグメントに書き込み＞
項１１において、前記１次マクロブロックと前記２次マクロブロックのそれぞれにおけるセグメントの数がｋ＋１以上であるとする。第Ｍパラメータを書き込むための前記書き込みステップは、前記現用系マクロブロックにおける対応する第Ｍセグメントへの書き込みを試みたとき、前記第Ｍセグメントの全ての領域が書き込み済みの場合、前記現用系マクロブロックにおける第１から第ｋセグメント以外のセグメントに、前記第Ｍパラメータの値の全部または一部を書き込むステップ（Ｓ１６〜Ｓ２０）を含む。
【００６０】
前記第Ｍパラメータのヘッダ情報に含まれるアドレスオフセット情報は、次に前記第Ｍパラメータを書き込むべき領域の、書き込み対象とされた前記セグメントにおける先頭アドレスを算出可能な情報を含む。
【００６１】
これにより、対応するセグメントに空きがなくなったときに、未使用のセグメントを探索して新たな書き込み対象セグメントとして活用することができる。また、さらに次の第Ｍパラメータの書き込みの際に、どのセグメントが新たな書き込み対象セグメントとして選択されたかは、第Ｍセグメントに最後に書き込まれたデータのヘッダ情報から簡単に算出される。
【００６２】
〔１３〕＜ブランクセグメントがなくなった場合のマクロブロックの交替＞
項１２において、前記第Ｍパラメータの書き込みを試みたとき、前記現用系マクロブロックにおけるに未使用セグメントがなくなったとき、前記プログラムは、前記第Ｍパラメータの書き込みを、前記待機系マクロブロックの第Ｍセグメントの先頭アドレスから行うステップ（Ｓ２１）を含む。
【００６３】
その後、前記第Ｍパラメータ以外のパラメータについて、それぞれ最新の値を前記現用系マクロブロックから読み出し、前記待機系マクロブロックにおける対応するセグメントに書き込むステップ（Ｓ２４〜Ｓ２５）を含む。
【００６４】
その後、前記現用系マクロブロックの全ての領域のデータを消去するステップ（Ｓ２７）を含む。
【００６５】
その後、前記待機系マクロブロックを新たに現用系マクロブロックとし、前記現用系マクロブロックを新たに待機系マクロブロックとするステップを含む。
【００６６】
これにより、１次マクロブロックと２次マクロブロックを、現用系と予備系として交互に交替させて使用することができる。
【００６７】
〔１４〕＜ヘッダにセグメントＩＤを含む＞
項１１において、前記ヘッダ情報は、前記第Ｍパラメータが書き込まれるセグメントのセグメント識別情報（１３）をさらに含む。
【００６８】
これにより、読み出されたデータに含まれるヘッダ情報から、パラメータ種別を判別することができる。
【００６９】
〔１５〕＜セグメントＩＤと配列名を対応付ける変換テーブル＞
項１４において、前記セグメント識別情報とアプリケーションプログラム（９１）が使用する配列名とを対応付ける変換テーブル（７）を、前記フラッシュメモリ内に保持するステップを含む。
【００７０】
これにより、アプリケーションプログラムからは、配列名によってアクセスすることができ、高級言語で記述されたアプリケーションプログラムからも、データ格納用フラッシュメモリ上のデータを扱うことができる。
【００７１】
〔１６〕＜変換テーブルにおけるセグメントＩＤと配列名の対応関係の更新＞
項１５において、前記変換テーブルに、同じ前記セグメント識別情報に対して複数回の前記配列名の対応付けが許され、偶数回の対応付けにより当該セグメント識別情報に対する配列名の対応付けを無効とし、次の奇数回目の当該セグメント識別情報に対する配列名の対応付けを有効とするステップを含む。
【００７２】
これにより、セグメントＩＤに対応付けられる配列名を、変更可能とすることができる。
【００７３】
２．実施の形態の詳細
実施の形態について更に詳述する。
【００７４】
〔実施形態１〕＜パラメータとセグメントの１：１関連付け＞
図４は、本実施形態１に係るデータ格納用フラッシュメモリ（データフラッシュ）１が適用されたシステム７０の構成例を表す説明図である。システム７０は、ロボットや工作機械等の産業機器７１や携帯電話やサーバー等の通信機器７２を、ＵＳＢ、Ethernet（登録商標）、その他シリアル通信等の通信手段を介して制御するマイコン８０を含んで構成される。マイコン８０は、メモリ８３、データフラッシュ１、CPUコア８１、I/O８２を含んで構成される。メモリ８３には、産業機器７１や通信機器７２を制御するプログラム９０が格納される。データフラッシュ１には、それらの制御のための、指令値、状態値、及び、それらの計算の基となる制御パラメータである、回転数、角度、位置など、さらに、TCP/IPやUSB通信等での通信相手のIPアドレスやベンダID等の通信パラメータが格納される。CPUコア８１はメモリ８３から読み出したプログラム９０を実行する。そして、データフラッシュ１から読み出したパラメータ５を基に、制御演算や通信処理を実行する。I/O８２はCPUコア８１の制御によりデータ入出力処理をし、産業機器７１や通信機器７２を制御する。
【００７５】
特に制限されないが、マイコン８０は、例えば、公知のＣＭＯＳ（Complementary Metal-Oxide-Semiconductor field effect transistor）ＬＳＩ（Large Scale Integrated circuit）の製造技術を用いて、シリコンなどの単一半導体基板上に形成される。データフラッシュ１は、CPUコア８１と同じ半導体基板上に形成されたフラッシュメモリで、ブロックと呼ばれる一括消去の単位となる領域を複数備えて構成される。フラッシュメモリは、ブロックよりも小さな書き込み単位と読み出し単位を有する。メモリ８３は、SRAM（Static Random Access Memory）やフラッシュメモリ等の不揮発性メモリ、またはそれらの組み合わせなどで構成される。CPUコア８１と、メモリ８３、データフラッシュ１、I/O８２等を全て同じ単一の半導体基板上に形成してもよい。１個のフラッシュメモリを設けて、一部をメモリ８３として使用し、別の一部をデータフラッシュ１として使用しても良い。一方、データフラッシュ１を独立したフラッシュメモリによって構成することにより、アクセスの独立性が保たれ調停が不要となる。CPUコア８１とメモリ８３とデータフラッシュ１とI/O８２とは、特に制限されないが、例えば、バスを介して互いに接続される。バスは、階層化されていてもよい。また、CPUコア８１は複数のCPUコアによるマルチプロセッサであってもよい。「CPU」はプロセッサを代表するものに過ぎず、他のプロセッサ、MPU（Micro Processing Unit）、PE（Processor Element）、DSP（Digital Signal Processor）等であってもよい。
【００７６】
図５は、システム７０におけるソフトウェア（プログラム）９０とデータフラッシュ１の構成例を表す説明図である。データフラッシュ１は、特に制限されないが一例として、容量が３２Ｋバイトで、消去単位が８Ｋバイト、書き込み単位が８バイトまたは１２８バイト、読み出し単位は任意であり、消去単位である８Ｋバイトのブロック３を４個備えて構成されるものとして説明する。ソフトウェア９０は、アプリケーション９１、データ管理ドライバ９２、アクセスドライバ９３から構成される。アプリケーション９１は、データ管理ドライバ９２から取得したパラメータを基に、CPUコア８１に制御演算や通信処理をさせる。データ管理ドライバ９２は、データフラッシュ１上のデータ管理を実行する。アクセスドライバ９３は、データ管理ドライバ９２の要求に従い、データフラッシュ１上のデータ書き込み、読み出し、及び、消去を行う。データ管理ドライバ９２には、本実施形態が適用されることにより、データサイズの可変長化に対応し、書き込み均等化による検索の効率が向上する（検索が高速化される）。
【００７７】
図１は、データフラッシュ１上のデータ構成を表す説明図である。
【００７８】
データフラッシュ１の容量が３２Ｋバイトである場合を一例として、本実施形態でのデータフラッシュ１上のデータ構成を説明する。
【００７９】
データフラッシュ１は消去単位である８Ｋバイトのブロック４個（３＿１〜３＿４）で構成される。この４個のブロックを２個ずつの１次マクロブロック２＿１と２次マクロブロック２＿２に分割する。そして、１次マクロブロック２＿１を、複数のセグメント４に分割する。分割数は、データフラッシュ１に格納されるパラメータ５の種別数（個数）以上とし、２のべき乗数であるのが好ましい。この例では、分割数は、1, 2, 4, 8, 16, 32（= 20, 21, 22, 23, 24, 25）のいずれかとする。また、２次マクロブロック２＿２も１次マクロブロック２＿１と同じ分割数で分割する。図１は、１次マクロブロック２＿１として先頭から２ブロック（ブロック(1)とブロック(2)）（３＿１と３＿２）、残りを２次マクロブロック２＿２（ブロック(3)とブロック(4)）（３＿３と３＿４）、分割数を16とした例である。１次マクロブロック２＿１のセグメント４は16個（セグメント(0)〜セグメント(15)）、２次マクロブロック２＿２のセグメント４は16個（セグメント(0')〜セグメント(15')）となる。
【００８０】
各セグメントの先頭からレコード６を書き込む。レコード６には、ユーザがデータフラッシュ１に書き込みたいパラメータ５が含まれている。どのセグメント４にどのレコード６、即ちどのパラメータ５を書き込むかは、例えば識別番号IDで関連付けることとする。例えば、パラメータ(0,t(x))、パラメータ(1,t(x))、パラメータ(2,t(x))、…からそれぞれレコード(0,x)、レコード(1,x)、レコード(2,x)、…が構成され、セグメント(0)、セグメント(1)、セグメント(2)、…にそれぞれ関連付けられる。ここで、パラメータ(i,t(x))は、第ｉパラメータの時刻t(x)における更新値である。第ｉパラメータは、識別番号ｉ（ID= i）のパラメータであり、時間と共に変化するものとする。ここで、「時間と共に変化する」とは、物理的に時間依存性があることに限定されるものではなく、広く何らかの原因で変化することを指すものである。変化したときには必ずデータフラッシュ１に書き込まれる必要があるとは限らない。パラメータ(i,t(x))は、x回目にデータフラッシュ１に書き込まれた第ｉパラメータの、時刻t(x)における値を表す。パラメータ(i,t(1)), パラメータ(i,t(2)), パラメータ(i,t(3)), …は、データフラッシュ１に書き込まれる度に、対応するレコード(i,1), レコード(i,2), レコード(i,3), …が作られ、対応するセグメント(i)の先頭アドレスから順に書き込まれる。最後に書き込まれた値が最新値であり、当該セグメント内で最後に書き込まれたレコードの次のアドレス以降は、ブランク領域（未使用領域）である。図１には、１次マクロブロック２＿１が現用系とされ、２次マクロブロック２＿２が待機系とされている時点でのレコードの書き込み状態が例示されている。セグメント(0)にレコード(0,1)、レコード(0,2)、レコード(0,3)が書き込まれ、セグメント(1)にレコード(1,1)が書き込まれ、セグメント(6)にレコード(6,1)、レコード(6,2)が書き込まれている。各セグメント内のレコードのサイズは可変長である。
【００８１】
図２は、データフラッシュ１上のレコード６の構成を表す説明図である。（ａ）には、パラメータとセグメント内の書き込み領域の関係が示される。第６パラメータの更新回ごとの更新値である、パラメータ(6,t(1))、パラメータ(6,t(2))、…パラメータ(6,t(N))がセグメント(6)に書き込まれるとき、それぞれの更新値に対応してレコード(6,1)、レコード(6,2)、…レコード(6,N)が構成され、セグメント(6)の先頭アドレスから順に書き込まれる。（ｂ）にはレコードの構成が示される。レコード６はデータ領域９とヘッダ領域１０とで構成される。データ領域９は、パラメータ(6,t(N))そのものであって可変長である。ヘッダ領域１０は、例えば４バイトで構成される。（ｃ）にはヘッダの構成例が示される。ヘッダは、Ｃｏｎ（Concatenation）フィールド１１と、rsv1（reserved）フィールド１２と、ＩＤ（Identification）フィールド１３と、rsv2フィールド１４と、ＤｉｖＰ（Divided power）フィールド１５と、オフセット（Offset）フィールド１６から構成される。
【００８２】
図３は、ヘッダの構成をより詳細に表す説明図である。ヘッダの内容がビッグエンディアン形式で示される。
【００８３】
ビット31とビット30はＣｏｎフィールド１１である。パラメータが１個のレコードに収まっているか、以降のレコードに続いているかを示す領域で、b'01であれば連結なし、即ち１個のレコードに収まっていることを示し、b'10であれば連結あり、即ち以降のレコードに続いていることを示し、b'00とb'11は無効とされる。
【００８４】
ビット28〜ビット24はＩＤフィールド１３である。格納先セグメントのIDを示す領域である。ここで、セグメントは最大32個なので0〜31の値をとる。
【００８５】
ビット19〜ビット16はＤｉｖＰフィールド１５である。分割数を２のべき乗で表したときの指数を示す領域である。ここで、分割数は1, 2, 4, 8, 16, 32なので0〜5の値をとる。
【００８６】
ビット15〜ビット0はオフセット（Offset）フィールド１６である。次のレコードまでのオフセットアドレスを示す。オフセットアドレスは最小書き込み単位（最小値）からセグメントサイズから最小書き込み単位を減じた値（最大値）の範囲を取り得る。ここで、最小書き込み単位が８バイト、分割数が2の場合のセグメントサイズが最大で、H'0008〜H'3FF8の値をとる。
【００８７】
ビット29、及びビット23〜ビット20は予約領域、rsv1フィールド１２とrsv2フィールド１４である。
【００８８】
＜書き込み動作＞
データ管理ドライバ９２のデータフラッシュ１へのパラメータ５の書き込み動作について、より詳細に説明する。
【００８９】
図６と図７は、パラメータ５のデータフラッシュへの書き込み動作を表すフローチャートである。図６に前半、図７に後半を示す。
【００９０】
データフラッシュ１は、容量が３２Ｋバイトで、１６Ｋバイトずつの１次マクロブロックと２次マクロブロックに分けられ、書き込まれるパラメータが１１種であることを前提とする。１次マクロブロックと２次マクロブロックがそれぞれ１６セグメントに分割されている（分割数が１６）場合で、Ｍ番目のパラメータ（パラメータ(M,t(N))）を書き込むケースを例に採って説明する。レコードやヘッダのデータ構造は、図２、３に例示したものと同様として説明する。
【００９１】
１次マクロブロックの先頭であるセグメント(0)の先頭８バイトを読み出して、ブランクチェックする（Ｓ１）。ここで、ブランクチェックとは、読み出された領域がブランク領域、即ち、消去された後未だデータが書き込まれていない領域か否かを判定することである。一般には、データフラッシュにはブランクチェック機能が付加されており、アクセスドライバ９３がブランクチェック機能を使用しブランク領域を判定するが、フラッシュメモリによっては、以下のフラッシュメモリの仕様を利用することも考えられる。フラッシュメモリは、その仕様により、消去された状態がall 0またはall 1になっている。消去された状態がall 0の場合、0以外が書き込まれていればブランク領域ではないと判断され、消去された状態がall 1の場合、1以外が書き込まれていればブランク領域ではないと判断される。例えば、セグメント(0)に既にレコードが書き込まれている場合、先頭８バイトのうちの４バイトはヘッダ情報であり、そのビット31〜30はＣｏｎフィールド１１である。Ｃｏｎフィールド１１においてb'00とb'11は無効とされているので、レコードが書き込まれていれば、b'00とb'11以外の値をとるから、b'00またはb'11であればブランク領域であると判断することができる。同様に、読み出した８バイトの全てのビットをチェックしてもよい。また、先頭８バイトとしたのは一例であって、何バイトでも良い。例えば、ヘッダ領域である４バイトを読み出して、ブランクチェックをしても良いし、Ｃｏｎフィールド１１を含む先頭の１バイトのみを読み出して、ブランクチェックをしても良い。
【００９２】
Ｓ１のブランクチェック結果を判定する（Ｓ２）。Ｓ２の結果、セグメント(0)の先頭８バイトがブランク領域であれば、その時点では１次マクロブロックが待機系であり、現用系の２次マクロブロックが書き込み対象のマクロブロックであることがわかるので、２次マクロブロックへの書き込み動作を行う（Ｓ３）。その後の２次マクロブロックへの書き込み動作は、Ｓ４以下に示される、１次マクロブロックが現用系である場合の書き込み動作と同様であるので、以降の説明は省略する。
【００９３】
Ｓ２の結果、セグメント(0)の先頭８バイトがブランク領域でなければ、その時点では１次マクロブロックが現用系である。１次マクロブロックのセグメント(0)の先頭レコードであるレコード(0,1)のヘッダを読み出す（Ｓ４）。Ｓ４で読み出したレコード(0,1)のヘッダのＤｉｖＰフィールド１５からマクロブロックの分割数がわかるので、それを基にセグメント(M)の先頭アドレスを計算し、セグメント(M)の先頭８バイトをブランクチェックする（Ｓ５）。その結果に基づいて、セグメント(M)がブランク領域か否かを判定する（Ｓ６）。ブランク領域であれば、パラメータ(M,t(N))をレコード(M,0)に書き込み終了する（Ｓ７）。これは、初期値の書き込みとなる。
【００９４】
Ｓ６の結果、セグメント(M)がブランク領域でなければ、カウンタＮを０に初期化する（Ｓ８）。このとき、カウンタＮは、空きのレコード番号を判定するために利用されるカウンタである。次に、セグメント(M)からレコード(M,N)のヘッダを読み出す（Ｓ９）。Ｓ９で読み出したレコード(M,N)のヘッダからオフセットアドレスを取得する（Ｓ１０）。Ｓ１０で取得したオフセットアドレスから８バイト分をブランクチェックし（Ｓ１１）、セグメント(M)におけるレコード(M,N)に続く領域がブランク領域か否かを判定する（Ｓ１２）。Ｓ１２で当該領域がブランク領域と判定されれば、パラメータ(M,t(N))がセグメント(M)の範囲内で書き込めるかを判定する（Ｓ１３）。Ｓ１３でセグメント(M)の範囲内であれば、パラメータ(M,t(N)) をレコード(M,N+1)に書き込み（Ｓ１４）、書き込み動作を終了する。これは、連結なしの書き込みとなる。Ｓ１２で当該領域がブランク領域でないと判定された場合、セグメント(M)の空きレコード番号を判定するカウンタＮを１増やし（Ｓ１５）、Ｓ９に戻る。
【００９５】
以上、説明したように、マクロブロックの先頭に書き込まれたレコードのヘッダに含まれるＤｉｖＰフィールド１５を読み出すことによって、マクロブロックの分割数がわかる。パラメータとセグメントは、１：１に対応付けられているので、書き込むパラメータのＩＤから、書き込むべきセグメントが一意に決まる。書き込みが可能なブランク領域（未使用領域）の探索は、そのセグメントの中で、ヘッダに含まれるオフセットのみを先頭から順番に辿れば済むので、探索ステップを最小限に抑えることができる。これにより、短い探索時間（探索ステップ）により、ブランク領域を発見して、そこに書き込むことができる。
【００９６】
Ｓ１３でブランク領域がセグメント(M)の範囲内でなければ、セグメント(M)以外への書き込み動作となる。以降のフローは図７に示される。
【００９７】
カウンタＬをM+1に初期化する（Ｓ１６）。このとき、カウンタＬは、空きのセグメント番号を判定するために使用される。１次マクロブロックに未使用のセグメントがあるか判定する（Ｓ１７）。判定はセグメント番号（Ｌ）が分割数(=16)より小さいかで行う。
【００９８】
Ｓ１７で、１次マクロブロックに未使用セグメントがあると判定されれば、セグメント(L)の先頭８バイトをブランクチェックする（Ｓ１８）。セグメント(L)がブランク領域か否かを判定する（Ｓ１９）。ブランク領域でなければ、Ｓ１６に戻る。セグメント(L)がブランク領域であれば、パラメータ(M,t(N))の前半をセグメント(M)に書き込み、パラメータ(M,t(N))の後半をセグメント(L)に書き込み（Ｓ２０）、書き込み動作を終了する。これは、連結ありの書き込みとなる。
【００９９】
これにより、対応するセグメントに空きがなくなったときに、未使用のセグメント（ブランクセグメント）を探索して新たな書き込み対象セグメントとして活用することができる。また、さらに次の第Ｍパラメータの書き込みの際に、どのセグメントが新たな書き込み対象セグメントとして選択されたかは、第Ｍセグメントに最後に書き込まれたデータのヘッダ情報のオフセットフィールドから簡単に算出される。
【０１００】
Ｓ１７で、現用系である１次マクロブロックに未使用のまま残っているセグメント（ブランクセグメント）がないと判定されたときは、パラメータ(M,t(N)) を待機系である２次マクロブロックの対応するセグメント(M')の先頭レコード(M',0)に書き込む（Ｓ２１）。Ｓ２１以降の動作は、ブロック消去の書き込みとなる。現用系のマクロブロックと待機系のマクロブロックを交替させる動作の一部を構成する。
【０１０１】
セグメント番号のカウンタＬを０に初期化する（Ｓ２２）。現用系のマクロブロックと待機系のマクロブロックを交替させる動作では、各パラメータについて、最新レコードのみを現用系から待機系に書き写す。このとき、カウンタＬは、最新レコードを検索して書き写す対象のセグメントのセグメント番号を指すポインタとして使用される。
【０１０２】
カウンタＬが指す対象セグメントがセグメント(M)であるかを判定する（Ｓ２３）。判定は、カウンタＬがセグメント番号Ｍと等しいか否かによって行う。判定の結果、カウンタＬが指す対象セグメントがセグメント(M)と等しければＳ２６に進む。Ｓ２３でカウンタＬが指す対象セグメントがセグメント(M)と異なれば、セグメント(L)の最新レコードを検索する（Ｓ２４）。検索は、ヘッダのオフセットアドレスに基づく次のレコード領域の先頭アドレスの算出と、その領域のブランクチェックにより行う。セグメント(L)の最新レコードを、２次マクロブロックの対応するセグメント(L')の先頭レコード(L',0)に書き込む（Ｓ２５）。最新レコードを検索して書き写す必要がある、残りのセグメントがあるか否かを判定する（Ｓ２６）。Ｓ２６の判定は、セグメント番号Ｌがマクロブロックの末尾のセグメント番号である１５であるか否かの判断によって行う。Ｓ２６で残りのセグメントがあると判断されれば、最新レコードを検索するセグメントを示すセグメント番号のカウンタＬを１増やし（Ｓ２８）、Ｓ２３に戻る。Ｓ２６で残りのセグメントがないと判断されれば、１次マクロブロックの全体を消去し（Ｓ２７）、書き込み動作を終了する。これ以降、１次マクロブロックは待機系となり、２次マクロブロックが現用系となる。
【０１０３】
これにより、１次マクロブロックと２次マクロブロックを、現用系と待機系として交互に交替させて使用することができる。
【０１０４】
＜書き込み動作の例＞
容量が３２Ｋバイト、パラメータが11種の場合の上記と同じ例を引用して、データフラッシュ１への書き込み動作の一例について、さらに詳しく説明する。
【０１０５】
図８は、パラメータのデータフラッシュへの書き込み動作（連結なし）を表す説明図であり、図９は、図８におけるレコード(M,N)の内容を示す説明図である。
【０１０６】
パラメータが11種なので、セグメント毎に異なる種類のパラメータを格納できるように、１次マクロブロックと２次マクロブロックはそれぞれ16分割されている。ブロック分割は初回の起動時にパラメータの種別数をユーザにアプリケーションから与えてもらい、分割数をパラメータ種別数以上で最小の値に決める。なお、パラメータ種別数が所定の数、例えば図１〜図３に例示される32より大きい場合、ユーザにパラメータ種別数が32個以下になるようにパラメータをまとめて管理してもらうこととする。
【０１０７】
Ｍ番目のパラメータの場合を例として、ヘッダの設定値を説明する。
【０１０８】
時刻t”(N)において、Ｍ番目のパラメータ（パラメータ(M,t”(N))）を更新し、レコード(M,N)をセグメント(M)に書き込んだ場合、ヘッダの設定値は、以下の値をとる。即ち、Conフィールドは連結なしのb'01であり、IDフィールドはセグメントIDのM、DivPフィールドは16分割を示す4、Offsetフィールドはパラメータ(M,t”(N))のサイズ+4(=ヘッダサイズ)+アライメント調整分となる。アライメント調整分とは、隣接する新旧レコードの境界が、アドレスの例えば８バイト毎の境界（８バイトアライメント）と一致するように調整するための量である。アライメントのサイズは、データフラッシュ１を構成するフラッシュメモリの書き込み単位に基づいて決める。書き込み単位が８バイトの場合は、８バイトの倍数をアライメントサイズとすることができるので、一般には書き込み単位と同じバイト数をアライメントサイズとするとよい。
【０１０９】
時刻t(1)における１番目のパラメータの値、パラメータ(0,t(1))にヘッダを付加してレコード(0,1)とし、レコード(0,1)をセグメント(0)の先頭アドレスに書き込む。消去された後、まだデータが書かれていない領域は、ブランク領域である。この時点でセグメント(0)は、レコード(0,1)が書き込まれた領域以降のアドレスの領域は、ブランク領域である。ここで、セグメント(0)がブランク領域であるか否かは、セグメント(0)の先頭8バイトにアクセスドライバ９３によってブランクチェックを行うことにより確認する。さらに、１番目のパラメータが時刻t(2)で更新され、そのパラメータ(0,t(2))を書き込む場合、パラメータ(0,t(2))からレコード(0,2)を生成して、セグメント(0)のレコード(0,1)が格納された領域の次のアドレスから書き込む。この書き込みアドレスは、レコード(0,1)のヘッダのOffsetフィールドの値を使って算出し、書き込みアドレスの先頭8バイトにアクセスドライバ９３によってブランクチェックを行うことにより、ブランク領域であることを確認した後に書き込みを行う。
【０１１０】
同様に２番目のパラメータが更新される毎に、セグメント(1)にレコードを書き込んで行く。パラメータ(1,t'(1))、パラメータ(1,t'(2))にそれぞれヘッダを付加して構成されるレコード(1,1)、レコード(1,2)を、セグメント(1)の先頭アドレスから順次書き込む。以降同様に３番目から11番目のパラメータも、それぞれ、セグメント(2)〜セグメント(11)の先頭アドレスから書き込んで行く。ここで、データ管理ドライバ９２はセグメント(1)〜セグメント(11)の先頭アドレスを、1番目のパラメータ書き込み時に取得した分割数Mから容易に計算することができる。また、セグメント(0)〜セグメント(11)がブランク領域であるかは、セグメント(0)〜セグメント(11)の先頭8バイトにアクセスドライバ９３によってブランクチェックを行うことにより確認する。
【０１１１】
この動作を継続したとき、セグメント内のブランク領域が、十分なサイズに満たない状態に至る場合がある。このような場合の動作について、次に説明する。
【０１１２】
図１０は、連結がある場合の、パラメータ５のデータフラッシュ１への書き込み動作を表す説明図であり、図１１は、図１０におけるレコード(M,N+1)とレコード(M,N+2)の内容を示す説明図である。
【０１１３】
例えば、時刻t(N+1)においてM+1番目のパラメータ（パラメータ(M,t(N+1))）が更新され、レコード(M,N+1)としてセグメント(M)に書き込もうとするが、セグメント(M)の残りのブランク領域がレコード(M,N+1)のサイズ＋８バイトより小さい場合である。この「＋８バイト」は、次のレコードのヘッダに書き込むために必要なサイズであり、ヘッダ領域は４バイトであるが、書き込み単位に合わせて８バイトアライメントであるため、最低８バイトが必要である。このような場合、レコード(M,N+1)を2分割し、前半はセグメント(M)の残りのブランク領域に書き込み、後半は、まず現用系である１次マクロブロックからセグメント全体がブランク領域となっているセグメント（以下、ブランクセグメント）を探し、最初のブランクセグメントに書き込む。
【０１１４】
図１０には、セグメント(13)まではブランクセグメントでなく、セグメント(14)がブランクセグメントである場合が示されている。また、全てのセグメントがブランクセグメントでない場合、即ちマクロブロック内にブランクセグメントが残っていない場合については、図１２と図１３を引用して後述する。
【０１１５】
図１１の上段に示されるように、レコード(M,N+1)のヘッダにおいて、Conフィールドは連結ありのb'10であり、IDフィールドはセグメントIDのM、DivPフィールドは16分割の4、Offsetフィールドはセグメント(14)の先頭アドレス+パラメータ(M,t(N+1))後半部分のサイズ+アライメント調整分となる。データ領域は、前半分と後半分に分けられる。セグメント(M)には上記ヘッダとデータの前半が書き込まれ、データの後半は、セグメント(14)の先頭アドレスから書き込まれる。Offsetフィールドは、セグメント(14)の先頭アドレスにパラメータ(M,t(N+1))後半部分のサイズが加算されているので、次のレコードを書き込むときに、その先頭アドレスを算出することができる。
【０１１６】
レコード(M,N+1)が書き込まれた後、時刻t(N+2)にM番目のパラメータ（パラメータ(M,t(N+2))）を更新する場合、レコード(M,N+2)のヘッダは、図１１の下段に示される通りとなる。即ち、Conフィールドは連結なしのb'01であり、IDフィールドはセグメントIDのM、DivPフィールドは16分割の4、Offsetフィールドはセグメント(14)の先頭アドレス+パラメータ(M,t(N+2))のサイズ+4(=ヘッダサイズ)+8バイトアライメント調整分となる。以降のM番目のパラメータ更新は、セグメント(14)に対して同様に行われる。
【０１１７】
この動作を継続したとき、現用系のマクロブロック内の全てのセグメントが、ブランクセグメントでない状態、即ちマクロブロック内にブランクセグメントが残っていない状態に至る場合がある。このような場合の動作について説明する。
【０１１８】
図１２は、パラメータのデータフラッシュ１への書き込みによりブロック消去が発生する場合の動作を表す説明図であり、図１３は、図１２におけるレコード(M,N+1)の内容を表す説明図である。また、図１４は、１次と２次マクロブロック間で現用系と待機系を交替する動作を表す説明図であり、図１５は、交替動作における最新レコードの転送動作を表す説明図である。
【０１１９】
図１２に示されるように、例えば、時刻t(N+1)において、M番目のパラメータ（パラメータ(M,t(N+1))）を更新し、レコード(M,N+1)としてセグメント(M)に書き込みを行おうとする場合である。このとき、セグメント(M)に残されたブランク領域が、レコード(M,N+1)のサイズ+8バイト（次レコードのヘッダ書き込みサイズ）より小さい場合、現用系である１次マクロブロックの中でブランクセグメントを探す。その結果、全てのセグメントがブランクセグメントでない状態、即ちマクロブロック内にブランクセグメントが残っていない状態に至った場合には、現用系と待機系を交替させる動作を行う。その動作について、以下、説明する。レコード(M,N+1)を、その時点における待機系である２次マクロブロックのセグメント(M')の先頭アドレスから書き込む。レコード(M,N+1)のヘッダは、図１３に示されるように、Conフィールドは連結なしのb'01であり、IDフィールドはセグメントIDのM、DivPフィールドは16分割の4、Offsetフィールドはセグメント(M')の先頭アドレス+パラメータ(M,t(N+1))のサイズ+8バイトアライメント調整分となる。レコード(M,N+1)の書き込みが完了した後、図１４と図１５に示されるように、１次マクロブロックのセグメント(M)以外の全ての各セグメント（セグメント(X)：XはMを除く0〜15）から最新レコード（レコード(X,Y)）のみを、１次マクロブロックのセグメント(X')の先頭アドレスから始まる領域に書き写す。その後、１次マクロブロックを構成するブロック(1)とブロック(2)を消去する。１次マクロブロックは、ブロック(1)とブロック(2)が消去されて待機系となり、現用系は２次マクロブロックに交替する。最新レコードの検索は、各セグメントの先頭から順にレコードのヘッダ領域を読出し、ブランク領域に到達したときに、最後に読み込まれたヘッダが含まれるレコードを最新と判断する方法によって行うことができる。詳しくは、図１６を引用して後述する、以下の読み出し動作と同様に、実現することができる。
【０１２０】
＜読み出し動作＞
図１６は、パラメータ５のデータフラッシュ１からの読み出し動作を表すフローチャートである。
【０１２１】
上述の書き込み動作と同様に、容量が３２Ｋバイト、パラメータが11種の場合の例を引用して、データフラッシュ１からの読み出し動作の一例として、M番目のパラメータ（パラメータ(M,t(N))）をレコード(M,N)から読み出す場合について説明する。
【０１２２】
まず、現用系である１次マクロブロックの先頭であるセグメント(0)の先頭8バイトを読み出して、ブランクチェックし（Ｓ３１）、その結果を判定する（Ｓ３２）。Ｓ３２の結果、セグメント(0)の先頭８バイトがブランク領域であれば、その時点での１次マクロブロックは待機系であり、現用系の２次マクロブロックが読み出し対象のマクロブロックであるので、２次マクロブロックからの読み出し動作を行う（Ｓ３３〜Ｓ３４）。その後の２次マクロブロックからの読み出し動作は、Ｓ３５以下に示される１次マクロブロックが現用系である場合の読み出し動作と同様であるので、以降の説明は省略する。
【０１２３】
Ｓ３２の結果、セグメント(0)の先頭８バイトがブランク領域でなければ、１次マクロブロックは現用系である。１次マクロブロックのセグメント(0)の先頭レコードであるレコード(0,1)のヘッダを読み出す（Ｓ３５）。Ｓ３５で読み出したレコード(0,1)のヘッダのＤｉｖＰフィールド１５からマクロブロックの分割数がわかるので、それを基にセグメント(M)の先頭アドレスを計算し、セグメント(M)の先頭8バイトをブランクチェックする（Ｓ３６）。その結果に基づいて、セグメント(M)がブランク領域か否かを判定する（Ｓ３７）。ブランク領域であればセグメント(M)には書き込み済みのデータは存在しないので、エラー終了する。
【０１２４】
Ｓ３７の結果、セグメント(M)がブランク領域でなければ、カウンタＮを１に初期化する（Ｓ３８）。このとき、カウンタＮは、最新のパラメータを格納したレコード番号を判定するために利用される。次に、セグメント(M)からレコード(M,N)のヘッダを読み出す（Ｓ３９）。        取得済みのレコード(M,N-1)のOffsetをPreOffsetとして保存する（Ｓ４０）。取得済みのレコードがない場合（N=1の場合）は、セグメント(M)の先頭アドレスをPreOffsetとして保存する。Ｓ３９で読み出したレコード(M,N)のヘッダからOffsetを取得する（Ｓ４１）。Ｓ４１で取得したOffsetから8バイト分をブランクチェックし（Ｓ４２）、セグメント(M)におけるレコード(M,N)に続く領域がブランク領域か否かを判定する（Ｓ４３）。Ｓ４３で当該領域がブランク領域と判定されれば、セグメント(M)にはレコード(M,N)以降に書き込まれたレコードは存在しないので、レコード(M,N)に格納されたパラメータ（パラメータ(M,t(N))）が最新のパラメータと判定される。そして、Ｓ４０で保存したPreOffsetによりレコード(M,N)を読み出し、M番目の最新のパラメータ（パラメータ(M,t(N))）を取得し（Ｓ４４）、読み出し動作を終了する。
【０１２５】
Ｓ４３で当該領域がブランク領域でないと判定された場合、セグメント(M)にはさらに新しいレコードが存在すると判断されるので、カウンタＮを１増やし（Ｓ４５）、Ｓ３９に戻る。
【０１２６】
以上、説明したように、マクロブロックの先頭に書き込まれたレコードのヘッダに含まれるＤｉｖＰフィールド１５を読み出すことによって、マクロブロックの分割数がわかる。パラメータとセグメントは、１：１に対応付けられているので、読み出すパラメータのＩＤから、アクセスすべきセグメントが一意に決まる。各パラメータの最新値の探索は、そのセグメントの中で、ヘッダに含まれるオフセットのみを先頭から順番に辿れば済むので、探索ステップを最小限に抑えることができる。これにより、短い探索時間（探索ステップ）により、パラメータの最新値を発見して読み出すことができる。
【０１２７】
〔実施形態２〕＜セグメントＩＤと配列名を対応付ける変換テーブル＞
一般にユーザは、データフラッシュ１に格納するパラメータを、Ｃ言語等の高級言語で使用する配列により管理する。そのため、アプリケーション９１は、データ管理ドライバ９２やアクセスドライバ９３に対して、配列名でのパラメータのアクセスを行う。実施形態１に示した例では、パラメータはＩＤによって管理されるので、配列名とパラメータを対応させるため、配列名とＩＤの変換テーブルを備えるとよい。
【０１２８】
本実施形態では、データフラッシュ１に含まれるセグメントの１つを、配列名とパラメータＩＤとの変換テーブル領域として割り付ける。
【０１２９】
図１７は、実施形態２に係るデータフラッシュ１上の変換テーブル７の構成例を表す説明図である。
【０１３０】
実施形態１に例示したデータ構成において、セグメント(15)をレコード格納領域に代え、配列名をIDに変換する変換テーブル７を置く変換テーブル格納領域として使用する。１次マクロブロックのセグメント(15)と２次マクロブロックのセグメント(15')が、変換テーブル格納領域として使用される。アプリケーション９１は配列（XXX, YYY, … ZZZ）を使って記述されており、データ管理ドライバ９２にして配列名（XXX, YYY, … ZZZ）を使ってアクセスを行う。変換テーブル７には、配列名（XXX, YYY, … ZZZ）とパラメータＩＤが対応付けられている。実施形態１で説明したように、パラメータＩＤはデータフラッシュ１のセグメントに対応付けられているので、変換テーブル７を介して各配列名がセグメントに対応付けられる。特に制限されないが、例えば、変換テーブル７には、書き込み単位の１２８バイト毎に、１２０バイトの配列名と８バイトのＩＤが互いに対応付けられて格納される。
【０１３１】
アプリケーション９１が配列名によってパラメータの書き込みを要求した時、データ管理ドライバ９２は、変換テーブル７を参照し、アプリケーション９１から入力された配列名が登録済みであれば、対応するパラメータＩＤを求め、対応するセグメントにパラメータを書き込む。アプリケーション９１から入力された配列名が変換テーブル７に登録されていなければ、その配列名と新規のＩＤを変換テーブル７に登録する。セグメントに未使用領域がなくなり、マクロブロックを交替させる場合は、最新レコードの場合と同様に、変換テーブル７を待機系の２次マクロブロックのセグメント(15')に書き込み、その後、セグメント(15)を含む現用系の１次マクロブロックを消去する。
【０１３２】
アプリケーション９１が配列名によってパラメータの読み出しを要求した時、変換テーブル７を参照し、アプリケーション９１から入力された配列名が登録済みであれば、対応するパラメータＩＤを求め、対応するセグメントからパラメータを読み出す。
【０１３３】
これにより、レコードを格納するために使用することができるセグメント領域は１セグメント減るが、ユーザがアプリケーション９１から配列名でアクセスすることが可能になる。
【０１３４】
書き込み動作と読み出し動作について、さらに詳しく説明する。
【０１３５】
図１８は、データフラッシュ１への書き込み動作を表すフローチャートである。
【０１３６】
アプリケーション９１から入力された配列名が変換テーブルにあるか検索する（Ｓ５１）。Ｓ５１の検索結果を判定する（Ｓ５２）。
【０１３７】
登録済みの場合、変換テーブル７を参照することにより配列名に対応するＩＤを取得する（Ｓ５３）。取得したＩＤにより、実施形態１と同様の書き込み動作を行って（Ｓ５７）終了する。
【０１３８】
未登録の場合、変換テーブル７に空きがあるかを判定する（Ｓ５４）。マクロブロックの分割数よりＩＤの登録数が大きければ空きがないと判定し、マクロブロックの分割数よりＩＤの登録数以下であれば空きがあると判定する。そして、空きがない場合はエラー終了する。
【０１３９】
Ｓ５４で空きがある場合、配列名を空いている最小のＩＤと関連付けて変換テーブル７に登録する（Ｓ５５）。Ｓ５５で登録したＩＤを参照する（Ｓ５６）ことで、実施形態１と同様の書き込み動作を行って（Ｓ５８）終了する。
【０１４０】
図１９は、データフラッシュ１からの読み出し動作を表すフローチャートである。
【０１４１】
アプリケーション９１から入力された配列名が変換テーブル７にあるか検索する（Ｓ６１）。Ｓ６１の検索結果を判定する（Ｓ６２）。未登録の場合はエラー終了する。
【０１４２】
Ｓ６２で登録済みの場合、変換テーブル７を参照することにより配列名に対応するＩＤを取得する（Ｓ６３）。取得したＩＤにより、実施形態１と同様の読み出し動作を行う（Ｓ６６）。読み出し完了後、変換テーブル７を再度参照しＩＤを配列名に変換する（Ｓ６４）。Ｓ６４で変換した配列名と読み出したパラメータをアプリケーション９１に返して（Ｓ６５）終了する。
【０１４３】
以上のように、ユーザはアプリケーション９１から配列名でデータフラッシュ１にアクセスすることが可能になる。そのため、ユーザはアプリケーション９１で使用する配列名をそのまま使用できるので、パラメータの管理がより容易になる。また、複数のアプリケーションで使用する場合、アプリケーションでのＩＤ管理が容易になる。
【０１４４】
〔実施形態３〕＜変換テーブルにおけるセグメントＩＤと配列名の対応関係の更新＞
実施形態２においてさらに、配列の更新を可能にする例を実施形態３として説明する。実施形態２の変換テーブル領域をセグメント数より大きい領域に拡張する。
【０１４５】
図２０は、実施形態３に係るデータフラッシュ１上の変換テーブル７の構成を表す説明図である。
【０１４６】
アプリケーション９１は、登録済みの配列名を無効にする要求を、データ管理ドライバ９２に要求する。例えば、アプリケーション９１は無効にしたい配列名を引数とした関数呼び出しにより、データ管理ドライバ９２に対して、その配列名を無効にすることを要求することができる。データ管理ドライバ９２は、登録済みの配列名を無効にする要求をアプリケーション９１から受信したら、変換テーブル領域７の最後の領域に、無効にすべき登録済みの配列名と対応するＩＤを書き込む。
【０１４７】
データ管理ドライバ９２は、配列名が指定されたデータフラッシュ１のアクセスにおいて、変換テーブル７を参照し、アプリケーション９１から入力された配列名が変換テーブル７に登録済みであるかどうかを検索する。変換テーブル７が格納されているセグメント(15)（又は２次マクロブロックが現用系の時はセグメント(15')）を、先頭から順番にアクセスして、ユーザが入力した配列名を探索する。変換テーブル７において、書き込み単位の１２８バイト毎に、１２０バイトの配列名と８バイトのＩＤが互いに対応付けて格納されているとすると、データ管理ドライバ９２は、１２８バイト毎に読み出してユーザが入力した配列名かどうかを判定する。このとき、データ管理ドライバ９２は、アプリケーション９１から入力された配列名を発見しても探索を終了せず、１２８バイト毎のブランクチェックを継続しながら、変換テーブル領域の最後まで検索する。同じ配列名が偶数回存在する場合、その配列名と関連付けられたＩＤは無効とし、その後、他の配列名をそのＩＤと関連付けて使用することができるようにする。
【０１４８】
図２０に示される例では、当初、配列名XXX, YYY, …ZZZがパラメータ(0), パラメータ(1), …パラメータ(14)に対応付けられ、変換テーブル７の先頭アドレスから１２８バイト毎に順次、配列名XXXとＩＤ「0」、配列名YYYとＩＤ「1」、…配列名ZZZとＩＤ「14」が格納されている。アプリケーション９１から配列名XXXを無効にする要求を受信すると、データ管理ドライバ９２は、変換テーブル７の末尾の１２８バイトに、配列名XXXとＩＤ「0」を追記する。これにより、配列名XXXは変換テーブル７の中に２回存在することとなり、無効化され、その結果ＩＤ「0」が他の配列名に対応付けられて使用されることが可能となる。その後、アプリケーション９１において、配列名X'X'X'を引数とする関数func_M(X'X'X')が呼び出されたときに、データ管理ドライバ９２は、変換テーブル７の末尾の１２８バイトに、配列名X'X'X'とＩＤ「0」を追記する。これにより、先の無効化によって使用可能となっているＩＤ「0」に配列名X'X'X'を対応付けることができる。
【０１４９】
また、一旦無効にした配列名を再度有効にすることもできる。アプリケーション９１は再度配列名を有効にする要求をデータ管理ドライバ９２に関数呼び出しにより要求する。データ管理ドライバ９２は、無効にした配列名を再度有効にする要求をアプリケーション９１から受信したら、空いている、または無効なＩＤを検索し、変換テーブル領域の最後の領域にその配列名と検索したＩＤを書き込む。そして、データ管理ドライバ９２は同じ配列名が変換テーブル７の中に３度存在する場合、その配列名と関連付けられたＩＤを再度有効なものと判断する。同様にデータ管理ドライバ９２は変換テーブル７に奇数回存在する配列名とＩＤは有効なものとし、偶数回存在する配列名とＩＤは無効であると判断する。
【０１５０】
上記により、データフラッシュ１で管理するデータのＩＤと関連付けられた配列名を更新することができ、その結果、同一セグメントでのパラメータ内容の変更も可能になる。
【０１５１】
以上本発明者によってなされた発明を実施形態に基づいて具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲において種々変更可能であることは言うまでもない。
【０１５２】
例えば、１次マクロブロックと２次マクロブロックは、大規模なフラッシュメモリの一部の領域として実装されてもよく、または、別々の不揮発性メモリチップを使って実装されてもよい。
【符号の説明】
【０１５３】
１  フラッシュメモリ
２  マクロブロック
３  ブロック（消去単位）
４  セグメント
５  パラメータ
６  レコード
７  変換テーブル
８  配列名
９  データ領域
１０  ヘッダ領域、ヘッダ情報
１１  Ｃｏｎ（Concatenation）フィールド
１２、１４  リザーブド（rsv: reserved）フィールド
１３  ＩＤ（Identification）フィールド、セグメント識別情報
１５  ＤｉｖＰ（Divided power）フィールド、分割（セグメント）数
１６  オフセット（Offset）フィールド、アドレスオフセット情報
７０  システム
７１  産業機器
７２  通信機器
８０  マイコン
８１  ＣＰＵコア
８２  Ｉ／Ｏ
８３  メモリ
９０  プログラム（ソフトウェア）
９１  アプリケーション
９２  データ管理ドライバ
９３  アクセスドライバ
【図１】
2015082166.tif 000003
【図２】
2015082166.tif 000004
【図３】
2015082166.tif 000005
【図４】
2015082166.tif 000006
【図５】
2015082166.tif 000007
【図６】
2015082166.tif 000008
【図７】
2015082166.tif 000009
【図８】
2015082166.tif 000010
【図９】
2015082166.tif 000011
【図１０】
2015082166.tif 000012
【図１１】
2015082166.tif 000013
【図１２】
2015082166.tif 000014
【図１３】
2015082166.tif 000015
【図１４】
2015082166.tif 000016
【図１５】
2015082166.tif 000017
【図１６】
2015082166.tif 000018
【図１７】
2015082166.tif 000019
【図１８】
2015082166.tif 000020
【図１９】
2015082166.tif 000021
【図２０】
2015082166.tif 000022