以下、本発明の実施の形態について、図面に基づいて詳細に説明する。図1は、本発明の実施形態に係るフラッシュメモリ1を含むECU(Electronic Control Unit)2のソフトウェア構造を示す概略のブロック図である。フラッシュメモリ1は、車両用のECU2に搭載され、車両用センサ5から取得した検出データや設定値が書き込まれ、読み取られ、または消去される。フラッシュメモリ1への検出データや設定値の書き込み、読み取り、消去等の処理は、車両用センサ5を動作させるアプリケーションソフトウェア4から指令を受けたドライバ3により実行される。車両用センサ5の検出データや設定値は適宜更新されるので、直近に更新された最新データや最新設定値を誤りなく保持することがフラッシュメモリ1において重要である。
図2は、フラッシュメモリ1の構成を示す概念図である。フラッシュメモリ1はその内部の記憶領域が複数のブロックB0、ブロックB1、ブロックB2、・・・、ブロックBnに分けられている。nは2以上の整数である。これらのブロックがデータ消去の単位である。また、3つのブロックが一単位を構成する。例えばブロックB0、ブロックB1、ブロックB2で一単位、ブロックB3、ブロックB4、ブロックB5で一単位を構成する。本実施形態では、ブロックB0、ブロックB1、ブロックB2を用いて説明する。ブロックB0、ブロックB1、ブロックB2はいずれも32バイトの書き込み可能容量を持っている。ただし、本発明に係るブロックの書き込み可能容量は32バイトに限定されることはない。
ブロックB0、ブロックB1、ブロックB2の空き領域には第1のデータグループD1と第2のデータグループD2が複数回書き込まれる。第1のデータグループD1と第2のデータグループD2は新たな書き込みがなされても上書きされることなく、ブロックB0、ブロックB1、ブロックB2に空き領域がある限り既存の第1のデータグループD1と第2のデータグループD2を保持したまま新たな第1のデータグループD1と第2のデータグループD2が書き足される。すなわち、複数の第1のデータグループD1又は複数の第2のデータグループD2がブロックB0、ブロックB1、ブロックB2内に存在できる。
第1のデータグループD1、第2のデータグループD2とも、そのデータ構成の中に書き込み回数(更新回数)を示すデータが含まれている。書き込まれている第1のデータグループD1と第2のデータグループD2のそれぞれの書き込み回数のデータにより、いずれが最新の第1のデータグループD1と最新の第2のデータグループD2であるかが判別できる。第1のデータグループD1と第2のデータグループD2のデータ構成については後述する。
以下、複数回書き込まれた第1のデータグループD1及び第2のデータグループD2をそれぞれ区別して扱うときは、第1のデータグループD11、第1のデータグループD12、第1のデータグループD13、第1のデータグループD14、・・・、第2のデータグループD21、第2のデータグループD22、第2のデータグループD23、・・・のように記載する。符号末尾の1、2、3、4、・・・はブロックB0、ブロックB1、ブロックB2に書き込まれた(更新された)回数を表す。第1のデータグループD1と第2のデータグループD2はアプリケーションソフトウェア4にて作成され、それらのデータサイズは更新されても一定である。
図2では、ブロックB0に第1のデータグループD11と第2のデータグループD21、第2のデータグループD22が書き込まれていることを示している。また図2は、ブロックB1に第1のデータグループD12、第1のデータグループD13が書き込まれ、ブロックB2に第1のデータグループD14と第2のデータグループD23が書き込まれていることを示している。
第1のデータグループD1はブロックB0、ブロックB1、ブロックB2の先頭のセルから順に書き込まれ、第2のデータグループD2は後尾のセルから順に書き込まれる。これは、図示しないテーブルによって予め決められている。また、1つのブロック内の第1のデータグループD1の最後尾と第2のデータグループD2の最後尾との間には予め決められたサイズ(例えば2バイト)以上の境界セル(空きセル)30が存在するように書き込まれる。この境界セル30は第1のデータグループD1と第2のデータグループD2との境界を示すものである。これにより、データ構成にIDが含まれていなくても書き込まれたデータグループが第1のデータグループD1と第2のデータグループD2のどちらであるかを識別することができ、ブロックB0、ブロックB1、ブロックB2内の記憶領域を有効に活用することができる。
図3に、第1のデータグループD1がブロックB0、ブロックB1、ブロックB2のいずれかに書き込まれるフローを示す。アプリケーションソフトウェア4からドライバ3が書き込み命令を受けると、ドライバ3はブロックB0、ブロックB1、ブロックB2の順でブロック内を検索し、ブロックB0、ブロックB1、ブロックB2のいずれかに第1のデータグループD1又は第2のデータグループD2が書き込まれているか否かを確認する(S1)。ブロックB0、ブロックB1、ブロックB2のいずれのブロックにも第1のデータグループD1及び第2のデータグループD2が書き込まれていないときは(S1のNo)、ブロックB0の先頭のセルから第1のデータグループD1を書き込む(S2)。
ブロックB0、ブロックB1、ブロックB2のいずれかに第1のデータグループD1又は第2のデータグループD2が書き込まれているときは(S1のYes)、ドライバ3は、最新の第1のデータグループD1が書き込まれているブロックBxを特定する(S3)。そして、当該ブロックBxの空き領域内で第1のデータグループD1を書き込める領域が存在するか否か、すなわち、第1のデータグループD1を書き込めるだけの連続した空きセルが存在するか否かを以下の手順で確認する(S4)。なお、ブロックBxはブロックB0、ブロックB1、ブロックB2のいずれか1つのブロックである。
当該ブロックBxの先頭のセルが空きセルのときは、ドライバ3は、第1のデータグループD1のデータサイズに相当する空きセルが先頭のセルから連続して存在するかどうかを確認する。ブロックBxの先頭のセルに既に第1のデータグループD1が書き込まれているときには、ドライバ3は、既に書き込まれている第1のデータグループD1の最後尾の次のセルから連続して第1のデータグループD1のデータサイズに相当する空きセルが存在するかどうかを確認する。ブロックBxに第1のデータグループD1を書き込めるだけの連続した空きセルが存在したときは(S4のYes)、ドライバ3は、第1のデータグループD1をブロックBxに書き込む(S5)。なお、S2とS5のステップにおいては、新たに書き込んだ第1のデータグループD1の誤り検出を行うことを含んでいる。誤り検出の手順については後述する。
ただし、第1のデータグループD1のデータサイズに相当する連続した空きセルが存在していたとしても、その最後尾の空きセルと既に書き込まれている第2のデータグループD2の最後尾のセルとの間に境界セル30が存在できないときは、ドライバ3はブロックBxの空き領域内には第1のデータグループD1を書き込めるだけの連続した空きセルは存在しなかったと判断する(S4のNo)。
上記の他、第1のデータグループD1のデータサイズに相当する連続した空きセルがないなど、ブロックBxに第1のデータグループD1を書き込める連続した空きセルが存在しなかったときは(S4のNo)、次にドライバ3は最新の第2のデータグループD2が書き込まれているブロックByを特定する(S6)。そして、ブロックByの空き領域内で第1のデータグループD1を書き込めるだけの連続した空きセルがあるか否かを確認する(S7)。確認の方法は上述したブロックBxでの手順と同じである。ブロックBy内に第1のデータグループD1を書き込めるだけの連続した空きセルが存在したときは(S7のYes)、第1のデータグループD1をブロックByに書き込む(S5)。なお、ブロックByは、ブロックB0、ブロックB1、ブロックB2のいずれか1つのブロックであり、ブロックBxと同じブロックであるときもあれば、異なるブロックであるときもある。
ブロックByにも第1のデータグループD1を書き込めるだけの連続した空きセルが存在しなかったときは(S7のNo)、ドライバ3はブロックBxとブロックByとが同じブロックであるか否かを判断する(S8)。ブロックBxとブロックByが同じブロックのときは(S8のYes)、未だ空き領域を確認していないブロックが2つ存在する。その2つのブロックのこれまでのデータ消去回数が同じかどうかを判断する(S9)。
2つのブロックのデータ消去回数が同じであれば(S9のYes)、ブロックの検索順序に沿って次に検索するブロックを特定する(S10)。そのブロックをブロックBz1とする。すなわち、ブロックBx(=ブロックBy)がブロックB0のときは、ブロックBz1はブロックB1である。ブロックBx(=ブロックBy)がブロックB1のときは、ブロックBz1はブロックB2である。ブロックBx(=ブロックBy)がブロックB2のときは、ブロックBz1はブロックB0である。
そしてブロックBz1空き領域内で第1のデータグループD1を書き込めるだけの連続した空きセルがあるか否かを確認する(S12)。確認の方法は上述したブロックBxでの手順と同じである。ブロックBz1内に第1のデータグループD1を書き込めるだけの連続した空きセルが存在したときは(S12のYes)、第1のデータグループD1をブロックBz1に書き込む(S5)。
ブロックBz1に第1のデータグループD1を書き込めるだけの連続した空きセルが存在しなかったときは(S12のNo)、残る1つのブロックの空き領域内で第1のデータグループD1を書き込めるだけの連続した空きセルがあるか否かを確認する(S13)。当該ブロックをブロックBz2とする。確認の方法は上述したブロックBxでの手順と同じである。ブロックBz2内に第1のデータグループD1を書き込めるだけの連続した空きセルが存在したときは(S13のYes)、第1のデータグループD1をブロックBz2に書き込む(S5)。
ブロックBz2にも第1のデータグループD1を書き込めるだけの連続した空きセルが存在しなかったときは(S13のNo)、ブロックB0、ブロックB1、ブロックB2のいずれにも第1のデータグループD1を書き込めるだけの連続した空きセルがないことになる。そのときは、ブロックBz1のデータを全て消去して(S14)、ブロックBz1の先頭のセルから第1のデータグループD1を書き込む(S5)。
このように、本実施形態においては、ブロックBxにある既存の最新の第1のデータグループD1の転記を行うことなく、第1のデータグループD1を新たに書き足すことができる。従って、既存の最新の第1のデータグループD1の一部が破損、欠落してしまうおそれがない。また、ブロックBz1におけるデータ消去中や第1のデータグループD1を新たに書き込んでいる最中に通電が切断されても、ブロックBxにある既存の最新の第1のデータグループD1は残存しているので、既存の最新の第1のデータグループD1を誤りなく維持することができる。
空き領域の確認をしていない2つのブロックのデータ消去回数が異なるときは(S9のNo)、データの消去回数の少ないブロックをブロックBz1とする(S11)。その後の流れは上述した手順と同じである。データの消去回数は個別製品による上限があるが、データの消去回数の少ないブロックをブロックBz1としてブロックBz2より優先的にデータを消去することにより、ブロックB0、B1、B2の残存消去回数を平準化できる。それにより、消去回数上限まで図3、図4のフローに沿って第1のデータグループD1と第2のデータグループD2を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
ブロックBxとブロックByが異なるブロックのときは(S8のNo)、空き領域の確認をしていないブロックは1つだけである。当該空き領域の確認をしていないブロックをブロックBzとする。ブロックBzの領域内で第1のデータグループD1を書き込めるだけの連続した空きセルがあるか否かを確認する(S15)。確認の手順は上述したブロックBxでの手順と同じである。ブロックBz内に第1のデータグループD1を書き込めるだけの連続した空きセルが存在したときは(S15のYes)、第1のデータグループD1をブロックBzに書き込む(S5)。
ブロックBzにも第1のデータグループD1を書き込めるだけの連続した空きセルが存在しなかったときは(S15のNo)、ブロックB0、ブロックB1、ブロックB2のいずれにも第1のデータグループD1を書き込めるだけの連続した空きセルが存在しないことになる。そのときは、ブロックBzのデータを全て消去して(S16)、ブロックBzの先頭のセルから第1のデータグループD1を書き込む(S5)。
このようにブロックBxにある既存の最新の第1のデータグループD1やByにある既存の最新の第2のデータグループD2の転記を行うことなく、第1のデータグループD1を新たに書き足すことができる。従って、既存の最新の第1のデータグループD1の一部が破損、欠落してしまうおそれがない。また、ブロックBzにおけるデータ消去中や第1のデータグループD1を新たに書き込んでいる最中に通電が切断されても、ブロックBxにある既存の最新の第1のデータグループD1は存在しているので、既存の最新の第1のデータグループD1を誤りなく維持することができる。
第1のデータグループD1の新たな書き込み(S5)が正常に完了した後は、当該第1のデータグループD1を書き込んだブロック及び最新の第2のデータグループD2が存在するブロックByを除くそれ以外のブロックBに、新たに第1のデータグループD1又は第2のデータグループD2を書き込めるだけの連続した空きセルが存在するかどうかを確認する(S17)。第2のデータグループD2を書き込めるだけの連続した空きセルが存在するかどうかの確認方法は後述する。当該ブロックBに連続した空きセルが存在すれば(S17のYes)、このフローを終了する。当該ブロックBに連続した空きセルが存在しなければ(S17のNo)、当該ブロックBのデータを全て消去して(S18)、このフローを終了する。
図4に、第2のデータグループD2がブロックBに書き込まれるフローを示す。このフローは、基本的に図3と同様である。ただし、第2のデータグループD2はブロックB0、ブロックB1、ブロックB2の後尾から書き込まれていく点で、第1のデータグループD1とは異なっている。
アプリケーションソフトウェア4からドライバ3が書き込み命令を受けると、ドライバ3はブロックB0、ブロックB1、ブロックB2の順でブロック内を検索し、ブロックB0、ブロックB1、ブロックB2のいずれかに第1のデータグループD1又は第2のデータグループD2が書き込まれているか否かを確認する(S21)。ブロックB0、ブロックB1、ブロックB2のいずれのブロックにも第1のデータグループD1及び第2のデータグループD2が書き込まれていないときは(S21のNo)、ブロックB0の先頭のセルから第2のデータグループD2を書き込む(S22)。
ブロックB0、ブロックB1、ブロックB2のいずれかに第1のデータグループD1又は第2のデータグループD2が書き込まれているときは(S21のYes)、ドライバ3は、最新の第1のデータグループD1が書き込まれているブロックBxを特定する(S23)。そして、当該ブロックBxの空き領域内で第2のデータグループD2を書き込める領域が存在するか否か、すなわち、第2のデータグループD2を書き込めるだけの連続した空きセルが存在するか否かを以下の手順で確認する(S24)。なお、ブロックBxはブロックB0、ブロックB1、ブロックB2のいずれか1つのブロックである。
当該ブロックBxの後尾のセルが空きセルのときは、ドライバ3は、第2のデータグループD2のデータサイズに相当する空きセルが後尾のセルから連続して存在するかどうかを確認する。ブロックBxの後尾のセルに既に第2のデータグループD2が書き込まれているときには、ドライバ3は、既に書き込まれている第2のデータグループD2の最後尾の次のセルから連続して第2のデータグループD2のデータサイズに相当する空きセルが存在するかどうかを確認する。ブロックBxに第2のデータグループD2を書き込めるだけの連続した空きセルが存在したときは(S24のYes)、ドライバ3は、第2のデータグループD2をブロックBxに書き込む(S25)。なお、S22とS25のステップにおいては、新たに書き込んだ第2のデータグループD2の誤り検出を行うことを含んでいる。誤り検出の手順については後述する。
ただし、第2のデータグループD2のデータサイズに相当する連続した空きセルが存在していたとしても、その最後尾の空きセルと既に書き込まれている第1のデータグループD1の最後尾のセルとの間に境界セル30が存在できないときは、ドライバ3はブロックBxの空き領域内には第2のデータグループD2を書き込めるだけの連続した空きセルは存在しなかったと判断する(S24のNo)。
上記の他、第2のデータグループD2のデータサイズに相当する連続した空きセルがないなど、ブロックBxに第2のデータグループD2を書き込める連続した空きセルが存在しなかったときは(S24のNo)、次にドライバ3は最新の第2のデータグループD2が書き込まれているブロックByを特定する(S26)。そして、ブロックByの空き領域内で第2のデータグループD2を書き込めるだけの連続した空きセルがあるか否かを確認する(S27)。確認の方法は上述したブロックBxでの手順と同じである。ブロックBy内に第2のデータグループD2を書き込めるだけの連続した空きセルが存在したときは(S27のYes)、第2のデータグループD2をブロックByに書き込む(S25)。なお、ブロックByは、ブロックB0、ブロックB1、ブロックB2のいずれか1つのブロックであり、ブロックBxと同じブロックであるときもあれば、異なるブロックであるときもある。
ブロックByにも第2のデータグループD2を書き込めるだけの連続した空きセルが存在しなかったときは(S27のNo)、ドライバ3はブロックBxとブロックByとが同じブロックであるか否かを判断する(S28)。ブロックBxとブロックByが同じブロックのときは(S28のYes)、未だ空き領域を確認していないブロックが2つ存在する。その2つのブロックのこれまでのデータ消去回数が同じかどうかを判断する(S29)。
2つのブロックのデータ消去回数が同じであれば(S29のYes)、ブロックの検索順序に沿って次に検索するブロックを特定する(S30)。そのブロックをブロックBz1とする。すなわち、ブロックBx(=ブロックBy)がブロックB0のときは、ブロックBz1はブロックB1である。ブロックBx(=ブロックBy)がブロックB1のときは、ブロックBz1はブロックB2である。ブロックBx(=ブロックBy)がブロックB2のときは、ブロックBz1はブロックB0である。
そしてブロックBz1空き領域内で第2のデータグループD2を書き込めるだけの連続した空きセルがあるか否かを確認する(S32)。確認の方法は上述したブロックBxでの手順と同じである。ブロックBz1内に第2のデータグループD2を書き込めるだけの連続した空きセルが存在したときは(S32のYes)、第2のデータグループD2をブロックBz1に書き込む(S25)。
ブロックBz1に第2のデータグループD2を書き込めるだけの連続した空きセルが存在しなかったときは(S32のNo)、残る1つのブロックの空き領域内で第2のデータグループD2を書き込めるだけの連続した空きセルがあるか否かを確認する(S33)。当該ブロックをブロックBz2とする。確認の方法は上述したブロックBxでの手順と同じである。ブロックBz2内に第2のデータグループD2を書き込めるだけの連続した空きセルが存在したときは(S32のYes)、第2のデータグループD2をブロックBz2に書き込む(S5)。
ブロックBz2にも第2のデータグループD2を書き込めるだけの連続した空きセルが存在しなかったときは(S33のNo)、ブロックB0、ブロックB1、ブロックB2のいずれにも第2のデータグループD2を書き込めるだけの連続した空きセルがないことになる。そのときは、ブロックBz1のデータを全て消去して(S34)、ブロックBz1の後尾のセルから第2のデータグループD2を書き込む(S25)。
このように、本実施形態においては、ブロックBxにある既存の最新の第2のデータグループD2の転記を行うことなく、第2のデータグループD2を新たに書き足すことができる。従って、既存の最新の第2のデータグループD2の一部が破損、欠落してしまうおそれがない。また、ブロックBz1におけるデータ消去中や第2のデータグループD2を新たに書き込んでいる最中に通電が切断されても、ブロックBxにある既存の最新の第2のデータグループD2は残存しているので、既存の最新の第2のデータグループD2を誤りなく維持することができる。
空き領域の確認をしていない2つのブロックのデータ消去回数が異なるときは(S29のNo)、データの消去回数の少ないブロックをブロックBz1とする(S11)。その後の流れは上述した手順と同じである。データの消去回数は個別製品による上限があるが、データの消去回数の少ないブロックをブロックBz1としてブロックBz2より優先的にデータを消去することにより、ブロックB0、B1、B2の残存消去回数を平準化できる。それにより、消去回数上限まで図3、図4のフローに沿って第1のデータグループD1と第2のデータグループD2を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
ブロックBxとブロックByが異なるブロックのときは(S28のNo)、空き領域の確認をしていないブロックは1つだけである。当該空き領域の確認をしていないブロックをブロックBzとする。ブロックBzの領域内で第2のデータグループD2を書き込めるだけの連続した空きセルがあるか否かを確認する(S35)。確認の手順は上述したブロックBxでの手順と同じである。ブロックBz内に第2のデータグループD2を書き込めるだけの連続した空きセルが存在したときは(S35のYes)、第2のデータグループD2をブロックBzに書き込む(S25)。
ブロックBzにも第2のデータグループD2を書き込めるだけの連続した空きセルが存在しなかったときは(S35のNo)、ブロックB0、ブロックB1、ブロックB2のいずれにも第2のデータグループD2を書き込めるだけの連続した空きセルが存在しないことになる。そのときは、ブロックBzのデータを全て消去して(S36)、ブロックBzの後尾のセルから第2のデータグループD2を書き込む(S25)。
このようにブロックBxにある既存の最新の第1のデータグループD1やByにある既存の最新の第2のデータグループD2の転記を行うことなく、第2のデータグループD2を新たに書き足すことができる。従って、既存の最新の第2のデータグループD2の一部が破損、欠落してしまうおそれがない。また、ブロックBzにおけるデータ消去中や第2のデータグループD2を新たに書き込んでいる最中に通電が切断されても、ブロックBxにある既存の最新の第2のデータグループD2は存在しているので、既存の最新の第2のデータグループD2を誤りなく維持することができる。
第2のデータグループD2の新たな書き込み(S25)が正常に完了した後は、当該第2のデータグループD2を書き込んだブロック及び最新の第1のデータグループD1が存在するブロックBxを除くそれ以外のブロックBに、新たに第1のデータグループD1又は第2のデータグループD2を書き込めるだけの連続した空きセルが存在するかどうかを確認する(S37)。当該ブロックBに連続した空きセルが存在すれば(S37のYes)、このフローを終了する。当該ブロックBに連続した空きセルが存在しなければ(S37のNo)、当該ブロックBのデータを全て消去して(S38)、このフローを終了する。
次に、第1のデータグループD1のブロックへの書き込みについてより具体的に説明する。図5aは、ブロックB0の先頭のセルから第1のデータグループD11が書き込まれた状態を示す概念図である。これは図3のS2の状態である。左からブロックB0、ブロックB1、ブロックB2の順に並んでいる。ブロックB1とブロックB2の各セルは無色であるが、これは第1のデータグループD1及び第2のデータグループD2が書き込まれていないことを示している。
ブロックB1、ブロックB2、ブロックB3はそれぞれ32バイトの大きさで、1マスが1バイトである。第1のデータグループD1は、先頭から順に2バイトのチェックデータ11、4バイトの第1のデータ13、4バイトの第2のデータ14、3バイトの第3のデータ15、1バイトの更新回数データ12から構成される14バイトのデータである。第1のデータグループD1はアプリケーションソフトウェア4aで、第2のデータグループD2のデータ列はアプリケーションソフトウェア4bでそれぞれ作られる。
第1のデータ13、第2のデータ14、第3のデータ15は、車両用センサ5aから取得した検出データや設定値のデータである。チェックデータ11は、第1のデータ13、第2のデータ14、第3のデータ15を入力としてCRC(Cyclic Redundancy Check)演算により算出された誤り検出用のデータである。更新回数データ12は、第1のデータグループD11がブロックに書き込まれた回数を示すデータである。なお、太線で囲まれているデータグループが、書き込まれた最新の第1のデータグループD1である。
図5bは、図5aの状態から、ブロックB0に第2のデータグループD21が書き込まれた状態を示す概念図である。これは図4のS24からS25へ進んだ状態である。最新の第1のデータグループD11が書き込まれているブロックB0には、18バイトの空きセルがある。第2のデータグループD21は、先頭から順に2バイトのチェックデータ21、3バイトの第1のデータ23、2バイトの第2のデータ24、1バイトの更新回数データ22のように構成される8バイトのデータである。また、第2のデータグループD21を書き込んだ後でも第1のデータグループD11との間に2バイトの境界セル30を確保することができる。従って、第2のデータグループD21はブロックB0に書き込み可能である。第1のデータ23、第2のデータ24は、別の車両用センサ5bから取得した検出データや設定値のデータである。チェックデータ21と更新回数データ22は第1のデータグループD1と同じなので詳細な説明は割愛する。
第2のデータグループD2はブロックB0の後尾から書き込まれる。すなわち、ブロックB0の最後尾のセルからチェックデータ21、第1のデータ23、第2のデータ24、更新回数データ22の順に書き込まれる。なお、太線で囲まれているデータグループが、書き込まれた最新の第2のデータグループD2である。
図5cは、図5bの状態から、ブロックB0に第2のデータグループD22が書き込まれた状態を示す概念図である。これは図4のS24からS25へ進んだ状態である。図5bの状態で最新の第1のデータグループD11が書き込まれているブロックB0には10バイトの空きセルがある。第2のデータグループD22のデータサイズは8バイトである。また、第2のデータグループD22を書き込んだ後でも第1のデータグループD11との間に2バイトの境界セル30を確保することができる。従って、第2のデータグループD22はブロックB0に書き込み可能であり、第2のデータグループD21の最後尾(更新回数データ22)から連続してブロックB0に書き込まれる。なお、図5bで第2のデータグループD21が書き込まれている領域は図5cでは濃色のセルになっているが、これは第2のデータグループD21が存在していることを示している(以降の図でも同様)。
図5dは、図5cの状態から、ブロックB1に第1のデータグループD12が書き込まれた状態を示す概念図である。これは図3のS10からS12を経てS5へ進んだ状態である。図5cの状態で最新の第1のデータグループD11と最新の第2のデータグループD22が書き込まれているブロックB0には2バイトの空きセルがある。そのため、14バイトの第1のデータグループD12はブロックB0に書き込むことはできない。ブロックB1とブロックB2は共にデータ消去されておらず、また第1のデータグループD1も第2のデータグループD2も書き込まれていない。そこで第1のデータグループD12はブロックB1の先頭のセルから書き込まれる。
図5eは、図5dの状態から、ブロックB1に第1のデータグループD13が書き込まれた状態を示す概念図である。これは図3のS4からS5へ進んだ状態である。図5dの状態で、最新の第1のデータグループD12はブロックB1に書き込まれている。ブロックB1には18バイトの空きセルがあり、第1のデータグループD13のデータサイズは14バイトである。よって、第1のデータグループD13はブロックB1の第1のデータグループD12の最後尾(更新回数データ12)から連続してブロックB1に書き込まれる。
図5fは、図5eの状態から、ブロックB2に第2のデータグループD23が書き込まれた状態を示す概念図である。これは図4のS35からS25へ進んだ状態である。図5eの状態で最新の第1のデータグループD13が書き込まれているブロックB1には4バイトの空きがある。また、最新の第2のデータグループD22が書き込まれているブロックB0には2バイトの空きセルがある。第2のデータグループD23のデータサイズは8バイトなので、ブロックB0、ブロックB1のいずれにも書き込むことはできない。しかし、ブロックB2には既存の第1のデータグループD1も第2のデータグループD2も存在しない。よって、第2のデータグループD23はブロックB2の後尾のセルから書き込まれる。
図5gは、図5fの状態から、ブロックB0に書き込まれていたデータグループが消去された状態を示す概念図である。これは図4のS25からS37を経てS38へ進んだ状態である。図5fの状態で、最新の第1のデータグループD13はブロックB1に書き込まれており、最新の第2のデータグループD23はブロックB2に書き込まれている。また、ブロックB0の空きセルは2バイトなので、第1のデータグループD1も第2のデータグループD2もブロックB0に書き込むことはできない。よって、ブロックB0に書き込まれていた第1のデータグループD11、第2のデータグループD21、第2のデータグループD22を消去して、新たなデータグループの書き込みを可能にする。
図5hは、図5gの状態から、ブロックB2に第1のデータグループD14が書き込まれた状態を示す概念図である。これは図3のS7からS5へ進んだ状態である。図5gの状態で最新の第1のデータグループD13はブロックB1に書き込まれている。また、最新の第2のデータグループD23はブロックB2に書き込まれている。ブロックB1には4バイトしか空きセルがないが、ブロックB2は24バイトの空きセルがある。よって、第1のデータグループD14はブロックB2の先頭のセルから書き込まれる。
図5iは、図5hの状態から、ブロックB1に書き込まれていたデータグループが消去された状態を示す概念図である。これは図3のS5からS17、S18へ進んだ状態である。図5hの状態で、最新の第1のデータグループD14、最新の第2のデータグループD23はいずれもブロックB1に書き込まれている。また、ブロックB1の空きセルは4バイトであり、第1のデータグループD1も第2のデータグループD2も書き込むことはできない。よって、ブロックB1に書き込まれていた第1のデータグループD12、第1のデータグループD13を消去して、新たなデータグループの書き込みを可能にする。
図5jは、図5iの状態から、ブロックB0に第1のデータグループD15が書き込まれた状態を示す概念図である。これは図3のS10からSs12を経てS5へ進んだ状態である。図5iの状態で最新の第1のデータグループD14、最新の第2のデータグループD23は共にブロックB2に書き込まれている。また、ブロックB2には10バイトしか空きセルがない。よって、ブロックB2には第1のデータグループD15を書き込むことはできない。また、ブロックB0、ブロックB1とも32バイトの空きセルがあるが、どちらも消去回数は1回である。そこで、ブロックB1よりもブロックB0に優先的に書き込みを行う。よって、第1のデータグループD15はブロックB0の先頭のセルから書き込まれる。
以後も、図3、図4のフローに従って、第1のデータグループD1と第2のデータグループD2がブロックに書き込まれたり、ブロックのデータが消去されたりする。このようにブロックにある既存の最新の第1のデータグループD1と第2のデータグループD2の転記を行うことなく、新たな第1のデータグループD1と第2のデータグループD2とを書き足すことができる。従って、既存の最新の第1のデータグループD1や第2のデータグループD2の一部が破損、欠落してしまうおそれがない。また、ブロックにおけるデータ消去中や新たな第1のデータグループD1や第2のデータグループD2を書き込んでいる最中に通電が切断されても、既存の最新の第1のデータグループD1や第2のデータグループD2は残存しており、それらを誤りなく維持することができる。さらには、ブロックB0、B1、B2の残り消去回数を平準化できる。それにより、消去回数上限まで図3、図4のフローに沿って第1のデータグループD1と第2のデータグループD2を新たに書き込むことが可能になり、製品としての寿命を長くすることができる。
アプリケーションソフトウェア4a、アプリケーションソフトウェア4bは、第1のデータグループD1と第2のデータグループD2のブロックへの書き込み後に、その書き込みが正常に完了したかどうかの誤り検出をしている。図6に、第1のデータグループD11がブロックB0に正常に書き込まれたかどうかの誤り検出をするフローを示す。
まず、第1のデータ13、第2のデータ14、第3のデータ15を車両用センサ5aから取得し(S61)。アプリケーションソフトウェア4aは、取得した第1のデータ13、第2のデータ14、第3のデータ15からCRC演算により書き込み前のチェックデータ11aを算出する(S62)。そして、書き込み前のチェックデータ11aを先頭に、第1のデータ13、第2のデータ14、第3のデータ15、更新回数データ12を統合し、第1のデータグループD11を構成する(S63)。第1のデータグループD11は、図3の手順に従い、ドライバ3aによりフラッシュメモリ1に書き込まれる(S64)。
第1のデータグループD11のブロックB0への書き込みが完了すると、書き込みが正常に完了したか否かの誤り検出を行う。具体的には、ブロックB0に書き込まれた第1のデータ13、第2のデータ14、第3のデータ15がドライバ3aにより読み取られ(S65)、アプリケーションソフトウェア4aに送られる。アプリケーションソフトウェア4aは当該読み取られた第1のデータ13、第2のデータ14、第3のデータ15を入力として新たにCRC演算し、書き込み後のチェックデータ11bを算出する(S66)。そして、書き込み前のチェックデータ11aの値と書き込み後のチェックデータ11bの値とを比較する(S67)。書き込み前のチェックデータ11aと書き込み後のチェックデータ11bの値が同じであれば(S67のYes)、第1のデータ13、第2のデータ14、第3のデータ15はブロックB0に正しく書き込まれたと判断し、フローは終了する。書き込み前のチェックデータ11aと書き込み後のチェックデータ11bの値が異なっていれば、ブロックB0に正しく書き込まれなかったと判断される(S67のNo)。正しく書き込まれなかったと判断されたときには、再度図3の手順に従い、第1のデータグループD11をブロックBの他の空き領域に書き込む(S68)。このようにして、ブロックB0に書き込まれた第1のデータグループD11は正確性が担保される。
本発明は、書き換え可能な不揮発性メモリの一種であるフラッシュメモリに用いることが可能である。