(57)【特許請求の範囲】
【請求項１】
記憶領域を複数のブロックに分け、それぞれのデータサイズの合計が前記ブロックの書き込み可能容量以下で且つＩＤを有していない２種類のデータグループを前記ブロックの空き領域に複数回書き込む時に、既に書き込まれた前記データグループを保持したまま最新の前記データグループを書き足すようにし、一方の前記データグループを前記ブロックの先頭セルから順に書き込み、他方の前記データグループを前記ブロックの後尾セルから順に書き込み、
３つの前記ブロックが一単位を構成し、前記一単位を構成する３つの前記ブロックの空き領域に２種類の前記データグループを複数回書き込むことにより、２種類の前記データグループの最新の前記データグループの両方が存在し且つ新たな前記データグループの書き込み可能な空き領域がない１つの前記ブロックが現れたとき、残り２つの前記ブロックのそれまでのデータの消去回数と残り２つの前記ブロックに新たな前記データグループを書き込み可能な空き領域があるか否かを確認し、残り２つの前記ブロックのいずれにも新たな前記データグループを書き込み可能な空き領域がないときは、それまでのデータの消去回数が少ない前記ブロック内のデータを消去してから当該ブロックに新たな前記データグループを書き込むフラッシュメモリへのデータ書き込み方法。
【請求項２】
３つの前記ブロックの空き領域に２種類の前記データグループを複数回書き込むことにより２種類の前記データグループのいずれの最新の前記データグループも存在しない前記ブロックが現れたとき、当該ブロック内のデータを全て消去する請求項１に記載のフラッシュメモリへのデータ書き込み方法。
【請求項３】
前記データグループのデータ列の先頭には、書き込まれたデータグループが正しいか否かの誤り検出をするためのチェックデータが配置されている請求項１又は２に記載のフラッシュメモリへのデータ書き込み方法。
【請求項４】
前記データグループには、前記データグループの更新回数を示す更新回数データが含まれている請求項１乃至３のいずれか一項に記載のフラッシュメモリへのデータ書き込み方法。
【請求項５】
１つの前記ブロックに書き込まれた２種類の前記データグループの間には、前記データグループ間の境界を示す境界セルが存在する請求項１乃至４のいずれか一項に記載のフラッシュメモリへのデータ書き込み方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、書き換え可能な不揮発性メモリの一種であるフラッシュメモリへのデータ書き込み方法に関する。
【背景技術】
【０００２】
近年、装置や機器の動作を統括管理するコントローラには、動作の際に必要となる各種データを記憶する必要性が増大していることから、種々のメモリが搭載されている。その一つとして各種データを電気的に書き込み及び消去が可能な不揮発性メモリであるフラッシュメモリがある。
【０００３】
フラッシュメモリの記憶領域で、一度データの書き込みが完了した領域にはそのままでは再度の書き込み（上書き）ができず、書き込みを行う領域のデータを先に消去する必要がある。ただし、データの消去も１バイト単位では行うことができない。フラッシュメモリは、全体の記憶領域が例えば３２バイトや６４バイト単位の複数のブロック（例えば１２８ブロック）で構成されており、データの消去はブロック単位でのみ可能である。データの書き込み及び消去回数には個別製品による上限がある。
【０００４】
特許文献１には、フラッシュメモリに書き込まれたデータを検索する時間を短縮できる発明が開示されている。この発明では、複数のデータを識別するデータＩＤにブロック領域のアドレス情報が対応付けられたテーブルを持ち、さらに１ブロックの領域を各々のデータＩＤごとに区分している。その結果、各データを書き込める領域が小さくなり検索時間を短縮できる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−１４０３４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１の発明では、各々のデータはそのデータ列内に識別のためのデータＩＤを有している。データＩＤの分だけデータサイズが大きくなるため１つのブロック内に書き込むことができるデータの個数が少なくなってしまう。その結果１つのブロック内の記憶領域を有効に活用できないという問題があった。
【０００７】
特許文献１の発明では、当該ブロックのいずれかのデータ領域に書き込み可能な領域がなくなると、各々の既存の最新データを一旦ＲＡＭに転記し、当該ブロックを初期化する。その後ＲＡＭから他のブロックに既存の最新データを再転記する。しかし、データを転記する際にはデータの一部が破損・欠落してしまうおそれがあり、転記を２回行うとその可能性は高まる。データが正常に転記されなかったときには、最新データが喪失してしまうという問題があった。同様に、当該ブロックの初期化後且つ他のブロックへの転記完了前に通電が切断されると、ＲＡＭ内のデータが消失するので、最新データが喪失してしまうという問題があった。
【０００８】
上記問題に鑑み、本発明は、ブロック内の記憶領域を有効に活用でき、最新データが喪失されるおそれがないフラッシュメモリへのデータ書き込み方法を提供することを課題とする。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、本発明に係るフラッシュメモリへのデータ書き込み方法の特徴は、記憶領域を複数のブロックに分け、それぞれのデータサイズの合計が前記ブロックの書き込み可能容量以下で且つＩＤを有していない２種類のデータグループを前記ブロックの空き領域に複数回書き込む時に、既に書き込まれた前記データグループを保持したまま最新の前記データグループを書き足すようにし、一方の前記データグループを前記ブロックの先頭セルから順に書き込み、他方の前記データグループを前記ブロックの後尾セルから順に書き込み、３つの前記ブロックが一単位を構成し、前記一単位を構成する３つの前記ブロックの空き領域に２種類の前記データグループを複数回書き込むことにより、２種類の前記データグループの最新の前記データグループの両方が存在し且つ新たな前記データグループの書き込み可能な空き領域がない１つの前記ブロックが現れたとき、残り２つの前記ブロックのそれまでのデータの消去回数と残り２つの前記ブロックに新たな前記データグループを書き込み可能な空き領域があるか否かを確認し、残り２つの前記ブロックのいずれにも新たな前記データグループを書き込み可能な空き領域がないときは、それまでのデータの消去回数が少ない前記ブロック内のデータを消去してから当該ブロックに新たな前記データグループを書き込む点にある。
【００１０】
このような特徴によれば、２種類のデータグループはそれぞれ先頭セルと後尾セルから順に書き込まれるので、ＩＤがなくても各々のデータグループを識別することができる。また、各々のデータグループのデータサイズがＩＤのサイズ分だけ小さくなるので、一つのブロック内の記憶領域を有効に活用できる。さらに、先頭セル、又は後尾セルから順に検索することにより、短時間で所望のデータグループ（例えば最新のデータグループ）を抽出することができる。
【００１１】
本発明に係るフラッシュメモリへのデータ書き込み方法においては、３つの前記ブロックの空き領域に２種類の前記データグループを複数回書き込むことにより２種類の前記データグループのいずれの最新の前記データグループも存在しない前記ブロックが現れたとき、当該ブロック内のデータを全て消去すると好適である。
【００１２】
本方法によれば、２種類のデータグループの最新のデータグループが存在しないブロックが現れた段階で、当該ブロック内のデータを全て消去する。従って、データグループを新たに書き込める領域がなくなるおそれがなく、既存の最新データグループの転記も行う必要がない。その結果、既存の最新のデータグループの一部が破損・欠落してしまうおそれがなく、最新のデータグループのデータを誤りなく維持することができる。また、最新データグループを新たに書き込んでいる最中に通電が切断されて最新データグループを正常に書き込むことができなくても、既存の最新のデータグループはデータを消去していないブロックに存在している。よって、最新のデータグループのデータを誤りなく維持することができる。
【００１３】
本発明に係るフラッシュメモリへのデータ書き込み方法においては、前記データグループのデータ列の先頭には、書き込まれたデータグループが正しいか否かの誤り検出をするためのチェックデータが配置されていると好適である。本方法によれば、書き込みの際は最初にチェックデータが書き込まれるので、データグループ書き込み後の誤り検出を確実に行うことができる。
【００１４】
本発明に係るフラッシュメモリへのデータ書き込み方法においては、前記データグループに、前記データグループの更新回数を示す更新回数データが含まれていると好適である。本方法によれば、同種のデータグループが複数回書き込まれているときに、いずれのデータグループが最新であるかを容易に判別することができる。
【００１５】
本発明に係るフラッシュメモリへのデータ書き込み方法においては、１つの前記ブロックに書き込まれた２種類の前記データグループの間には、前記データグループ間の境界を示す境界セルが存在すると好適である。本方法によれば、１つのブロックに２種類のデータグループが複数回書き込まれているときでも、それぞれのデータグループの境界を容易に把握することができる。
【図面の簡単な説明】
【００１６】
【図１】本発明の実施形態に係るフラッシュメモリを含むＥＣＵのソフトウェア構造を示す概略のブロック図
【図２】フラッシュメモリの構成を示す概念図
【図３】第１のデータグループがブロックに書き込まれるフロー
【図４】第２のデータグループがブロックに書き込まれるフロー
【図５ａ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｂ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｃ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｄ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｅ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｆ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｇ】データグループがブロックから消去された状態を示す概念図
【図５ｈ】データグループがブロックに書き込まれた状態を示す概念図
【図５ｉ】データグループがブロックから消去された状態を示す概念図
【図５ｊ】データグループがブロックに書き込まれた状態を示す概念図
【図６】データグループのブロックへの書き込みが正常に完了したかをチェックするフロー
【発明を実施するための形態】
【００１７】
以下、本発明の実施の形態について、図面に基づいて詳細に説明する。図１は、本発明の実施形態に係るフラッシュメモリ１を含むＥＣＵ（Electronic Control Unit）２のソフトウェア構造を示す概略のブロック図である。フラッシュメモリ１は、車両用のＥＣＵ２に搭載され、車両用センサ５から取得した検出データや設定値が書き込まれ、読み取られ、または消去される。フラッシュメモリ１への検出データや設定値の書き込み、読み取り、消去等の処理は、車両用センサ５を動作させるアプリケーションソフトウェア４から指令を受けたドライバ３により実行される。車両用センサ５の検出データや設定値は適宜更新されるので、直近に更新された最新データや最新設定値を誤りなく保持することがフラッシュメモリ１において重要である。
【００１８】
図２は、フラッシュメモリ１の構成を示す概念図である。フラッシュメモリ１はその内部の記憶領域が複数のブロックＢ０、ブロックＢ１、ブロックＢ２、・・・、ブロックＢｎに分けられている。ｎは２以上の整数である。これらのブロックがデータ消去の単位である。また、３つのブロックが一単位を構成する。例えばブロックＢ０、ブロックＢ１、ブロックＢ２で一単位、ブロックＢ３、ブロックＢ４、ブロックＢ５で一単位を構成する。本実施形態では、ブロックＢ０、ブロックＢ１、ブロックＢ２を用いて説明する。ブロックＢ０、ブロックＢ１、ブロックＢ２はいずれも３２バイトの書き込み可能容量を持っている。ただし、本発明に係るブロックの書き込み可能容量は３２バイトに限定されることはない。
【００１９】
ブロックＢ０、ブロックＢ１、ブロックＢ２の空き領域には第１のデータグループＤ１と第２のデータグループＤ２が複数回書き込まれる。第１のデータグループＤ１と第２のデータグループＤ２は新たな書き込みがなされても上書きされることなく、ブロックＢ０、ブロックＢ１、ブロックＢ２に空き領域がある限り既存の第１のデータグループＤ１と第２のデータグループＤ２を保持したまま新たな第１のデータグループＤ１と第２のデータグループＤ２が書き足される。すなわち、複数の第１のデータグループＤ１又は複数の第２のデータグループＤ２がブロックＢ０、ブロックＢ１、ブロックＢ２内に存在できる。
【００２０】
第１のデータグループＤ１、第２のデータグループＤ２とも、そのデータ構成の中に書き込み回数（更新回数）を示すデータが含まれている。書き込まれている第１のデータグループＤ１と第２のデータグループＤ２のそれぞれの書き込み回数のデータにより、いずれが最新の第１のデータグループＤ１と最新の第２のデータグループＤ２であるかが判別できる。第１のデータグループＤ１と第２のデータグループＤ２のデータ構成については後述する。
【００２１】
以下、複数回書き込まれた第１のデータグループＤ１及び第２のデータグループＤ２をそれぞれ区別して扱うときは、第１のデータグループＤ１１、第１のデータグループＤ１２、第１のデータグループＤ１３、第１のデータグループＤ１４、・・・、第２のデータグループＤ２１、第２のデータグループＤ２２、第２のデータグループＤ２３、・・・のように記載する。符号末尾の１、２、３、４、・・・はブロックＢ０、ブロックＢ１、ブロックＢ２に書き込まれた（更新された）回数を表す。第１のデータグループＤ１と第２のデータグループＤ２はアプリケーションソフトウェア４にて作成され、それらのデータサイズは更新されても一定である。
【００２２】
図２では、ブロックＢ０に第１のデータグループＤ１１と第２のデータグループＤ２１、第２のデータグループＤ２２が書き込まれていることを示している。また図２は、ブロックＢ１に第１のデータグループＤ１２、第１のデータグループＤ１３が書き込まれ、ブロックＢ２に第１のデータグループＤ１４と第２のデータグループＤ２３が書き込まれていることを示している。
【００２３】
第１のデータグループＤ１はブロックＢ０、ブロックＢ１、ブロックＢ２の先頭のセルから順に書き込まれ、第２のデータグループＤ２は後尾のセルから順に書き込まれる。これは、図示しないテーブルによって予め決められている。また、１つのブロック内の第１のデータグループＤ１の最後尾と第２のデータグループＤ２の最後尾との間には予め決められたサイズ（例えば２バイト）以上の境界セル（空きセル）３０が存在するように書き込まれる。この境界セル３０は第１のデータグループＤ１と第２のデータグループＤ２との境界を示すものである。これにより、データ構成にＩＤが含まれていなくても書き込まれたデータグループが第１のデータグループＤ１と第２のデータグループＤ２のどちらであるかを識別することができ、ブロックＢ０、ブロックＢ１、ブロックＢ２内の記憶領域を有効に活用することができる。
【００２４】
図３に、第１のデータグループＤ１がブロックＢ０、ブロックＢ１、ブロックＢ２のいずれかに書き込まれるフローを示す。アプリケーションソフトウェア４からドライバ３が書き込み命令を受けると、ドライバ３はブロックＢ０、ブロックＢ１、ブロックＢ２の順でブロック内を検索し、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれかに第１のデータグループＤ１又は第２のデータグループＤ２が書き込まれているか否かを確認する（Ｓ１）。ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれのブロックにも第１のデータグループＤ１及び第２のデータグループＤ２が書き込まれていないときは（Ｓ１のＮｏ）、ブロックＢ０の先頭のセルから第１のデータグループＤ１を書き込む（Ｓ２）。
【００２５】
ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれかに第１のデータグループＤ１又は第２のデータグループＤ２が書き込まれているときは（Ｓ１のＹｅｓ）、ドライバ３は、最新の第１のデータグループＤ１が書き込まれているブロックＢｘを特定する（Ｓ３）。そして、当該ブロックＢｘの空き領域内で第１のデータグループＤ１を書き込める領域が存在するか否か、すなわち、第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在するか否かを以下の手順で確認する（Ｓ４）。なお、ブロックＢｘはブロックＢ０、ブロックＢ１、ブロックＢ２のいずれか１つのブロックである。
【００２６】
当該ブロックＢｘの先頭のセルが空きセルのときは、ドライバ３は、第１のデータグループＤ１のデータサイズに相当する空きセルが先頭のセルから連続して存在するかどうかを確認する。ブロックＢｘの先頭のセルに既に第１のデータグループＤ１が書き込まれているときには、ドライバ３は、既に書き込まれている第１のデータグループＤ１の最後尾の次のセルから連続して第１のデータグループＤ１のデータサイズに相当する空きセルが存在するかどうかを確認する。ブロックＢｘに第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在したときは（Ｓ４のＹｅｓ）、ドライバ３は、第１のデータグループＤ１をブロックＢｘに書き込む（Ｓ５）。なお、Ｓ２とＳ５のステップにおいては、新たに書き込んだ第１のデータグループＤ１の誤り検出を行うことを含んでいる。誤り検出の手順については後述する。
【００２７】
ただし、第１のデータグループＤ１のデータサイズに相当する連続した空きセルが存在していたとしても、その最後尾の空きセルと既に書き込まれている第２のデータグループＤ２の最後尾のセルとの間に境界セル３０が存在できないときは、ドライバ３はブロックＢｘの空き領域内には第１のデータグループＤ１を書き込めるだけの連続した空きセルは存在しなかったと判断する（Ｓ４のＮｏ）。
【００２８】
上記の他、第１のデータグループＤ１のデータサイズに相当する連続した空きセルがないなど、ブロックＢｘに第１のデータグループＤ１を書き込める連続した空きセルが存在しなかったときは（Ｓ４のＮｏ）、次にドライバ３は最新の第２のデータグループＤ２が書き込まれているブロックＢｙを特定する（Ｓ６）。そして、ブロックＢｙの空き領域内で第１のデータグループＤ１を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ７）。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｙ内に第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在したときは（Ｓ７のＹｅｓ）、第１のデータグループＤ１をブロックＢｙに書き込む（Ｓ５）。なお、ブロックＢｙは、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれか１つのブロックであり、ブロックＢｘと同じブロックであるときもあれば、異なるブロックであるときもある。
【００２９】
ブロックＢｙにも第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ７のＮｏ）、ドライバ３はブロックＢｘとブロックＢｙとが同じブロックであるか否かを判断する（Ｓ８）。ブロックＢｘとブロックＢｙが同じブロックのときは（Ｓ８のＹｅｓ）、未だ空き領域を確認していないブロックが２つ存在する。その２つのブロックのこれまでのデータ消去回数が同じかどうかを判断する（Ｓ９）。
【００３０】
２つのブロックのデータ消去回数が同じであれば（Ｓ９のＹｅｓ）、ブロックの検索順序に沿って次に検索するブロックを特定する（Ｓ１０）。そのブロックをブロックＢｚ１とする。すなわち、ブロックＢｘ（＝ブロックＢｙ）がブロックＢ０のときは、ブロックＢｚ１はブロックＢ１である。ブロックＢｘ（＝ブロックＢｙ）がブロックＢ１のときは、ブロックＢｚ１はブロックＢ２である。ブロックＢｘ（＝ブロックＢｙ）がブロックＢ２のときは、ブロックＢｚ１はブロックＢ０である。
【００３１】
そしてブロックＢｚ１空き領域内で第１のデータグループＤ１を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ１２）。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｚ１内に第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在したときは（Ｓ１２のＹｅｓ）、第１のデータグループＤ１をブロックＢｚ１に書き込む（Ｓ５）。
【００３２】
ブロックＢｚ１に第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ１２のＮｏ）、残る１つのブロックの空き領域内で第１のデータグループＤ１を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ１３）。当該ブロックをブロックＢｚ２とする。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｚ２内に第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在したときは（Ｓ１３のＹｅｓ）、第１のデータグループＤ１をブロックＢｚ２に書き込む（Ｓ５）。
【００３３】
ブロックＢｚ２にも第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ１３のＮｏ）、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれにも第１のデータグループＤ１を書き込めるだけの連続した空きセルがないことになる。そのときは、ブロックＢｚ１のデータを全て消去して（Ｓ１４）、ブロックＢｚ１の先頭のセルから第１のデータグループＤ１を書き込む（Ｓ５）。
【００３４】
このように、本実施形態においては、ブロックＢｘにある既存の最新の第１のデータグループＤ１の転記を行うことなく、第１のデータグループＤ１を新たに書き足すことができる。従って、既存の最新の第１のデータグループＤ１の一部が破損、欠落してしまうおそれがない。また、ブロックＢｚ１におけるデータ消去中や第１のデータグループＤ１を新たに書き込んでいる最中に通電が切断されても、ブロックＢｘにある既存の最新の第１のデータグループＤ１は残存しているので、既存の最新の第１のデータグループＤ１を誤りなく維持することができる。
【００３５】
空き領域の確認をしていない２つのブロックのデータ消去回数が異なるときは（Ｓ９のＮｏ）、データの消去回数の少ないブロックをブロックＢｚ１とする（Ｓ１１）。その後の流れは上述した手順と同じである。データの消去回数は個別製品による上限があるが、データの消去回数の少ないブロックをブロックＢｚ１としてブロックＢｚ２より優先的にデータを消去することにより、ブロックＢ０、Ｂ１、Ｂ２の残存消去回数を平準化できる。それにより、消去回数上限まで図３、図４のフローに沿って第１のデータグループＤ１と第２のデータグループＤ２を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
【００３６】
ブロックＢｘとブロックＢｙが異なるブロックのときは（Ｓ８のＮｏ）、空き領域の確認をしていないブロックは１つだけである。当該空き領域の確認をしていないブロックをブロックＢｚとする。ブロックＢｚの領域内で第１のデータグループＤ１を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ１５）。確認の手順は上述したブロックＢｘでの手順と同じである。ブロックＢｚ内に第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在したときは（Ｓ１５のＹｅｓ）、第１のデータグループＤ１をブロックＢｚに書き込む（Ｓ５）。
【００３７】
ブロックＢｚにも第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ１５のＮｏ）、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれにも第１のデータグループＤ１を書き込めるだけの連続した空きセルが存在しないことになる。そのときは、ブロックＢｚのデータを全て消去して（Ｓ１６）、ブロックＢｚの先頭のセルから第１のデータグループＤ１を書き込む（Ｓ５）。
【００３８】
このようにブロックＢｘにある既存の最新の第１のデータグループＤ１やＢｙにある既存の最新の第２のデータグループＤ２の転記を行うことなく、第１のデータグループＤ１を新たに書き足すことができる。従って、既存の最新の第１のデータグループＤ１の一部が破損、欠落してしまうおそれがない。また、ブロックＢｚにおけるデータ消去中や第１のデータグループＤ１を新たに書き込んでいる最中に通電が切断されても、ブロックＢｘにある既存の最新の第１のデータグループＤ１は存在しているので、既存の最新の第１のデータグループＤ１を誤りなく維持することができる。
【００３９】
第１のデータグループＤ１の新たな書き込み（Ｓ５）が正常に完了した後は、当該第１のデータグループＤ１を書き込んだブロック及び最新の第２のデータグループＤ２が存在するブロックＢｙを除くそれ以外のブロックＢに、新たに第１のデータグループＤ１又は第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在するかどうかを確認する（Ｓ１７）。第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在するかどうかの確認方法は後述する。当該ブロックＢに連続した空きセルが存在すれば（Ｓ１７のＹｅｓ）、このフローを終了する。当該ブロックＢに連続した空きセルが存在しなければ（Ｓ１７のＮｏ）、当該ブロックＢのデータを全て消去して（Ｓ１８）、このフローを終了する。
【００４０】
図４に、第２のデータグループＤ２がブロックＢに書き込まれるフローを示す。このフローは、基本的に図３と同様である。ただし、第２のデータグループＤ２はブロックＢ０、ブロックＢ１、ブロックＢ２の後尾から書き込まれていく点で、第１のデータグループＤ１とは異なっている。
【００４１】
アプリケーションソフトウェア４からドライバ３が書き込み命令を受けると、ドライバ３はブロックＢ０、ブロックＢ１、ブロックＢ２の順でブロック内を検索し、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれかに第１のデータグループＤ１又は第２のデータグループＤ２が書き込まれているか否かを確認する（Ｓ２１）。ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれのブロックにも第１のデータグループＤ１及び第２のデータグループＤ２が書き込まれていないときは（Ｓ２１のＮｏ）、ブロックＢ０の先頭のセルから第２のデータグループＤ２を書き込む（Ｓ２２）。
【００４２】
ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれかに第１のデータグループＤ１又は第２のデータグループＤ２が書き込まれているときは（Ｓ２１のＹｅｓ）、ドライバ３は、最新の第１のデータグループＤ１が書き込まれているブロックＢｘを特定する（Ｓ２３）。そして、当該ブロックＢｘの空き領域内で第２のデータグループＤ２を書き込める領域が存在するか否か、すなわち、第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在するか否かを以下の手順で確認する（Ｓ２４）。なお、ブロックＢｘはブロックＢ０、ブロックＢ１、ブロックＢ２のいずれか１つのブロックである。
【００４３】
当該ブロックＢｘの後尾のセルが空きセルのときは、ドライバ３は、第２のデータグループＤ２のデータサイズに相当する空きセルが後尾のセルから連続して存在するかどうかを確認する。ブロックＢｘの後尾のセルに既に第２のデータグループＤ２が書き込まれているときには、ドライバ３は、既に書き込まれている第２のデータグループＤ２の最後尾の次のセルから連続して第２のデータグループＤ２のデータサイズに相当する空きセルが存在するかどうかを確認する。ブロックＢｘに第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在したときは（Ｓ２４のＹｅｓ）、ドライバ３は、第２のデータグループＤ２をブロックＢｘに書き込む（Ｓ２５）。なお、Ｓ２２とＳ２５のステップにおいては、新たに書き込んだ第２のデータグループＤ２の誤り検出を行うことを含んでいる。誤り検出の手順については後述する。
【００４４】
ただし、第２のデータグループＤ２のデータサイズに相当する連続した空きセルが存在していたとしても、その最後尾の空きセルと既に書き込まれている第１のデータグループＤ１の最後尾のセルとの間に境界セル３０が存在できないときは、ドライバ３はブロックＢｘの空き領域内には第２のデータグループＤ２を書き込めるだけの連続した空きセルは存在しなかったと判断する（Ｓ２４のＮｏ）。
【００４５】
上記の他、第２のデータグループＤ２のデータサイズに相当する連続した空きセルがないなど、ブロックＢｘに第２のデータグループＤ２を書き込める連続した空きセルが存在しなかったときは（Ｓ２４のＮｏ）、次にドライバ３は最新の第２のデータグループＤ２が書き込まれているブロックＢｙを特定する（Ｓ２６）。そして、ブロックＢｙの空き領域内で第２のデータグループＤ２を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ２７）。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｙ内に第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在したときは（Ｓ２７のＹｅｓ）、第２のデータグループＤ２をブロックＢｙに書き込む（Ｓ２５）。なお、ブロックＢｙは、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれか１つのブロックであり、ブロックＢｘと同じブロックであるときもあれば、異なるブロックであるときもある。
【００４６】
ブロックＢｙにも第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ２７のＮｏ）、ドライバ３はブロックＢｘとブロックＢｙとが同じブロックであるか否かを判断する（Ｓ２８）。ブロックＢｘとブロックＢｙが同じブロックのときは（Ｓ２８のＹｅｓ）、未だ空き領域を確認していないブロックが２つ存在する。その２つのブロックのこれまでのデータ消去回数が同じかどうかを判断する（Ｓ２９）。
【００４７】
２つのブロックのデータ消去回数が同じであれば（Ｓ２９のＹｅｓ）、ブロックの検索順序に沿って次に検索するブロックを特定する（Ｓ３０）。そのブロックをブロックＢｚ１とする。すなわち、ブロックＢｘ（＝ブロックＢｙ）がブロックＢ０のときは、ブロックＢｚ１はブロックＢ１である。ブロックＢｘ（＝ブロックＢｙ）がブロックＢ１のときは、ブロックＢｚ１はブロックＢ２である。ブロックＢｘ（＝ブロックＢｙ）がブロックＢ２のときは、ブロックＢｚ１はブロックＢ０である。
【００４８】
そしてブロックＢｚ１空き領域内で第２のデータグループＤ２を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ３２）。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｚ１内に第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在したときは（Ｓ３２のＹｅｓ）、第２のデータグループＤ２をブロックＢｚ１に書き込む（Ｓ２５）。
【００４９】
ブロックＢｚ１に第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ３２のＮｏ）、残る１つのブロックの空き領域内で第２のデータグループＤ２を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ３３）。当該ブロックをブロックＢｚ２とする。確認の方法は上述したブロックＢｘでの手順と同じである。ブロックＢｚ２内に第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在したときは（Ｓ３２のＹｅｓ）、第２のデータグループＤ２をブロックＢｚ２に書き込む（Ｓ５）。
【００５０】
ブロックＢｚ２にも第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ３３のＮｏ）、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれにも第２のデータグループＤ２を書き込めるだけの連続した空きセルがないことになる。そのときは、ブロックＢｚ１のデータを全て消去して（Ｓ３４）、ブロックＢｚ１の後尾のセルから第２のデータグループＤ２を書き込む（Ｓ２５）。
【００５１】
このように、本実施形態においては、ブロックＢｘにある既存の最新の第２のデータグループＤ２の転記を行うことなく、第２のデータグループＤ２を新たに書き足すことができる。従って、既存の最新の第２のデータグループＤ２の一部が破損、欠落してしまうおそれがない。また、ブロックＢｚ１におけるデータ消去中や第２のデータグループＤ２を新たに書き込んでいる最中に通電が切断されても、ブロックＢｘにある既存の最新の第２のデータグループＤ２は残存しているので、既存の最新の第２のデータグループＤ２を誤りなく維持することができる。
【００５２】
空き領域の確認をしていない２つのブロックのデータ消去回数が異なるときは（Ｓ２９のＮｏ）、データの消去回数の少ないブロックをブロックＢｚ１とする（Ｓ１１）。その後の流れは上述した手順と同じである。データの消去回数は個別製品による上限があるが、データの消去回数の少ないブロックをブロックＢｚ１としてブロックＢｚ２より優先的にデータを消去することにより、ブロックＢ０、Ｂ１、Ｂ２の残存消去回数を平準化できる。それにより、消去回数上限まで図３、図４のフローに沿って第１のデータグループＤ１と第２のデータグループＤ２を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
【００５３】
ブロックＢｘとブロックＢｙが異なるブロックのときは（Ｓ２８のＮｏ）、空き領域の確認をしていないブロックは１つだけである。当該空き領域の確認をしていないブロックをブロックＢｚとする。ブロックＢｚの領域内で第２のデータグループＤ２を書き込めるだけの連続した空きセルがあるか否かを確認する（Ｓ３５）。確認の手順は上述したブロックＢｘでの手順と同じである。ブロックＢｚ内に第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在したときは（Ｓ３５のＹｅｓ）、第２のデータグループＤ２をブロックＢｚに書き込む（Ｓ２５）。
【００５４】
ブロックＢｚにも第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在しなかったときは（Ｓ３５のＮｏ）、ブロックＢ０、ブロックＢ１、ブロックＢ２のいずれにも第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在しないことになる。そのときは、ブロックＢｚのデータを全て消去して（Ｓ３６）、ブロックＢｚの後尾のセルから第２のデータグループＤ２を書き込む（Ｓ２５）。
【００５５】
このようにブロックＢｘにある既存の最新の第１のデータグループＤ１やＢｙにある既存の最新の第２のデータグループＤ２の転記を行うことなく、第２のデータグループＤ２を新たに書き足すことができる。従って、既存の最新の第２のデータグループＤ２の一部が破損、欠落してしまうおそれがない。また、ブロックＢｚにおけるデータ消去中や第２のデータグループＤ２を新たに書き込んでいる最中に通電が切断されても、ブロックＢｘにある既存の最新の第２のデータグループＤ２は存在しているので、既存の最新の第２のデータグループＤ２を誤りなく維持することができる。
【００５６】
第２のデータグループＤ２の新たな書き込み（Ｓ２５）が正常に完了した後は、当該第２のデータグループＤ２を書き込んだブロック及び最新の第１のデータグループＤ１が存在するブロックＢｘを除くそれ以外のブロックＢに、新たに第１のデータグループＤ１又は第２のデータグループＤ２を書き込めるだけの連続した空きセルが存在するかどうかを確認する（Ｓ３７）。当該ブロックＢに連続した空きセルが存在すれば（Ｓ３７のＹｅｓ）、このフローを終了する。当該ブロックＢに連続した空きセルが存在しなければ（Ｓ３７のＮｏ）、当該ブロックＢのデータを全て消去して（Ｓ３８）、このフローを終了する。
【００５７】
次に、第１のデータグループＤ１のブロックへの書き込みについてより具体的に説明する。図５ａは、ブロックＢ０の先頭のセルから第１のデータグループＤ１１が書き込まれた状態を示す概念図である。これは図３のＳ２の状態である。左からブロックＢ０、ブロックＢ１、ブロックＢ２の順に並んでいる。ブロックＢ１とブロックＢ２の各セルは無色であるが、これは第１のデータグループＤ１及び第２のデータグループＤ２が書き込まれていないことを示している。
【００５８】
ブロックＢ１、ブロックＢ２、ブロックＢ３はそれぞれ３２バイトの大きさで、１マスが１バイトである。第１のデータグループＤ１は、先頭から順に２バイトのチェックデータ１１、４バイトの第１のデータ１３、４バイトの第２のデータ１４、３バイトの第３のデータ１５、１バイトの更新回数データ１２から構成される１４バイトのデータである。第１のデータグループＤ１はアプリケーションソフトウェア４ａで、第２のデータグループＤ２のデータ列はアプリケーションソフトウェア４ｂでそれぞれ作られる。
【００５９】
第１のデータ１３、第２のデータ１４、第３のデータ１５は、車両用センサ５ａから取得した検出データや設定値のデータである。チェックデータ１１は、第１のデータ１３、第２のデータ１４、第３のデータ１５を入力としてＣＲＣ（Cyclic Redundancy Check）演算により算出された誤り検出用のデータである。更新回数データ１２は、第１のデータグループＤ１１がブロックに書き込まれた回数を示すデータである。なお、太線で囲まれているデータグループが、書き込まれた最新の第１のデータグループＤ１である。
【００６０】
図５ｂは、図５ａの状態から、ブロックＢ０に第２のデータグループＤ２１が書き込まれた状態を示す概念図である。これは図４のＳ２４からＳ２５へ進んだ状態である。最新の第１のデータグループＤ１１が書き込まれているブロックＢ０には、１８バイトの空きセルがある。第２のデータグループＤ２１は、先頭から順に２バイトのチェックデータ２１、３バイトの第１のデータ２３、２バイトの第２のデータ２４、１バイトの更新回数データ２２のように構成される８バイトのデータである。また、第２のデータグループＤ２１を書き込んだ後でも第１のデータグループＤ１１との間に２バイトの境界セル３０を確保することができる。従って、第２のデータグループＤ２１はブロックＢ０に書き込み可能である。第１のデータ２３、第２のデータ２４は、別の車両用センサ５ｂから取得した検出データや設定値のデータである。チェックデータ２１と更新回数データ２２は第１のデータグループＤ１と同じなので詳細な説明は割愛する。
【００６１】
第２のデータグループＤ２はブロックＢ０の後尾から書き込まれる。すなわち、ブロックＢ０の最後尾のセルからチェックデータ２１、第１のデータ２３、第２のデータ２４、更新回数データ２２の順に書き込まれる。なお、太線で囲まれているデータグループが、書き込まれた最新の第２のデータグループＤ２である。
【００６２】
図５ｃは、図５ｂの状態から、ブロックＢ０に第２のデータグループＤ２２が書き込まれた状態を示す概念図である。これは図４のＳ２４からＳ２５へ進んだ状態である。図５ｂの状態で最新の第１のデータグループＤ１１が書き込まれているブロックＢ０には１０バイトの空きセルがある。第２のデータグループＤ２２のデータサイズは８バイトである。また、第２のデータグループＤ２２を書き込んだ後でも第１のデータグループＤ１１との間に２バイトの境界セル３０を確保することができる。従って、第２のデータグループＤ２２はブロックＢ０に書き込み可能であり、第２のデータグループＤ２１の最後尾（更新回数データ２２）から連続してブロックＢ０に書き込まれる。なお、図５ｂで第２のデータグループＤ２１が書き込まれている領域は図５ｃでは濃色のセルになっているが、これは第２のデータグループＤ２１が存在していることを示している（以降の図でも同様）。
【００６３】
図５ｄは、図５ｃの状態から、ブロックＢ１に第１のデータグループＤ１２が書き込まれた状態を示す概念図である。これは図３のＳ１０からＳ１２を経てＳ５へ進んだ状態である。図５ｃの状態で最新の第１のデータグループＤ１１と最新の第２のデータグループＤ２２が書き込まれているブロックＢ０には２バイトの空きセルがある。そのため、１４バイトの第１のデータグループＤ１２はブロックＢ０に書き込むことはできない。ブロックＢ１とブロックＢ２は共にデータ消去されておらず、また第１のデータグループＤ１も第２のデータグループＤ２も書き込まれていない。そこで第１のデータグループＤ１２はブロックＢ１の先頭のセルから書き込まれる。
【００６４】
図５ｅは、図５ｄの状態から、ブロックＢ１に第１のデータグループＤ１３が書き込まれた状態を示す概念図である。これは図３のＳ４からＳ５へ進んだ状態である。図５ｄの状態で、最新の第１のデータグループＤ１２はブロックＢ１に書き込まれている。ブロックＢ１には１８バイトの空きセルがあり、第１のデータグループＤ１３のデータサイズは１４バイトである。よって、第１のデータグループＤ１３はブロックＢ１の第１のデータグループＤ１２の最後尾（更新回数データ１２）から連続してブロックＢ１に書き込まれる。
【００６５】
図５ｆは、図５ｅの状態から、ブロックＢ２に第２のデータグループＤ２３が書き込まれた状態を示す概念図である。これは図４のＳ３５からＳ２５へ進んだ状態である。図５ｅの状態で最新の第１のデータグループＤ１３が書き込まれているブロックＢ１には４バイトの空きがある。また、最新の第２のデータグループＤ２２が書き込まれているブロックＢ０には２バイトの空きセルがある。第２のデータグループＤ２３のデータサイズは８バイトなので、ブロックＢ０、ブロックＢ１のいずれにも書き込むことはできない。しかし、ブロックＢ２には既存の第１のデータグループＤ１も第２のデータグループＤ２も存在しない。よって、第２のデータグループＤ２３はブロックＢ２の後尾のセルから書き込まれる。
【００６６】
図５ｇは、図５ｆの状態から、ブロックＢ０に書き込まれていたデータグループが消去された状態を示す概念図である。これは図４のＳ２５からＳ３７を経てＳ３８へ進んだ状態である。図５ｆの状態で、最新の第１のデータグループＤ１３はブロックＢ１に書き込まれており、最新の第２のデータグループＤ２３はブロックＢ２に書き込まれている。また、ブロックＢ０の空きセルは２バイトなので、第１のデータグループＤ１も第２のデータグループＤ２もブロックＢ０に書き込むことはできない。よって、ブロックＢ０に書き込まれていた第１のデータグループＤ１１、第２のデータグループＤ２１、第２のデータグループＤ２２を消去して、新たなデータグループの書き込みを可能にする。
【００６７】
図５ｈは、図５ｇの状態から、ブロックＢ２に第１のデータグループＤ１４が書き込まれた状態を示す概念図である。これは図３のＳ７からＳ５へ進んだ状態である。図５ｇの状態で最新の第１のデータグループＤ１３はブロックＢ１に書き込まれている。また、最新の第２のデータグループＤ２３はブロックＢ２に書き込まれている。ブロックＢ１には４バイトしか空きセルがないが、ブロックＢ２は２４バイトの空きセルがある。よって、第１のデータグループＤ１４はブロックＢ２の先頭のセルから書き込まれる。
【００６８】
図５ｉは、図５ｈの状態から、ブロックＢ１に書き込まれていたデータグループが消去された状態を示す概念図である。これは図３のＳ５からＳ１７、Ｓ１８へ進んだ状態である。図５ｈの状態で、最新の第１のデータグループＤ１４、最新の第２のデータグループＤ２３はいずれもブロックＢ１に書き込まれている。また、ブロックＢ１の空きセルは４バイトであり、第１のデータグループＤ１も第２のデータグループＤ２も書き込むことはできない。よって、ブロックＢ１に書き込まれていた第１のデータグループＤ１２、第１のデータグループＤ１３を消去して、新たなデータグループの書き込みを可能にする。
【００６９】
図５ｊは、図５ｉの状態から、ブロックＢ０に第１のデータグループＤ１５が書き込まれた状態を示す概念図である。これは図３のＳ１０からＳｓ１２を経てＳ５へ進んだ状態である。図５ｉの状態で最新の第１のデータグループＤ１４、最新の第２のデータグループＤ２３は共にブロックＢ２に書き込まれている。また、ブロックＢ２には１０バイトしか空きセルがない。よって、ブロックＢ２には第１のデータグループＤ１５を書き込むことはできない。また、ブロックＢ０、ブロックＢ１とも３２バイトの空きセルがあるが、どちらも消去回数は１回である。そこで、ブロックＢ１よりもブロックＢ０に優先的に書き込みを行う。よって、第１のデータグループＤ１５はブロックＢ０の先頭のセルから書き込まれる。
【００７０】
以後も、図３、図４のフローに従って、第１のデータグループＤ１と第２のデータグループＤ２がブロックに書き込まれたり、ブロックのデータが消去されたりする。このようにブロックにある既存の最新の第１のデータグループＤ１と第２のデータグループＤ２の転記を行うことなく、新たな第１のデータグループＤ１と第２のデータグループＤ２とを書き足すことができる。従って、既存の最新の第１のデータグループＤ１や第２のデータグループＤ２の一部が破損、欠落してしまうおそれがない。また、ブロックにおけるデータ消去中や新たな第１のデータグループＤ１や第２のデータグループＤ２を書き込んでいる最中に通電が切断されても、既存の最新の第１のデータグループＤ１や第２のデータグループＤ２は残存しており、それらを誤りなく維持することができる。さらには、ブロックＢ０、Ｂ１、Ｂ２の残り消去回数を平準化できる。それにより、消去回数上限まで図３、図４のフローに沿って第１のデータグループＤ１と第２のデータグループＤ２を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
【００７１】
アプリケーションソフトウェア４ａ、アプリケーションソフトウェア４ｂは、第１のデータグループＤ１と第２のデータグループＤ２のブロックへの書き込み後に、その書き込みが正常に完了したかどうかの誤り検出をしている。図６に、第１のデータグループＤ１１がブロックＢ０に正常に書き込まれたかどうかの誤り検出をするフローを示す。
【００７２】
まず、第１のデータ１３、第２のデータ１４、第３のデータ１５を車両用センサ５ａから取得し（Ｓ６１）。アプリケーションソフトウェア４ａは、取得した第１のデータ１３、第２のデータ１４、第３のデータ１５からＣＲＣ演算により書き込み前のチェックデータ１１ａを算出する（Ｓ６２）。そして、書き込み前のチェックデータ１１ａを先頭に、第１のデータ１３、第２のデータ１４、第３のデータ１５、更新回数データ１２を統合し、第１のデータグループＤ１１を構成する（Ｓ６３）。第１のデータグループＤ１１は、図３の手順に従い、ドライバ３ａによりフラッシュメモリ１に書き込まれる（Ｓ６４）。
【００７３】
第１のデータグループＤ１１のブロックＢ０への書き込みが完了すると、書き込みが正常に完了したか否かの誤り検出を行う。具体的には、ブロックＢ０に書き込まれた第１のデータ１３、第２のデータ１４、第３のデータ１５がドライバ３ａにより読み取られ（Ｓ６５）、アプリケーションソフトウェア４ａに送られる。アプリケーションソフトウェア４ａは当該読み取られた第１のデータ１３、第２のデータ１４、第３のデータ１５を入力として新たにＣＲＣ演算し、書き込み後のチェックデータ１１ｂを算出する（Ｓ６６）。そして、書き込み前のチェックデータ１１ａの値と書き込み後のチェックデータ１１ｂの値とを比較する（Ｓ６７）。書き込み前のチェックデータ１１ａと書き込み後のチェックデータ１１ｂの値が同じであれば（Ｓ６７のＹｅｓ）、第１のデータ１３、第２のデータ１４、第３のデータ１５はブロックＢ０に正しく書き込まれたと判断し、フローは終了する。書き込み前のチェックデータ１１ａと書き込み後のチェックデータ１１ｂの値が異なっていれば、ブロックＢ０に正しく書き込まれなかったと判断される（Ｓ６７のＮｏ）。正しく書き込まれなかったと判断されたときには、再度図３の手順に従い、第１のデータグループＤ１１をブロックＢの他の空き領域に書き込む（Ｓ６８）。このようにして、ブロックＢ０に書き込まれた第１のデータグループＤ１１は正確性が担保される。
【００７４】
本発明は、書き換え可能な不揮発性メモリの一種であるフラッシュメモリに用いることが可能である。
【符号の説明】
【００７５】
１：フラッシュメモリ
１１、２１：チェックデータ
１２、２２：更新回数データ
３０：境界セル
Ｂ１、Ｂ２、Ｂ３：ブロック
Ｄ１、Ｄ１１、Ｄ１２、Ｄ１３、Ｄ１４、Ｄ１５：第１のデータグループ
Ｄ２、Ｄ２１、Ｄ２２、Ｄ２３：第２のデータグループ
【図１】
0005838783.tif 000002
【図２】
0005838783.tif 000003
【図３】
0005838783.tif 000004
【図４】
0005838783.tif 000005
【図５ａ】
0005838783.tif 000006
【図５ｂ】
0005838783.tif 000007
【図５ｃ】
0005838783.tif 000008
【図５ｄ】
0005838783.tif 000009
【図５ｅ】
0005838783.tif 000010
【図５ｆ】
0005838783.tif 000011
【図５ｇ】
0005838783.tif 000012
【図５ｈ】
0005838783.tif 000013
【図５ｉ】
0005838783.tif 000014
【図５ｊ】
0005838783.tif 000015
【図６】
0005838783.tif 000016