以下に本発明の実施例について、図面と共に説明する。
図1に示す本実施例の電子制御装置(ECU)1は、車両に搭載されて、車両各部を制御するものである。この電子制御装置1は、車両に搭載されたセンサ類5からの出力信号に基づき、制御対象3としての車両に搭載された各種アクチュエータを制御することによって、車両各部を制御する。この電子制御装置1としては、例えば、エンジン制御を行う電子制御装置を挙げることができる。
具体的に、本実施例の電子制御装置1は、マイクロプロセッサ(MPU)11と、フラッシュROM13と、入出力回路15と、を備える。MPU11は、各種プログラムに従う処理を実行することによって、車両制御を実現する。このMPU11は、上記各種プログラムを記憶するROM11aと、ROM11aに記憶されたプログラムに基づく各種処理の実行時に作業領域として使用されるRAM11bと、を備える。
即ち、MPU11は、ROM11aに記憶された各種プログラムを実行することにより、入出力回路15を通じて、センサ類5からの出力信号を取得し、この出力信号に基づき、制御対象3への制御信号を生成し、これを入出力回路15を通じて、制御対象3に入力する。このような処理によって制御対象3を制御し、車両制御を実現する。
一方、電気的にデータ書換可能な不揮発性メモリとして知られるフラッシュROM13は、車両制御に関わる種々のデータを記憶する。例えば、電子制御装置1がエンジン制御用の電子制御装置である場合、フラッシュROM13には、この車両に固有のコードである車両識別コード(VIN)、イモビライザー用のコード、車両の診断結果を表すダイアグコード、フリーズフレームデータ、エンジン制御用の制御パラメータ等が記憶される。尚、この制御パラメータには、学習更新される制御パラメータ(以下、学習パラメータ)が含まれる。
学習パラメータは、その値がMPU11による車両制御の結果に従って学習更新されて、フラッシュROM13に書き込まれるものである。即ち、MPU11は、車両制御に際して、制御パラメータをフラッシュROM13からRAM11bに読み出し、この制御パラメータと、センサ類5からの出力信号とに基づき、制御対象3を制御する。そして、この制御結果に従って、RAM11b内の学習パラメータを更新し、更新後の学習パラメータを適当な時期にRAM11bからフラッシュROM13に書き込む。これによって、フラッシュROM13には、学習パラメータの最新値が書き込まれる。尚、学習パラメータのフラッシュROM13への書込は、例えば、一定時間毎や一定走行距離毎やイグニッションスイッチのオフ動作毎に実行される。
一方、ダイアグコードは、例えば、イグニッションスイッチがオンされてエンジンが始動されるときや、車両走行中にMPU11によって実行される車両診断の結果に従って、フラッシュROM13に書き込まれるものである。但し、ダイアグコードは、基本的に、車両診断の結果、車両の異常が検出されたときに限って、その値が変化し、フラッシュROM13への書込が必要となるものである。そして、車両診断により異常が検出される確率は高くない。このため、フラッシュROM13には、MPU11によって、低い頻度でダイアグコードが書き込まれる。
また、フリーズフレームデータは、エンジン制御等の異常が生じたときに、フラッシュROM13に書き込まれるものであり、異常発生時のエンジン状態を表すデータである。ダイアグコードと同様、フリーズフレームデータの書込が必要な異常の発生確率は高くないため、フラッシュROM13には、MPU11によって、低い頻度でフリーズフレームデータが書き込まれる。この他、VINコードや、イモビライザー用のコードについては、通常、車両への電子制御装置1の搭載時に限ってフラッシュROM13に書き込まれる。
ところで、本実施例のフラッシュROM13に記憶されるデータには、上述したように、学習パラメータのような書込頻度の高いデータや、ダイアグコードやフリーズフレームデータのような書込頻度の低いデータが混在する。このため、本実施例では、図2に示すように、フラッシュROM13が備える複数の記憶ブロックを、書込頻度の高いデータ記憶用の記憶ブロックと、書込頻度の低いデータ記憶用の記憶ブロックとに分けることによってグループ化し、フラッシュROM13内の記憶ブロック群におけるデータ消去回数のばらつきを抑えるようにしている。
電子制御装置1が備えるフラッシュROM13は、周知のフラッシュROMと同様のものであり、図2に示すように、複数の記憶ブロックを備える。このフラッシュROM13は、周知のフラッシュROMと同様、バイト単位でのデータ書込が可能であるものの、データ消去についてはブロック単位での消去が必要なものである。即ち、データ消去されリセットされた状態の記憶ブロックには、新規データをバイト単位で書き込むことができるものの、データが書き込まれた記憶ブロック内の領域に対しては、記憶ブロック全体に対してデータ消去動作(リセット動作)を行わない限り、新たなデータを上書きすることができない。
このようなデータ消去の制約があり、更に、データ消去回数にハードウェア上の上限がある既存のフラッシュROMによれば、フラッシュROMの寿命を考慮して、むやみに記憶ブロックを消去することができない。このため、本実施例では、例えば、学習パラメータの最新値を、フラッシュROM13を書き込む際、この学習パラメータの古い値をフラッシュROM13から消去せずに最新値をフラッシュROM13に追記することによって、学習パラメータの最新値を、古い値を残したままフラッシュROM13に記憶させる。このような追記動作の繰返しによれば、学習パラメータの最新値が更新される度に、記憶ブロック単位でのデータ消去を行わなくて済み、フラッシュROM13の長寿命化を図ることができる。
但し、このような追記動作の繰返しによっては、記憶ブロックの空き領域が徐々に減っていく。このため、空き領域のなくなった記憶ブロックについては、順次、この記憶ブロック内のデータを消去することによって、追記に必要な空き領域を確保する必要がある。
そして、このような手法でフラッシュROM13に対するデータ書込及びデータ消去を行う場合には、書込頻度(更新頻度)の高いデータ及び書込頻度の低いデータを分けずに同一記憶ブロックに書き込んでしまうと、次のような不都合が生じる。即ち、フラッシュROM13内において空き領域を確保するためには、記憶ブロック単位でデータ消去を行う必要があるため、一つの記憶ブロックに、書込頻度(更新頻度)の高いデータ及び書込頻度(更新頻度)の低いデータが混在していると、フラッシュROM13内において空き領域を確保するために、本来消去する必要のない最新データに該当する書込頻度の低いデータ(ダイアグコード等)まで消去し、この記憶ブロックに空き領域を確保しなければならない。このような処理では、本来消去する必要のないデータを一旦フラッシュROM13から消去し、このデータを、再度フラッシュROM13に書き込まなければならないため、データ消去及び書込の無駄が多い。
このような理由から、本実施例では、図2に示すように、フラッシュROM13が備える複数の記憶ブロックを、書込頻度の高いデータ記憶用の記憶ブロックと、書込頻度の低いデータ記憶用の記憶ブロックとにグループ化している。以下では、書込頻度の高いデータ記憶用の記憶ブロックのことを「高頻度ブロック」と表現し、書込頻度の低いデータ記憶用の記憶ブロックのことを「低頻度ブロック」と表現する。
ちなみに、図2には、フラッシュROM13が、第0記憶ブロックから第7記憶ブロックまでの合計8個の記憶ブロックを備える例を示すが、これは説明を簡単にするためのものであり、フラッシュROM13が備える記憶ブロック数が、この例に限定されないのは言うまでもない。
ここで注目すべきは、本実施例によれば高頻度ブロックの数が低頻度ブロックの数よりも大きくなるように、記憶ブロックのグループ化が行われることである。高頻度ブロックの数が低頻度ブロックの数よりも大きくなるようにグループ化を行う理由は、高頻度ブロックでのデータ消去回数を抑えるためである。本実施例では、上述したように追記動作によって学習データ等を書き込み、必要に応じて記憶ブロック単位でのデータ消去を行うが、高頻度ブロックの数を多くすると、空き領域を確保するためのデータ消去回数を記憶ブロック単位で抑えることができる。このような理由から本実施例では、高頻度ブロックの数が低頻度ブロックの数よりも大きくなるようにグループ化を行う。
また、本実施例の電子制御装置1は、このような書込頻度に応じたデータの振り分けを行うために、ROM11aにおいて振分表を記憶している(図1参照)。振分表は、低頻度ブロックに書き込むべき種類のデータのIDコードが列挙された第一のリストと、高頻度ブロックに書き込むべき種類のデータのIDコードが列挙された第二のリストと、を備える。本実施例においては、フラッシュROM13に書き込まれるデータについて、その種類毎に、IDコードが割り当てられており、各リストには、このようなIDコードを用いて、該当する種類のデータが記述される。
この振分表は、設計段階で、設計者により作成される。この振分表の作成に当っては、フラッシュROM13に書き込まれることが設計上決まっている種類のデータを、書込頻度によって区分化する。ここでは、フラッシュROM13に書き込まれることが決まっている種類のデータを、書込頻度が「高い」種類のデータと、書込頻度が「低い」種類のデータとに、区分する。そして、第一のリストには、書込頻度が「低い」種類のデータのIDコードを記述し、第二のリストには、書込頻度が「高い」種類のデータのIDコードを記述する。このようにして振分表は、予め設計段階で、電子制御装置1の設計者により作成され、ROM11aに書き込まれる。
そして、電子制御装置1のMPU11は、フラッシュROM13に対する書込対象データが生じると、図3に示す書込制御処理を実行して、ROM11aに記憶された振分表に基づき、フラッシュROM13へのデータ書込を行う。
電子制御装置1のMPU11は、フラッシュROM13に対する書込対象データが生じると、図3に示す書込制御処理を実行し、その書込対象データを生成したタスクから通知される書込対象データのIDコードと、ROM11aが記憶する振分表とに基づいて、書込対象データが低頻度ブロックに書き込むべき種類のデータであるか否かを判断する(S100)。即ち、振分表の区分に従って、書込対象データが、書込頻度の低い種類のデータとして区分されたデータであるか否かを判断する(S100)。
そして、書込対象データが、書込頻度の低い種類のデータとして区分されたものであり、低頻度ブロックに書き込むべき種類のデータであると判断すると(S100でYes)、S200に移行して、低頻度データ書込処理(詳細後述。図5参照)を実行する。この処理により、フラッシュROM13の低頻度ブロックに、書込対象データを書き込む。
一方、書込対象データが、書込頻度の高い種類のデータとして区分されたものであり、高頻度ブロックに書き込むべき種類のデータであると判断すると(S100でNo)、S300に移行して、高頻度データ書込処理(詳細後述。図6参照)を実行する。この処理により、フラッシュROM13の高頻度ブロックに、書込対象データを書き込む。その後、当該書込制御処理を終了する。
尚、本実施例のフラッシュROM13には、フラッシュROM13が備える記憶ブロックの内のいずれが低頻度ブロックであり、フラッシュROM13が備える記憶ブロックの内のいずれが高頻度ブロックであるかを表す低頻度ブロック群及び高頻度ブロック群についての設定情報が、グループ情報として記憶されている。MPU11は、このグループ情報に基づいて、フラッシュROM13が備える記憶ブロックの内のいずれが低頻度ブロックであり、フラッシュROM13が備える記憶ブロックの内のいずれが高頻度ブロックであるかを判断する。
尚、このグループ情報は、低頻度ブロックに書き込まれてもよいし、各記憶ブロックに設けられたブロックヘッダに格納されてもよい。例えば、このグループ情報は、低頻度ブロック群の先頭ブロックに書き込むことができ、低頻度ブロック群の先頭ブロックを基準に、低頻度ブロック及び高頻度ブロックの配置を記述した情報とすることができる。
また、図4には、フラッシュROM13が備える記憶ブロックの詳細を示す。各記憶ブロックは、ブロックヘッダを備え、ブロックヘッダには、その記憶ブロックにおけるデータ消去回数(リセット回数)を表す情報、その記憶ブロックが空きブロックであるか否かを表す空きブロック情報、その記憶ブロックが書込対象データの書込先ブロックであるか否かを表す書込先情報が格納される。各記憶ブロックのブロックヘッダには、これらの情報に加えて、その記憶ブロックが低頻度ブロック及び高頻度ブロックのいずれであるかを表すグループ情報を格納することも可能である。その他、電子制御装置1が仮に、フラッシュROM13とは別のデータ書換可能な不揮発性メモリを備える場合には、そのメモリに上記グループ情報を書き込むことも可能である。
ちなみに、フラッシュROM13が備える各記憶ブロックのブロックヘッダ以外の領域には、各データがデータヘッダと対でMPU11の処理動作により書き込まれる。データヘッダは、対となるデータの種類を表す上記IDコードと、このデータの格納先を表すデータポインタと、を備える。上記ブロックヘッダは、記憶ブロックの先頭に設けられるが、データヘッダは、ブロックヘッダに続いて記憶ブロックの先頭側から末尾側へと順に格納される。一方、データヘッダと対となって書き込まれる上記データは、記憶ブロックの末尾側から先頭側へと順に格納される。
尚、本実施例において、上記グループ情報がフラッシュROM13に格納されるのは、低頻度ブロック及び高頻度ブロックのグループ分けが適宜変更されるためである。本実施例では、図9に示すように、低頻度ブロック群の領域(図9斜線部分)、及び、高頻度ブロック群の領域(図9斜線のない部分)を、図2に示す状態から、各記憶ブロックのデータ消去回数(リセット回数)に基づき、フラッシュROM13において循環するようにシフトさせる。このようにして、本実施例では、低頻度ブロック及び高頻度ブロックを入れ替えて、記憶ブロック群を再グループ化する。このため、上記グループ情報については、更新可能なようにフラッシュROM13に書き込まれる。本実施例によれば、グループ分けが変更されることから、上記グループ情報については、その最新値を記憶保持できるように管理する必要がある。しかしながら、このような管理ができれば、上述したように、グループ情報は、必ずしもフラッシュROM13に書き込まれる必要はない。以下では、フラッシュROM13に上記グループ情報を記憶保持する例を説明するが、本発明は、このような構成に限定されないことを、念のため、ここで言及しておく。
続いて、上述したS200で実行される低頻度データ書込処理の詳細について、図5を用いて説明する。低頻度データ書込処理を開始すると、MPU11は、フラッシュROM13内の上記グループ情報を参照して、低頻度ブロックに該当する記憶ブロックを特定すると共に、各記憶ブロックのブロックヘッダに記憶された書込先情報を参照し、低頻度ブロック群の内、書込先ブロックに設定されている記憶ブロックを特定する(S210)。尚、書込先ブロックは、低頻度ブロック群及び高頻度ブロック群の夫々に対して一つ設定されるものであり、書込対象データが生じたときに、その書込対象データを書き込むべき記憶ブロックに該当するものである。
以下では、図2に示すように、フラッシュROM13が備える記憶ブロックを、先頭から順に第0記憶ブロック、第1記憶ブロック、…、第7記憶ブロックと表現し、第m(m=0,1,…7)ブロックに対して記号B[m]を割り当てる。また、これとは独立して、フラッシュROM13が備える記憶ブロックの内の低頻度ブロックを、先頭から順に第0低頻度ブロック、第1低頻度ブロックと表現し、第v(v=0,1)低頻度ブロックに対して記号LB[v]を割り当てる。また、これとは独立して、フラッシュROM13が備える記憶ブロックの内の高頻度ブロックを、先頭から順に第0高頻度ブロック、第1高頻度ブロック、…、第5高頻度ブロックと表現し、第w(w=0,1,…5)高頻度ブロックに対して記号HB[w]を割り当てる。
S210において特定された低頻度ブロック群の書込先ブロックが、第v1低頻度ブロックLB[v1]であり、低頻度ブロックの先頭が第m0記憶ブロックB[m0]である場合、低頻度ブロックLB[v1]は、第mod(m0+v1,8)記憶ブロックB[mod(m0+v1,8)]に一致する。但し、関数mod(α,β)は、値αを値βで割ったときの余りを示す。本実施例では、上述したように、低頻度ブロック群の領域及び高頻度ブロック群の領域の夫々を、ひとまとまりの状態でフラッシュROM13内を循環させるようにシフトさせる。このため、低頻度ブロックと、記憶ブロックとの間には、上述のような関係が成立する。
S210で、低頻度ブロック群の書込先ブロックLB[v1]を特定すると、MPU11は、S220に移行し、この書込先ブロックLB[v1]に、空き領域が存在するか否かを判断する。そして、空き領域が存在すると判断すると(S220でYes)、書込対象データを、この書込先ブロックLB[v1]の空き領域に、上述した規則でデータヘッダと共に書き込む(S230)。その後、当該低頻度データ書込処理を終了する。
一方、書込先ブロックLB[v1]に空き領域がなく、書込対象データを書込先ブロックLB[v1]に書き込むことができないと判断すると(S220でNo)、MPU11は、S240に移行し、書込対象データを、低頻度ブロック群において、書込先ブロックLB[v1]の次ブロックに該当する第mod(v1+1,2)低頻度ブロックLB[mod(v1+1,2)]に書き込む。即ち、書込先ブロックLB[v1]が第0低頻度ブロックである場合には、次ブロックである第1低頻度ブロックに書き込み、書込先ブロックLB[v1]が第1低頻度ブロックである場合には、次ブロックである第0低頻度ブロックに書き込む。
但し、本実施例では、設計上、第1低頻度ブロックが一杯となる前に、上述した低頻度ブロック群及び高頻度ブロック群の入れ替えが行われて、低頻度ブロック群のデータ消去が行われるため(詳細後述)、第1低頻度ブロックに空き領域がないという事態は通常発生しない。
このため、第1低頻度ブロックに空き領域がないことが原因で書込対象データを第0低頻度ブロックに書き込む必要が生じることは通常ないが、仮に、そのような事態が生じた場合には、第0低頻度ブロック内のデータの内、フラッシュROM13で継続して記憶保持すべきデータをRAM11bに一旦退避させた後、第0低頻度ブロック内のデータをブロック単位で消去し、その後、RAM11bに退避させたデータを、第0低頻度ブロックに書き込みつつ、上記書込対象データを第0低頻度ブロックに書き込む。このような動作により、低頻度ブロックでの記憶保持が不要となったデータを破棄して空き領域を確保し、その空き領域に、上記書込対象データを書き込む。
更に付言すると、本実施例では、低頻度ブロックで記憶保持すべきデータの量が、低頻度ブロック群の全記憶容量を超えないものとする。即ち、不要データの削除によっても、低頻度ブロック群の空き領域を確保することができず、新規の書込対象データを、低頻度ブロック群に書き込むことができない事態は、本実施例において想定されていない。尚、本実施例の電子制御装置1は、低頻度ブロック群の内、一つの低頻度ブロックを空きブロックとして確保することができるように、設計されている。このような設計によれば、不要データを削除することで、低頻度ブロックに該当する記憶ブロックの一つを必ず空きブロックとすることが可能である。
S240での処理を終えると、MPU11は、今回書込対象データを書き込んだ低頻度ブロックLB[mod(v1+1,2)]を、次回書込対象データが生じた場合の書込先ブロックに設定し、この設定情報を、書込先情報として低頻度ブロックLB[mod(v1+1,2)]のブロックヘッダに書き込んで(S250)、当該低頻度データ書込処理を終了する。
但し、上述したようにブロックヘッダについても、ブロック単位でのデータ消去を行わなければ、データの上書きをすることはできない。このため、書込先情報についても、追記の形式でブロックヘッダに書き込む。例えば、各記憶ブロックにおける書込先情報の領域については、この記憶ブロックが書込先ブロックに選択されるまでリセット時の状態(データ消去時の状態)に維持する。そして、書込先ブロックに選択された場合には、その記憶ブロックにおける書込先情報の領域に、この記憶ブロックが書込先ブロックであることを示す情報を上記書込先情報として書き込む。更に付言すれば、最新の書込先ブロックを書込先情報から特定できるように、上記書込先情報には、例えば、この情報の書込時刻や、書込先ブロックの設定毎にカウントアップされるシーケンシャルな番号を記述する。このような手順で上記書込先情報を書き込めば、最新の書込先ブロックを上記書込先情報から特定することが可能である。
続いて、上述したS300で実行される高頻度データ書込処理の詳細について、図6を用いて説明する。高頻度データ書込処理を開始すると、MPU11は、まず、フラッシュROM13内のグループ情報を参照し、高頻度ブロックに該当する記憶ブロックを特定すると共に、各記憶ブロックのブロックヘッダに記憶された書込先情報を参照し、高頻度ブロック群の内、書込先ブロックに設定されている記憶ブロックを特定する(S310)。ここでは、特定された高頻度ブロックの書込先ブロックを、第w1高頻度ブロックHB[w1]と表現する。本実施例によれば、フラッシュROM13において、低頻度ブロック群に続く記憶ブロック群が高頻度ブロック群に設定されるため、低頻度ブロック群の先頭ブロックが第m0記憶ブロックB[m0]である場合、高頻度ブロック群の先頭ブロックは、第mod(m0+2,8)記憶ブロックB[mod(m0+2,8)]になる。従って、高頻度ブロックHB[w1]は、第mod(m0+2+w1,8)記憶ブロックB[mod(m0+2+w1,8)]に一致する。
S210で、高頻度ブロックの書込先ブロックHB[w1]を特定すると、MPU11は、S320に移行し、書込先ブロックHB[w1]に、書込対象データを格納可能な空き領域が存在するか否かを判断し、空き領域が存在すると判断すると(S320でYes)、この書込先ブロックHB[w1]に、書込対象データを、上述した規則でデータヘッダと共に書き込む(S330)。その後、当該高頻度データ書込処理を終了する。
一方、書込先ブロックHB[w1]に、書込対象データを格納可能な空き領域がなく、書込対象データをHB[w1]に書き込むことができないと判断すると(S320でNo)、MPU11は、S340に移行し、書込対象データを、高頻度ブロック群において、書込先ブロックHB[w1]の次ブロックに該当する第mod(w1+1,6)高頻度ブロックHB[mod(w1+1,6)]に書き込む。
即ち、書込先ブロックが第0高頻度ブロックである場合には、第1高頻度ブロックに書込対象データを書き込み、書込対象データが第1高頻度ブロックである場合には、第2高頻度ブロックに書込対象データを書き込み、書込先ブロックが第5高頻度ブロックである場合には、第0高頻度ブロックに書込対象データを書き込む。
更に、MPU11は、3つの高頻度ブロックを空きブロックとして保持するために、高頻度ブロック群において、書込対象データを書き込んだ高頻度ブロックHB[mod(w1+1,6)]よりも3つ先の高頻度ブロックHB[mod(w1+4,6)]内のデータをブロック単位で消去し、高頻度ブロックHB[mod(w1+4,6)]を空きブロックに設定する(S350)。
即ち、今回書込対象データを書き込んだ記憶ブロックが第0高頻度ブロックである場合には、第3高頻度ブロックのデータを消去し、今回書込対象データを書き込んだ記憶ブロックが第1高頻度ブロックである場合には、第4高頻度ブロックのデータを消去し、今回書込対象データを書き込んだ記憶ブロックが第3高頻度ブロックである場合には、第0高頻度ブロックのデータを消去する。
但し、消去に先駆けては、消去対象の高頻度ブロックHB[mod(w1+4,6)]で記憶中のデータの内、フラッシュROM13にて継続して記憶保持すべきデータを、一旦RAM11bに退避させる。そして、このRAM11bに退避させたデータを、上記規則に従ってデータヘッダと共に、書込対象データと同じ高頻度ブロックHB[mod(w1+1,6)]に書き込む。その後、消去対象の高頻度ブロックHB[mod(w1+4,6)]内のデータをブロック単位で消去することで、高頻度ブロックHB[mod(w1+4,6)]を空きブロックに設定する(S350)。
図7には、このようなデータ消去の流れを(a)〜(f)の順に時系列で示す。(a)は、フラッシュROM13の全記憶ブロックがデータ消去された状態(初期状態)において、書込頻度の高い種類の書込対象データ(IDコード=***1)が生じ、S330の処理によって、これが第0高頻度ブロックに書き込まれたときの第0〜第3高頻度ブロックの状態を示す図である。この時の第1〜第5高頻度ブロックは、空きブロックの状態にある。一方、(b)は、(a)に示す状態から、新たに書込頻度の高い種類の書込対象データ(IDコード=***2)が生じ、S330の処理によって、第0高頻度ブロックに、このIDコード=****2の書込対象データが書き込まれたときの第0〜第3高頻度ブロックの状態を示す図である。
また、(c)は、(a)で書き込まれたIDコード=***1に対応する最新データ(例えば学習データの最新値)が、新たに書込対象データとして生じ、S330の処理によって、これが第0高頻度ブロックに追記されたときの第0〜第3高頻度ブロックの状態を示す図である。この図からも理解できるように、追記によって、高頻度ブロックには、IDコード=***1に対応するデータとして最新データと旧データとが混在した状態にされる。このようにしてIDコード=***1に対応する最新データがフラッシュROM13に書き込まれると、IDコード=***1に対応する旧データは、フラッシュROM13において記憶保持が不要となった破棄可能なデータとして扱われる。
また、(d)は、(c)に示す状態から書込対象データの第0高頻度ブロックへの書込が繰返し行われて、第0高頻度ブロックに空き領域がなくなり、新たな書込対象データ(IDコード=***1)が、S340の処理によって、第0高頻度ブロックに続く第1高頻度ブロックに書き込まれたときの第0〜第3高頻度ブロックの状態を示す図である。この時点において、フラッシュROM13には、IDコード=***1のデータが複数記憶されていることになるが、最新データ以外の旧データは、破棄可能な不要なデータとして扱われる。尚、S340の処理後には、通常、S350の処理が行われるが、(d)に示す時点では、第4高頻度ブロックが空きブロックの状態であるので、このケースでは、例外的にS350の処理がスキップされて、後続の処理が実行される。即ち、本実施例では、消去対象の記憶ブロックが空きブロックである場合、この記憶ブロックに対するデータ消去動作を行わないものとする。
また、(e)は、(d)に示す状態から書込対象データの高頻度ブロック群への書込が繰返し行われて、第2高頻度ブロックに空き領域がなくなり、新たな書込対象データ(IDコード=***3)が、S340の処理によって、第3高頻度ブロックに書き込まれたときの第0〜第3高頻度ブロックの状態を示す図である。この状態では、S340の処理後、S350の処理が行われることで、第0高頻度ブロック内のデータが消去されるが、それに先駆けては、消去対象の高頻度ブロックが記憶するデータの内、フラッシュROM13内で継続して記憶保持すべきデータ(最新データが消去対象の高頻度ブロックにおいて記憶されるIDコード=****2のデータ)が、書込対象データと同じ第3高頻度ブロックに書き込まれる。
その後、第0高頻度ブロック内のデータは、(f)に示すように消去されて、第0高頻度ブロックは、空きブロックに設定される。(f)は、第0高頻度ブロック内のデータが消去されたときの第0〜第3高頻度ブロックの状態を示す図である。
S350での処理を終えると、MPU11は、S360に移行し、データ消去を行った記憶ブロック(高頻度ブロックHB[mod(w1+4,6)])のデータ消去回数を、該当記憶ブロックのブロックヘッダに書き込む。尚、データ消去回数の情報については、該当記憶ブロックのデータ消去前に、そのブロックヘッダからRAM11bに読み出し、該当記憶ブロックのデータ消去後に、読み出したデータ消去回数に1加算した値をブロックヘッダに書き込むことにより、これまでのデータ消去回数の累積をブロックヘッダに書き込む。
また、この処理を終えると、MPU11は、S370に移行し、今回書込対象データを書き込んだ高頻度ブロックHB[mod(w1+1,6)]を、次回書込対象データが生じた場合の書込先ブロックに設定し、この設定情報を、S250と同様の手法で、高頻度ブロックHB[mod(w1+1,6)]のブロックヘッダに書き込む(S370)。その後、S380に移行する。
S380に移行すると、MPU11は、今回消去対象となった記憶ブロック(高頻度ブロックHB[mod(w1+4,6)])が、第0高頻度ブロックHB[0]であるか否かを判断する。そして、第0高頻度ブロックHB[0]でないと判断すると(S380でNo)、当該高頻度データ書込処理を終了する。一方、今回消去対象となった記憶ブロック(高頻度ブロックHB[mod(w1+4,6)])が、第0高頻度ブロックHB[0]であると判断すると、S390に移行する。
また、S390では、今回消去対象となった記憶ブロック(高頻度ブロックHB[mod(w1+4,6)])のデータ消去回数が、100*C回以上であるか否かを判断する。尚、変数Cの値については、上記グループ情報と同様、フラッシュROM13(低頻度ブロックやブロックヘッダ等)に記憶保持することができ、初期値は「1」である。
そして、今回消去対象となった記憶ブロックのデータ消去回数が、100*C回未満であると判断すると(S390でNo)、当該高頻度データ書込処理を終了し、データ消去回数が、100*C回以上であると判断すると(S390でYes)、S400に移行する。
S400に移行すると、MPU11は、S400を含むその後の処理(具体的にはS400〜S440の処理)によって、低頻度ブロック群の領域を、フラッシュROM13において記憶ブロック一つ分末尾側にシフトさせる。これによって、高頻度ブロック群及び低頻度ブロック群を再グループ化する。
再グループ化に際しては低頻度ブロック群内のデータを消去するため、まずS400では、フラッシュROM13における低頻度ブロック群内のデータであって、現在以降も継続してフラッシュROM13で記憶保持が必要なデータを、RAM11bに退避させる。即ち、低頻度ブロック群に記憶される各IDコードに対応するデータ群の内の最新データを、記憶保持が必要なデータとして、RAM11bに退避させる。
図8(a)には、高頻度ブロックHB[0]に対応する第2記憶ブロックB[2]のデータ消去回数が100回となったときの再グループ化の態様を示す。図8(a)に示す例では、第0記憶ブロックB[0]及び第1記憶ブロックB[1]が夫々順に低頻度ブロックLB[0],LB[1]であるため、第0記憶ブロックB[0]及び第1記憶ブロックB[1]に記憶されているデータの内、現在以降も継続してフラッシュROM13での記憶保持が必要なデータを、RAM11bに退避させる。この際、ブロックヘッダにおいて記憶されるデータ消去回数の情報もRAM11bに退避させる。
その後、MPU11は、S410に移行し、各低頻度ブロックLB[0],LB[1]内のデータをブロック単位で消去し(S410)、そのデータ消去が行われた各記憶ブロックの上記RAM11bに退避されたデータ消去回数を、データ消去前の値から1加算した値に更新して、この更新後のデータ消去回数の情報を、対応する記憶ブロックのブロックヘッダに書き込む(S420)。図8(a)に示す例によれば、第0記憶ブロックB[0]及び第1記憶ブロックB[1]内のデータを消去し、これら各記憶ブロックB[0],B[1]のブロックヘッダにおけるデータ消去回数の情報を更新する。
その後、MPU11は、低頻度ブロックLB[0],LB[1]の領域をフラッシュROM13において記憶ブロック一つ分末尾側にシフトさせるようにして、低頻度ブロック群及び高頻度ブロック群を再グループ化する(S430)。即ち、現在の低頻度ブロックLB[0],LB[1]が記憶ブロックB[m0],B[m0+1]に対応する場合には、新たな低頻度ブロックLB[0],LB[1]として、記憶ブロックB[mod(m0+1,8)],B[mod(m0+2,8)]を設定する。また、新たな高頻度ブロックHB[0],HB[1],…,HB[5]として、記憶ブロックB[mod(m0+3,8)],B[mod(m0+4,8)],…,B[mod(m0+8,8)]を設定する。図8(a)に示す例によれば、新たな低頻度ブロックLB[0],LB[1]として順に、第1記憶ブロックB[1]及び第2記憶ブロックB[2]を設定し、新たな高頻度ブロックHB[0],HB[1],HB[2],HB[3],HB[4],HB[5]として、記憶ブロックB[3],B[4],B[5],B[6],B[7],B[0]を設定する。
尚、この設定動作は、例えば、フラッシュROM13における新たな低頻度ブロック群の先頭ブロックLB[0]=B[mod(m0+1,8)]に、この新たな低頻度ブロック群及び高頻度ブロック群の設定内容を表す上記グループ情報を書き込むことにより、実現することができる。
また、このような設定動作に伴って、MPU11は、新たな低頻度ブロック群の先頭ブロックを書込先ブロックに設定して、該当する記憶ブロックのブロックヘッダに、この設定情報を上記書込先情報として書き込む。
その後、MPU11は、新たな低頻度ブロック群の先頭ブロックLB[1]に、上記RAM11bに退避させた「現在以降も継続してフラッシュROM13での記憶保持が必要なデータ」を書き込んで、これらのデータを低頻度ブロックに復帰させる(S440)。即ち、図8(a)に示す例によれば、第1記憶ブロックB[1]に対して退避データを書き込む。
S440の処理後、MPU11は、変数Cの値を更新し、更新後の変数Cの値を、フラッシュROM13(低頻度ブロック)に書き込む(S450)。具体的には、変数Cの現在値に値δを加算し、この加算後の変数Cの値を、フラッシュROM13(低頻度ブロック)に書き込む。ここで、値δとしては次の値を用いる。即ち、再グループ化後の低頻度ブロック群の先頭ブロックが第m0記憶ブロックB[m0]であるものとすると、mod(m0,8)が値6又は値7である場合には、値δ=0を用いて、変数Cの値を更新し、mod(m0,8)が値6及び値7のいずれでもない場合には、値δ=1を用いて、変数Cの値を更新する。
変数Cの値については、S410における低頻度ブロック群のデータ消去前に、予めS400で低頻度ブロックから読み出して、RAM11bに退避させておく。そして、変数Cの値について、S440の処理とは別に、S450の処理で、上述したように更新した後、フラッシュROM13に書き込む。尚、S440の処理及びS450の処理については、その実行順序を逆にされてもよい。
MPU11は、このようにしてS450での処理を終えると、当該高頻度データ書込処理を終了する。
以上に高頻度データ書込処理の内容について説明したが、この処理に従う再グループ化の具体例について、図8(a)(b)及び図9を用いて説明する。
本実施例においては、図8(a)の処理により低頻度ブロック群及び高頻度ブロック群の再グループ化が行われると、変数Cは、値1から値2に更新される。このため、その後には、第0高頻度ブロック(第3記憶ブロックB[3])のデータ消去回数が200回となるまで、低頻度ブロック群及び高頻度ブロック群の再グループ化は行われない。
そして、図8(b)に示すように、第0高頻度ブロックHB[0](第3記憶ブロックB[3])のデータ消去回数が200回となると、2回目の再グループ化の条件が満足されて、低頻度ブロックである第1記憶ブロックB[1]及び第2記憶ブロックB[2]に記憶されたデータの退避動作(S400)、並びに、第1記憶ブロックB[1]及び第2記憶ブロックB[2]のデータ消去動作及びデータ消去回数の更新動作(S410,S420)が行われる。更に、低頻度ブロック群及び高頻度ブロック群の再グループ化動作及び退避データの低頻度ブロック群の先頭ブロックへの書込動作(S430,S440)が実行される。これにより、低頻度ブロックは、第1記憶ブロックB[1]及び第2記憶ブロックB[2]から第2記憶ブロックB[2]及び第2記憶ブロックB[3]に変更される(図8(b)斜線部分)。また、このとき、変数Cは、値2から値3に更新される。
このような変数Cの更新によって、図9に示すように、3回目の再グループ化は、第0高頻度ブロックHB[0]である第4記憶ブロックB[4]のデータ消去回数が300回となると実行され、低頻度ブロックは、第2記憶ブロックB[2]及び第3記憶ブロックB[3]から第3記憶ブロックB[3]及び第4記憶ブロックB[4]に変更される。また、変数Cは、値3から値4に更新される。尚、図9においては、低頻度ブロック群及び高頻度ブロック群の設定(再グループ化)直後の低頻度ブロック群を斜線で示す。
同様にして、4回目の再グループ化は、第0高頻度ブロックHB[0]である第5記憶ブロックB[5])のデータ消去回数が400回となると実行され、低頻度ブロックは、第3記憶ブロックB[3]及び第4記憶ブロックB[4]から第4記憶ブロックB[4]及び第5記憶ブロックB[5]に変更される。また、変数Cは、値4から値5に更新される。
また、5回目の再グループ化は、第6記憶ブロックB[6]のデータ消去回数が500回となると実行され、低頻度ブロックは、第4記憶ブロックB[4]及び第5記憶ブロックB[5]から第5記憶ブロックB[5]及び第6記憶ブロックB[6]に変更される。また、変数Cは、値5から値6に更新される。
また、6回目の再グループ化は、第7記憶ブロックB[7]のデータ消去回数が600回となると実行され、低頻度ブロックは、第5記憶ブロックB[5]及び第6記憶ブロックB[6]から第6記憶ブロックB[6]及び第7記憶ブロックB[7]に変更される。
但し、6回目の再グループ化については、その再グループ化後の低頻度ブロックの先頭ブロックが、第m0=6記憶ブロックであるため、上述したようにδ=0が用いられて、変数Cは、値6に維持される。このような変数Cの値設定は、記憶ブロック群全体でのデータ消去回数のばらつきを抑える目的で行われる。
このようにして、変数Cが値6に維持されるため、7回目の再グループ化は、第0高頻度ブロックHB[0]である第0記憶ブロックB[0]のデータ消去回数が600回となると実行され、低頻度ブロックは、第6記憶ブロックB[6]及び第7記憶ブロックB[7]から第7記憶ブロックB[7]及び第0記憶ブロックB[0]に変更される。また、7回目の再グループ化については、その再グループ化後の低頻度ブロックの先頭ブロックが、第m0=7記憶ブロックであるため、上述したようにδ=0が用いられて、変数Cは、値6に維持される。
また、8回目の再グループ化は、第0高頻度ブロックHB[0]である第1記憶ブロックB[1]のデータ消去回数が600回となると実行され、低頻度ブロックは、第7記憶ブロックB[7]及び第0記憶ブロックB[0]から第0記憶ブロックB[0]及び第1記憶ブロックB[1]に変更される。8回目の再グループ化については、その再グループ化後の低頻度ブロックの先頭ブロックが、第m0=0記憶ブロックであるため、上述したようにδ=1が用いられて、変数Cは、値7に更新される。
このように変数Cを更新すると、各記憶ブロックのデータ消去回数は、図9に示すように概ね均一となる。よって、本実施例にように低頻度ブロック群及び高頻度ブロック群をデータ消去回数に応じて適宜入れ替えてフラッシュROM13を管理すると、各記憶ブロックのデータ消去回数のばらつきを適切に抑えることができて、フラッシュROM13の長寿命化を図ることができる。
最後に、本実施例においてアプリケーションプログラム(タスク)からの読出指示に従って、フラッシュROM13からデータを読み出す際の処理動作について、簡単に説明する。このような読出指示が入力されると、MPU11は、読出指示と共に通知された読出対象のデータ種類を表すIDコードの情報に基づき、読出対象データが低頻度ブロックで記憶されるデータであるか、それとも高頻度ブロックで記憶されるデータであるかを判断する。
そして、低頻度ブロックで記憶されるデータである場合には、低頻度ブロック群を参照して、データヘッダに記述されたIDコードの情報に基づき、読出対象データに対応するIDコードに対応付けられたデータを、低頻度ブロックから読み出す。この際には、当然のことながら読出対象データに対応するIDコードに対応付けられたデータ群の内、最新データに対応するデータを、低頻度ブロックから読み出して、これを読出指示元に渡す。
一方、読出対象のデータが高頻度ブロックで記憶されるデータである場合には、高頻度ブロック群を参照して、データヘッダに記述されたIDコードの情報に基づき、読出対象データに対応するIDコードに対応付けられたデータを、高頻度ブロックから読み出す。この際には、当然のことながら読出対象データに対応するIDコードに対応付けられたデータ群の内、最新データに対応するデータを、高頻度ブロックから読み出して、これを読出指示元に渡す。
以上、本発明の実施例について説明したが、用語間の対応関係については、次の通りである。即ち、MPU11が実行するS100の処理は、判定手段によって実現される処理の一例に対応し、MPU11が実行するS430の処理は、グループ化手段によって実現される処理の一例に対応する。また、MPU11が実行するS230,S240,S330,S340の処理は、書込制御手段によって実現される処理の一例に対応する。その他、MPU11が実行するS350,410の処理は、消去手段によって実現される処理の一例に対応する。
また、本発明は、上記実施例に限定されるものではなく、種々の態様を採ることができる。例えば、上記実施例では、書込頻度を高低の二段階で区分して、フラッシュROM13が記憶する記憶ブロック群を、低頻度ブロックのグループと、高頻度ブロックのグループとにグループ化するようにしたが、書込頻度については高中低などの三段階以上の区分数で区分して、フラッシュROM13が記憶する記憶ブロック群を、その区分数に対応した数のグループでグループ分けするようにしてもよい。例えば、書込頻度を高中低の三段階に区分する場合には、フラッシュROM13が記憶する記憶ブロック群を、低頻度ブロックのグループと、中頻度ブロックのグループと、高頻度ブロックのグループと、にグループ化することができる。
グループを3つ以上とした場合であっても、上記実施例のように、これらのグループの領域をフラッシュROM13内で循環させるようにシフトして、記憶ブロック群の再グループ化を行えば、各記憶ブロックでのデータ消去回数のばらつきを抑えることができて、フラッシュROM13の長寿命化を図ることができる。
尚、グループを3つ以上とする場合でも、書込頻度が最も高いグループに属する記憶ブロック群のデータ消去回数(例えば先頭ブロックのデータ消去回数)に注目して、このデータ消去回数に応じて、記憶ブロック群の再グループ化を行うことで、記憶ブロック間のデータ消去回数が大きく乖離しない適切な時期に再グループ化を行うことができて、フラッシュROM13の長寿命化を図ることができる。
また、本実施例では、低頻度ブロック群及び高頻度ブロック群の領域を、再グループ化の度に、記憶ブロック一つ分ずつシフトことにより、記憶ブロックのグループ間の入れ替えを行い、各記憶ブロックが、適切な割合で低頻度ブロック及び高頻度ブロックに設定されるようにしたが、グループを3つ以上とする場合でも、これら各グループの領域を記憶ブロック一つ分ずつ移動させることにより、記憶ブロック群の再グループ化を行うことができる。このように再グループ化を行えば、各記憶ブロックが、適切な割合で各グループに設定されてグループ間を循環するように、再グループ化を行うことができ、データ消去回数のばらつきを適切に抑えることができる。
また、本発明は、車両制御用の電子制御装置1に限定されるものではなく、その他の種々の電子機器に適用することができる。