以下、添付された図面を参照し、本発明を実施するための実施形態について詳述する。
[自動車用電子制御装置のハード構成例]
図1は、自動車用電子制御装置のハード構成例を示す図である。図1に示す自動車用電子制御装置100は、例えば、自動車に搭載され、エンジン、自動変速機、燃料ポンプ等を電子制御するデバイスである。
自動車用電子制御装置100は、プロセッサ110と、RAM(Random Access Memory)120と、フラッシュメモリ130と、バス140とを備える。プロセッサ110、RAM120及びフラッシュメモリ130は、バス140を介して、互いに接続されている。なお、プロセッサ110は、制御部の一例であり、フラッシュメモリ130は、不揮発性メモリの一例である。
プロセッサ110は、自動車用電子制御装置100の統括的な制御を行うものである。具体的には、プロセッサ110は、RAM120及びフラッシュメモリ130へのアクセスを制御する。なお、プロセッサ110は、CPU(Central Processing Unit)コアが複数設けられているコアプロセッサの構成であってもよい。
RAM120は、例えば、演算処理等に用いられるデータの一時的な作業領域となるメモリであって、電源供給が遮断されると、記憶内容が消える揮発性メモリである。なお、RAM120は、例えば、ダイナミックRAMやスタティックRAMであってもよい。
フラッシュメモリ130は、例えば、EEPROM等、電源供給を遮断してもデータが保持される不揮発性の半導体メモリである。フラッシュメモリ130は、データの再書込みが可能な複数のバンクを有する。バンクは、記憶領域の一例であって、本実施形態では、フラッシュメモリ130の最小消去単位(以下「セクタ」という。)を複数のバンクに分割して、データを記憶する。
図1に示す通り、フラッシュメモリ130は、データを記憶する複数のバンクを有する第1セクタ13aと、そのデータの複製データを記憶する複数のバンクを有する第2セクタ13bとを含む。つまり、各バンクは、複製データ(同一データ)を保管するバンク(ミラーバンク)を有し、異なるセクタ上に設定される。なお、第1セクタ13a上の各バンクは、第1領域の一例であり、第2セクタ13b上の各バンクは、第2領域の一例である。
図2、図3は、バンクの構成例を説明する図である。図2では、図1に示す第1セクタ13aの一例として、第1セクタ13aに含まれるセクタS0、S1を複数のバンクBに分割した場合を例示している(第2セクタ13bも同様)。なお、バンクBに付与された番号は、バンクBを指定するための配列番号(アドレス番号)の一例である。ここで、配列番号は、例えば、0,1,2,・・・N(バンク数−1)とする。セクタS0は、バンクB0〜B3を有し、セクタS1は、B4〜B7を有している。
また、図3では、図1に示す第1セクタ13aの一例として、複数のセクタで1つのバンクBを構成した場合について例示している(第2セクタ13bも同様)。例えば、セクタS0,S1でバンクB0を構成している。セクタS2〜S15についても、図3に示す通り、各々のバンクB1〜バンクB7を構成している。
図4は、バンクのデータ構造の一例を説明する図である。例えば、バンクB0を代表して説明すると、バンクB0は、シーケンス番号と、チェックデータと、実際のデータを書込む格納データとを含むデータ構造を有する(他のバンクも同様)。なお、シーケンス番号は、識別子の一例である。本実施形態では、例えば、シーケンス番号を、1バイト構成にした場合、8ビットの値として、0から254として用い、255(0xFF)の値をフラッシュメモリ130の初期値とする。なお、プロセッサ110は、シーケンス番号をカウントするカウンタを設け、シーケンス番号を管理する。
シーケンス番号は、各々のバンクにデータが書込まれる毎に、付与される連続した番号である。具体的には、プロセッサ110は、各々のバンクにおけるデータの消去回数を略均等化するべく、書込み順を示す連続したシーケンス番号を循環させてカウントする方式で、データの書込み対象のバンクにシーケンス番号を割り振る。この場合、プロセッサ110は、一例として、図4に示すシーケンス番号の領域にシーケンス番号を書込む。
これにより、プロセッサ110は、カウンタのサイズに依存せずに、データの新旧を特定できる。そして、プロセッサ110は、特定したデータの新旧に基づいて、新たなデータの書込み先、又は、データの読込み先のアクセス先を決定する。なお、詳細については、処理動作の説明の際、後述する。
チェックデータは、格納データの領域に書込まれたデータの有効性を判断するためのチェック用のデータである。プロセッサ110は、チェックデータを、データの信頼性を検査するためのチェックサムや巡回冗長検査(Cyclic Redundancy Check, CRC)等に使用する。
図5は、図1に示す第1セクタ13a及び第2セクタ13bの構成の一例を比較して説明する図である。図5では、第1セクタ13aは、セクタS0に複数のバンク(一例として、バンクB0〜バンクB3)を有する。第2セクタ13bは、セクタS1に複数のバンク(一例として、バンクM0〜バンクM3)を有する。なお、バンク数は、必要に応じて、任意の数を設定することができる。また、第1セクタ13aの各バンクB0〜B3には、実データが記憶され、第2セクタ13bの各バンクM0〜M3には、同じ配列番号に従って、実データの複製データが記憶される。つまり、例えば、バンクB0の実データは、バンクM0に複製データが記憶される。
なお、本実施形態では、説明の便宜上、実データが記憶されるバンクをベース領域とし、複製データ(同一データ)が記憶されるバンクをミラー領域として区別する。図5では、説明をわかりやすくするため、一例として、第1セクタ13aのセクタS0にベース領域を設定し、第2セクタ13bのセクタS1にミラー領域を設定しているが、これに限定されるものではない。また、図中、「データあり」は、データが記憶されていることを示す。また、ベース領域及びミラー領域の各々のバンクには、プロセッサ110により、各々独立にシーケンス番号(SN)が割り振られている。この場合、プロセッサ110は、例えば、ベース領域、ミラー領域に分けて、同じシーケンス番号を循環させて割り振る。なお、説明の便宜上、図5では、シーケンス番号(SN)をバンク外に示している(以下同様)。
[処理動作の説明]
次に、本実施形態におけるデータ記憶方法の動作の一例について説明する。先ず、フラッシュメモリ130への書込みや消去の仕方の概要について説明する。なお、本実施形態におけるデータ記憶方法は、データの書込みだけでなく、データの読込み(読出し)も含む。
図6は、データの書込み処理の一例を示すフローチャートである。プロセッサ110は、例えば、データの書込み要求が発生する毎に、図6に示すデータの書込み処理を実行する。この書込み処理は、記憶されているデータを消去して、新たなデータを書込むデータ更新を含む。
ステップS101:プロセッサ110は、データの書込みが最新のバンクとなる判定処理のサブルーチンを実行する。ここで、この最新のバンクを判定することは、データの新旧を特定することの一例に相当する。なお、このサブルーチンの処理について、データの読込み処理でも同様の処理を行うため、詳細については、図10〜図15等を用いて後述する。プロセッサ110が、最新のバンクを判定すると、ステップS102の処理に移行する。
ステップS102:プロセッサ110は、フラッシュメモリ130が初期状態か否かを判定する。フラッシュメモリ130が初期状態である場合(ステップS102:Yes)、ステップS105の処理に移行する。つまり、フラッシュメモリ130が初期状態であれば、まだ、シーケンス番号が割り振られていない。そこで、プロセッサ110は、データの書込み先として、例えば、図2に示すバンクB0にシーケンス番号(SN=0)を割り振るため、ステップS105の処理に移行する。一方、フラッシュメモリ130が初期状態でない場合(ステップS102:No)、ステップS103の処理に移行する。
ステップS103:プロセッサ110は、データの書込みが最新のバンクに記憶されているシーケンス番号を読出す。
ステップS104:プロセッサ110は、シーケンス番号が最大値であるか否かを判定する。この判定処理は、シーケンス番号が最大値の場合、シーケンス番号を循環させる必要があり、プロセッサ110が、シーケンス番号を0(ゼロ)に戻すためである。なお、シーケンス番号の最大値は、全てのバンクにシーケンス番号が割り振れるようにするため、バンクの総数の値よりも大きいこととする。そこで、シーケンス番号が最大値である場合(ステップS104:Yes)、ステップS105の処理に移行し、シーケンス番号が最大値でない場合(ステップS104:No)、ステップS106の処理に移行する。
ステップS105:プロセッサ110は、シーケンス番号を0(ゼロ)とする。
ステップS106:プロセッサ110は、シーケンス番号のインクリメント処理を行う。具体的には、プロセッサ110は、シーケンス番号を、現在のシーケンス番号+1の値とする。
ステップS107:プロセッサ110は、データの書込み先を決定する。つまり、プロセッサ110は、ステップS105又はステップSS106の処理で設定したシーケンス番号を、次の配列番号のバンクへの書込み対象のシーケンス番号に設定する。
ステップS108:プロセッサ110は、書込み対象のバンクに既にデータが記憶されているか否かを判定する。既にデータが記憶されている場合(ステップS108:Yes)、ステップS109の処理に移行し、まだ、データが記憶されていない場合(ステップS108:No)、ステップS110の処理に移行する。
ステップS109:プロセッサ110は、そのデータを消去して新しいデータを格納領域に書込み、チェックデータの領域にチェックデータ用の情報を書込む。また、シーケンス番号の領域にシーケンス番号を書込む。
ステップS110:プロセッサ110は、新しいデータを格納領域に書込み、ステップS109の処理と同様にして、チェックデータ用の情報やシーケンス番号を書込む。つまり、ステップS109、S110の処理において、一例として、プロセッサ110は、ベース領域における書込み対象のシーケンス番号のバンクに対して、データの書込みをする。さらに、プロセッサ110は、ベース領域に書込んだシーケンス番号、チェックデータ用の情報、新しいデータ等の複製データの書込みを、ミラー領域の同一のシーケンス番号のバンクに対して実行する。そして、プロセッサ110は、フローチャートの処理を終了する。
以下、図7、図8を用いて、データの書込み処理の一例について説明する。なお、説明をわかりやすくするため、図7、図8に示す書込みの処理では、図6に示す書込み処理を、より簡略化している。つまり、本実施形態の書込み処理は、図6に示すフローチャートの処理に限定されない。なお、図7、図8では、ベース領域でのデータの書込み処理を例示する(ミラー領域も同様)。
図7は、1つのセクタを複数のバンクに分割した場合におけるデータ更新の手順の一例を説明する図である。なお、図2では、2つのセクタを8つのバンクに分割した場合を例示した。図7では、説明をわかりやすくするため、図1に示す第1セクタ13aにおいて、1つのセクタを4つのバンクに分割した場合を例示している。図7に示すバンク構成では、フラッシュメモリ130は、プロセッサ110の書込み処理の実行命令により、1度の書込みで1つのバンクに対して、データを記憶する(データの書込み)。そして、フラッシュメモリ130は、セクタに対するデータの消去処理を、図7に示す全て(4つ)のバンクを使用した後、再び、バンクB0に新たなデータを書込む前に実施する。
具体的には、先ず、プロセッサ110は、1回目の書込みを実行する。図7では、全てのバンクにデータが記憶されていない場合について例示している。そのため、フラッシュメモリ130は、図4に示すバンクのデータ構造に従って、1回目の書込みとして、バンクB0の格納データの領域にデータを記憶する。また、フラッシュメモリ130は、シーケンス番号(SN)の領域にプロセッサ110が割り振ったシーケンス番号(SN=0)を記憶する。さらに、フラッシュメモリ130は、チェックデータの領域にチェックデータ用の情報を記憶する。
次に、プロセッサ110は、2回目の書込みを実行する。先ず、プロセッサ110は、シーケンス番号に基づいて、データの新旧を特定する。この場合、シーケンス番号(SN=0)のみ、データが記憶されているため、バンクB0のデータが、書込み時間が古いデータとなる。ここで、特定した結果から導かれる書込み先を示すシーケンス番号は、現在のシーケンス番号にインクリメントとした値(SN=0+1)となる。そこで、プロセッサ110は、バンクB1にシーケンス番号(SN=1)を割り振り、データの書込み先としてバンクB1に決定する。これにより、フラッシュメモリ130は、1回目の書込みと同様、バンクB1の格納データの領域に新たなデータを記憶し、チェックデータの領域にチェックデータ用の情報を記憶する。また、フラッシュメモリ130は、シーケンス番号(SN)の領域にプロセッサ110が割り振ったシーケンス番号(SN=1)を記憶する。
次に、プロセッサ110は、3回目の書込みを実行する。先ず、プロセッサ110は、シーケンス番号に基づいて、データの新旧を特定する。この場合、プロセッサ110は、データの書込みが最新のバンクを選択すればよく、例えばデータの書込み時刻が最も新しいバンクB1を選択する。ここで、特定した結果から導かれる書込み先を示すシーケンス番号は、現在のシーケンス番号にインクリメントとした値(SN=1+1)となる。そこで、プロセッサ110は、バンクB2にシーケンス番号(SN=2)を割り振り、データの書込み先としてバンクB1に決定する。
これにより、フラッシュメモリ130は、1回目の書込みと同様、データ、チェックデータ及びシーケンス番号を記憶する。以下同様の処理を実行することにより、フラッシュメモリ130は、例えば、バンクB3の格納データの領域に4回目の書込みとして、バンクB3の格納データの領域にデータを記憶する。また、フラッシュメモリ130は、シーケンス番号(SN)の領域に、プロセッサ110が割り振ったシーケンス番号(SN=3)を記憶すると、次回(5回目)の書込みの前に、バンクB0〜バンクB4のデータを消去する。
このような書込みにより、プロセッサ110は、フラッシュメモリ130のバンクB0に対して、1回目、5回目、9回目、・・・という更新順序で書込み処理を実行する。また、プロセッサ110は、フラッシュメモリ130のバンクB1に対して、2回目、6回目、10回目、・・・という更新順序で書込み処理を実行する。さらに、プロセッサ110は、バンクB2,B3も同様にして、書込み処理を実行する。
また、プロセッサ110は、バンクB0に対して、連続したシーケンス番号を循環させてカウントする方式で、シーケンス番号を、SN=0(1回目の書込み)、SN=4(5回目の書込み)、SN=8(9回目の書込み)というように割り振る。なお、シーケンス番号が最大値に達すると、プロセッサ110は、次のシーケンス番号を0に戻す。また、フラッシュメモリ130は、バンクB1〜B3についても、同様にして、シーケンス番号を割り振る。
図8は、複数のセクタで1つのバンクを構成した場合におけるデータ更新の手順の一例を説明する図である。なお、図3では、8つのバンクのそれぞれについて、2つのセクタで1つのバンクを構成した場合について例示した。図8では、説明をわかりやすくするため、図1に示す第1セクタ13aにおいて、4つのバンクのそれぞれについて、2つのセクタ(不図示)で1つのバンクを構成した場合について例示している。
図8のバンク構成では、フラッシュメモリ130は、プロセッサ110の書込み処理の実行命令により、1度の書込みで1つのバンクに対して、データを記憶する。そして、フラッシュメモリ130は、一例として、セクタに対する消去処理を、次回のバンクへの書込みの直前に、書込み対象のバンクのみ実行する。
具体的には、フラッシュメモリ130は、図7に示した処理と同様、1回目として、バンクB0の格納データの領域にデータを記憶すると共に、シーケンス番号(SN)の領域に、プロセッサ110が割り振ったシーケンス番号(SN=0)を記憶する。また、フラッシュメモリ130は、チェックデータの領域にチェックデータ用の情報を記憶する。以下同様の処理を実行することにより、フラッシュメモリ130は、例えば、バンクB3の格納データの領域に4回目の書込みとして、バンクB3の格納データの領域にデータを記憶し、シーケンス番号(SN)の領域に、シーケンス番号(SN=3)を記憶する。また、フラッシュメモリ130は、チェックデータの領域にチェックデータ用の情報を記憶する。
さらに、フラッシュメモリ130は、次回(5回目)の書込みの前に、バンクB0のみデータを消去し、そのバンクに新たなデータを記憶し、シーケンス番号(SN)の領域に、シーケンス番号(SN=4)を記憶する。続いて、フラッシュメモリ130は、次回(6回目)の書込みの際、バンクB1のデータ(2つのセクタ)を先ず消去した後、そのバンクに新たなデータを記憶し、シーケンス番号(SN)の領域に、シーケンス番号(SN=5)を記憶する(以下同様)。
以上より、本実施形態では、カウンタのバイトサイズに依存せずに、記憶領域を選択して順番にデータを書込むことができる。
なお、本実施形態では、図7及び図8に示す処理の何れであってもよいが、説明の便宜上、以下の説明では、図7に示す、1つのセクタを複数のバンクに分割した場合におけるデータ記憶方法を例示する。
また、図7、図8において、最新のバンクを判定する場合、シーケンス番号をインクリメントしていく形で判定したが、以下に説明する読込み処理と同様にして、データの書込みが最新のバンクを判定する方法を採用してもよい。
次に、本実施形態におけるデータの読込み処理の概要について説明する。
図9は、データの読込み処理の一例を示すフローチャートである。この処理は、例えば、自動車用電子制御装置100の電源(不図示)がオンされ、起動を開始した際に実行される。
ステップS201:プロセッサ110は、先ず、データの書込みが最新のバンクとなる判定処理のサブルーチンを実行する。なお、このサブルーチンの処理については、図10〜図15等を用いて後述する。
ステップS202:プロセッサ110は、フラッシュメモリ130に対してデータが記憶されたバンクが存在するか否かを判定する。なお、ステップS201のサブルーチンの処理では、バンクへのデータの書込みの有無もチェックしている。データが記憶されたバンクが存在する場合(ステップS202:Yes)、ステップS203に移行する。一方、データが記憶されたバンクが存在しない場合(ステップS202:No)、後述するステップS210に移行する。
ステップS203:プロセッサ110は、読込み対象のバンクが有効であるか否かを判定する。具体的には、プロセッサ110は、一例として、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しく、かつ、シーケンス番号が異常値でなく正しい場合に、読込み対象のバンクが有効であると判定する。そのため、読込み対象のバンクが有効である場合(ステップS203:Yes)、ステップS204の処理に移行する。
一方、当該読込み対象のバンクが無効である場合(ステップS203:No)、ステップS205の処理に移行する。なお、プロセッサ110は、読込み対象のバンクが有効であるか否かの判定に関し、チェックサムに限られず、例えば、巡回冗長検査等、他の検証手段を採用してもよい。
ステップS204:プロセッサ110は、読込み対象のバンクからデータを読込み、RAM120上にそのデータを展開する。これにより、RAM120は、そのデータを一時的に記憶する。そして、プロセッサ110は、図9に示すフローチャートの処理を終了する。
ステップS205:プロセッサ110は、次に新しいデータが記憶されたバンクが存在するか否かを判定する。換言すると、プロセッサ110は、ステップS203の処理における当該読込み対象のバンクに基づいて、配列番号が1つ前のバンクに記憶されたデータが存在するか否かを判定する。したがって、次に新しいデータが記憶されたバンクが存在した場合(ステップS205:Yes)、ステップS208の処理に移行する。一方、次に新しいデータが記憶されたバンクが存在しない場合(ステップS205:No)、ステップS206の処理に移行する。
ステップS206:プロセッサ110は、チェックデータのみが正常なデータを記憶したバンクであるか否かを判定する。すなわち、プロセッサ110は、ステップS203の処理で、読込み対象のバンクが無効と一旦判定した場合であっても、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しければ、チェックデータのみが正常なデータを記憶したバンクと判定する。つまり、本実施形態では、読込み対象のバンクが有効であると再判定する。そこで、ステップS206の判定条件を満たした場合(ステップS206:Yes)、ステップS207の処理に移行し、この判定条件を満たしていない場合(ステップS206:No)、ステップS209の処理に移行する。
ステップS207:プロセッサ110は、ステップS206の処理で有効と再判定されたバンクを読込み対象のバンクに設定する。そして、ステップS204の処理に移行し、プロセッサ110は、読込み対象のバンクからデータを読出し、RAM120上にそのデータを書込む制御を実行する。そして、プロセッサ110は、図9に示すフローチャートの処理を終了する。
ステップS208:プロセッサ110は、次に新しいデータが記憶されたバンクを読込み対象のバンクに設定し、ステップS203の処理に戻る。
ステップS209:プロセッサ110は、チェックデータが誤っているので、記憶データの消失と判定し、図9に示すフローチャートの処理を終了する。
ステップS210:プロセッサ110は、データの書込みが未実施と判定し、図9に示すフローチャートの処理を終了する。
以上より、プロセッサ110は、データの書込みが最新のバンクからデータを読込むことができる。
次に、データの書込みが最新のバンクとなる判定処理のサブルーチンについて説明する。プロセッサ110は、図6に示すステップS101の処理、又は、図9に示すステップS201の処理の際、このサブルーチンを実行する。ここで、このサブルーチンの処理は、大きく分けて、(1)バンクの終端検索処理、(2)シーケンス番号のチェック処理、(3)最新のバンクの判定処理を含む。プロセッサ110が、(1)〜(3)の処理を実行することで、最新のデータが書込みされたバンクを判定することができる。以下、具体的にこれらの(1)〜(3)の処理を例示する。
[バンクの終端検索処理]
図10は、バンクの終端検索処理の一例を示すフローチャートである。
ステップS301:プロセッサ110は、チェックバンクの設定処理を実行する。ここで、チェックバンクは、配列番号(アドレス番号)である。本実施形態では、チェックバンクを検索対象のバンクを指定するために利用する。具体的には、プロセッサ110は、データが記憶されたバンクの終端を、以下に示す後方サーチにより調べるため、チェックバンクに、バンク数−1の値を設定する。本実施形態では、バンクの配列番号を、0(ゼロ)から指定しているので、バンク全体の終端の配列番号は、バンク数−1の値となる。なお、バンクの配列番号を1から指定すれば、プロセッサ110は、チェックバンクにバンク数の値を設定すればよい。
ステップS302:プロセッサ110は、ベース領域又はミラー領域(例えば、図5に示す13a、13b)の検索対象となるバンクのシーケンス番号が初期値であるか否かを判断する。したがって、図4に示すシーケンス番号の領域に、初期値が記憶されている場合、データの書込みが、なされていないこととなる。そのため、ベース領域又はミラー領域のシーケンス番号の領域に、初期値以外のデータが記憶されている場合(ステップS302:No)、データの書込みがなされていることになるので、ステップS303の処理に移行する。
一方、本実施形態では、ベース領域又はミラー領域のシーケンス番号の領域に、初期値のデータが記憶されている場合(ステップS302:Yes)、当該検索対象のバンクには、書込みがなされていないとして、ステップS304の処理に移行する。
ステップS303:プロセッサ110は、ステップS302において、検索対象のバンクのチェックバンク(配列番号)を、終端バンクに設定する。そして、図11に示すシーケンス番号のチェック処理に移行する。なお、チェックバンクの値が、バンク数−1であれば、全てのバンクにデータが書込まれていることになる。
ステップS304:プロセッサ110は、チェックバンクの値が、0(ゼロ)であるか否かを判定する。ここで、チェックバンクの値が、0(ゼロ)である場合(ステップS304:Yes)、ステップS306の処理に移行する。一方、チェックバンクの値が、0(ゼロ)と異なる場合(ステップS304:No)、ステップS305の処理に移行する。つまり、チェックバンクの値が、0(ゼロ)であるということは、後方サーチにより、先端のバンクの配列番号0についても、シーケンス番号の領域に初期値が記憶されていることになり、全てのバンクについて、データの書込みがされていないことを意味する。
ステップS305:プロセッサ110は、後方サーチによるデクリメント処理のため、チェックバンクの値に、チェックバンク−1の値を設定する。そして、ステップS302の処理に戻る、つまり、プロセッサ110は、配列番号が1つ前のバンクについて、ステップS302の処理を実行する。
ステップS306:プロセッサ110は、全てのバンクについてデータが記憶されていないため、フラッシュメモリ130の初期状態として判断し、図10に示すフローチャートの処理を終了し、書込み処理の場合には、図6に示すステップS102の処理に戻る。この場合、シーケンス番号がまだ割り振られていないため、上述した通り、ステップS105の処理にスキップし、プロセッサ110は、データの書込み先について、バンクの配列番号を0(ゼロ)とし、シーケンス番号を0(ゼロ)に設定することになる。
一方、読込み処理の場合には、図9に示すステップS202に戻る。この場合、ステップS202の処理において、データが記憶されたバンクが存在しないため(ステップS202:No)、ステップS210に移行することになる。
[シーケンス番号のチェック処理]
図11は、シーケンス番号のチェック処理の一例を示すフローチャートである。シーケンス番号のチェック処理では、例えば、異常値等が誤って書込まれることにより、図14で後述する最新のバンクの判定処理でのエラーを防ぐ必要がある。そこで、シーケンス番号のチェック処理では、検索対象の現バンクと配列番号が1つ前のバンクとの間のシーケンス番号の関係が、最初に所定値を加算した関係にあるバンクの組合せを検索する。本実施形態では、例えば、所定値を1とする。つまり、プロセッサ110は、終端バンクの配列番号から遡る方向へ、前後のバンクのシーケンス番号を順次比較し、最初に所定値分、シーケンス番号が加算されている関係になっているバンクの組合せを特定する後方サーチを実行する。
なお、シーケンス番号のチェック処理では、例えば、予め設定した範囲のシーケンス番号以外の数値が書込まれたり、同じシーケンス番号が誤って連続して書込まれたりする場合、異常値が書込まれたと判定する。そして、プロセッサ110は、異常値と判定されたシーケンス番号のバンクを選択しないようにする。ここで、シーケンス番号のチェック処理では、最初に所定値を加算した関係にあるバンクの組合せを特定すれば、最新のバンクの判定処理に移行することができる。そのため、通常は、異常値等が誤って書込まれることはないので、例えば、チェックバンクの値が0(ゼロ)でなければ、本実施形態では、ステップS401、S402、S404、S405、S406の処理の流れになる。以下、具体的に処理の流れを説明する。
ステップS401:プロセッサ110は、チェックカウントとして、終端バンク数+1の値を設定すると共に、チェックバンクとして、終端バンクを設定する。ここで、チェックカウントは、ループ処理用のカウント値である。終端バンク数+1の値を設定するのは、バンクの配列番号を0(ゼロ)から開始しているため、検索対象のバンク数は、終端バンク数+1の値になるからである。
ステップS402:プロセッサ110は、チェックバンクの値が、0(ゼロ)であるか否かを判定する。チェックバンクの値が、0(ゼロ)の場合(ステップS402:Yes)、ステップS403に移行する。一方、チェックバンクの値が、0(ゼロ)以外の場合(ステップS402:No)、ステップS404に移行する。
ステップS403:プロセッサ110は、バンク全体の終端を指定する。具体的には、プロセッサ110は、1つ前のバンクを指定するため、バンク数−1の値を設定する。プロセッサ110が、このような処理を実行するのは、本実施形態では、バンクB0(配列番号=0)の場合は、1つ前のバンクが存在しないため、バンク全体の終端の配列番号に戻すための措置である。そして、ステップS405の処理に移行する。
ステップS404:プロセッサ110は、1つ前のバンクを指定する。具体的には、プロセッサ110は、チェックバンク−1の値を設定する。そして、ステップS405の処理に移行する。
ステップS405:プロセッサ110は、ベース領域とミラー領域との少なくとも一方のシーケンス番号の関係が、+1であるか否かを判定する。この条件を満たしていれば(ステップS405:Yes)、ステップS406に移行する。一方、この条件を満たしていなければ(ステップS405:No)、ステップS407に移行する。
ステップS406:プロセッサ110は、最新のバンクの判定処理を実行するための検索用基準バンクの値として、現在のチェックバンクの値を設定する。つまり、プロセッサ110は、最初に所定値分、シーケンス番号が加算されている関係になっているバンクの組合せを特定し、その組合せのうちで配列番号が大きい方のバンクを選択して、現在のチェックバンクの値とし、検索用基準バンクの値として設定する。
ステップS407:プロセッサ110は、後方サーチにより、1つ前のバンクを選択するため、チェックバンクの値に、チェックバンク−1の値を代入すると共に、チェックカウントの値にチェックカウント−1の値を代入する。
ステップS408:プロセッサ110は、チェックカウントの値が、0(ゼロ)であるか否かを判定する。チェックカウントの値が、0(ゼロ)の場合(ステップS408:Yes)、ステップS409の処理に移行する。一方、チェックカウントの値が、0(ゼロ)以外の場合(ステップS408:No)、ステップS402の処理に戻る。
ステップS409:プロセッサ110は、終端バンクを最新のバンクとする。これは、チェックカウント(ループカウント)分、回しても、シーケンス番号が、+1になる関係の組合せが存在しないことで、通常は発生しないケースを想定しており、本実施形態では、バンク全体の終端を最新のバンクとみなして、図11に示すフローチャートの処理を終了し、書込み処理の場合には、図6に示すステップS102の処理に戻る。そして、ステップS103の処理において、シーケンス番号の読出しは、バンク全体における終端のバンクのシーケンス番号となる。
一方、読込み処理の場合には、図9に示すステップS202に戻る。この場合、ステップS203の判定処理に移行する。
図12、図13は、シーケンス番号のチェック処理の一例を説明する図である。なお、説明の便宜上、ベース領域について説明している(ミラー領域についても同様)。例えば、図1に示す第1セクタ13aにおいて、1セクタを使用して4バンクを構成した場合(図12の左側参照)、一例として、バンクB2にデータが記憶されており、バンクB3にデータが記憶されていないので、書込み済みのバンクの終端は、バンクB2になる。そして、バンクB2とバンクB1とのシーケンス番号の関係が、+1の関係を満たしているので、検索用基準バンクは、バンクB2になる。
また、例えば、図1に示す第1セクタ13aにおいて、2セクタを使用して8バンクを構成した場合(図12の右側参照)、一例として、書込み済みのバンクの終端は、バンクB7になる。そして、バンクB7とバンクB6とのシーケンス番号の関係が、+1の関係を満たしているので、検索用基準バンクは、バンクB7になる。
一方、図13に示す通り、例えば、図1に示す第1セクタ13aにおいて、2セクタを使用して4バンクを構成した場合(図13の左側参照)、一例として、本来ならば、バンクB7には、シーケンス番号(SN=7)が割り振られるところ、シーケンス番号(SN=6)が割り振られている。この場合、プロセッサ110は、この値を異常値としてみなして、バンクB6とバンクB5とのシーケンス番号の関係が、+1の関係を満たしているので、検索用基準バンクは、バンクB6とする。
また、例えば、図1に示す第1セクタ13aにおいて、3セクタを使用して4バンクを構成した場合(図13の右側参照)、一例として、本来ならば、バンクB9には、シーケンス番号(SN=250)が割り振られるところ、異常値として、シーケンス番号(SN=255)が割り振られている。この場合、プロセッサ110は、バンクB11とバンクB10とのシーケンス番号の関係が、+1の関係を満たしているので、たとえ、バンクB9に異常値が混入していても、検索用基準バンクを、バンクB11とする。このように異常値を無視しても、最新のバンクの判定処理に移行する際に、異常値による影響を受けずに済むからである。このようにして、検索用基準バンクが決定されると、プロセッサ110は、次に、以下のバンクの判定処理を実行する。
[最新のバンクの判定処理]
図14は、最新のバンクの判定処理の一例を示すフローチャートである。図15は、最新のバンクの判定処理の一例を説明する図である。この判定処理では、推定値というパラメータを導入することで、データの書込みが最新のバンクの判定を容易にすることができる。
ステップS501:プロセッサ110は、最新のバンクを判定するため、初期設定を実行する。具体的には、プロセッサ110は、先ず、(1)チェックカウント、(2)チェックバンク、(3)シーケンス番号の推定値、(4)最新バンク、(5)最新シーケンス番号の値をそれぞれ設定する。
ここで、チェックカウントには、データの書込みされているバンク数が設定される。この値は、後述するステップS511において、チェック回数として、ステップS502〜S511の処理をループする回数を設定することに相当する。また、チェックバンクには、検索基準バンクの配列番号が設定される。
さらに、シーケンス番号の推定値は、先ず、初期値として、チェックバンク(検索基準バンク)のシーケンス番号が設定される。また、最新バンクは、先ず、処理開始のバンクを設定するため、検索基準バンクの配列番号を設定する。最新シーケンス番号は、検索基準バンクのシーケンス番号が設定される。
例えば、図15では、図1に示す第1セクタ13aにおいて、一例として、2セクタを使用して8バンクの構成を示しており、チェックカウントは、バンクB0〜バンクB7まで、データの書込みがなされているので、8の値が設定される。また、チェックバンクは、検索基準バンクがバンクB7であるので、その配列番号7が設定される。また、シーケンス番号の推定値は、検索基準バンクのシーケンス番号であるので、15の値が設定される。最新バンクは、検索基準バンクがバンクB7であるので、先ず、その配列番号7が設定される。最新シーケンス番号は、検索基準バンクのシーケンス番号であるので、15の値が設定される。
ステップS502:プロセッサ110は、チェックバンクの値がバンク全体の終端か否かを判定する。具体的には、チェックバンクの値が(バンク数−1)以上であるか否かを判定する。これは、当該判定対象のバンクが配列番号の最後か否かを判定することを意味する。チェックバンクの値が(バンク数−1)以上であれば(ステップS502:Yes)、処理対象のバンクをバンクB0に戻す必要があるので、ステップS503に移行する。一方、チェックバンクの値が(バンク数−1)よりも小さい値であれば(ステップS502:No)、ステップS504に移行する。
ステップS503:プロセッサ110は、チェックバンクの値を0(ゼロ)に設定する。つまり、配列番号が0(ゼロ)の先頭バンクが設定されることになる。ここで、一例として、図15を参照すると、バンク数−1の値が7になり、チェックバンクの値が7であるので、バンク全体の終端をチェックしていることになるので、プロセッサ110は、バンクB0に設定する。
ステップS504:プロセッサ110は、チェックバンクの値をチェックバンク+1に設定する。
ステップS505:プロセッサ110は、シーケンス番号(推定値)が、シーケンス番号(最大値)と等しいか否かを判定する。この条件を満たさない場合(ステップS505:No)、ステップS506に移行する。一方、この条件を満たした場合(ステップS505:Yes)、ステップS507に移行する。
本実施形態では、上述した通り、例えば、シーケンス番号として、0から254まで循環させてカウントする方式を採用しているため、シーケンス番号の最大値は、254の値になる。つまり、シーケンス番号が254に達すると、該シーケンス番号を0(ゼロ)に戻す必要がある。そのため、ステップS505の処理でシーケンス番号が最大値(254)に達した場合には、ステップS507の処理に移行させるようにしている。
ステップS506:プロセッサ110は、シーケンス番号(推定値)のインクリメント処理を行う。具体的には、プロセッサ110は、シーケンス番号(推定値)に、シーケンス番号(推定値)+1の値を設定する。
ステップS507:プロセッサ110は、シーケンス番号(推定値)に、0(ゼロ)を設定する。
ステップS508:プロセッサ110は、ベース領域とミラー領域との少なくとも一方のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たした場合(ステップS508:Yes)、ステップS509に移行する。一方、この条件を満たさない場合(ステップS508:No)、ステップS510に移行する。
ステップS509:プロセッサ110は、最新バンクにチェックバンクの値を設定し、最新シーケンス番号に、シーケンス番号(推定値)を設定する。
ステップS510:プロセッサ110は、後方サーチを実行するため、チェックカウントの値に、(チェックカウント−1)の値を設定する。
ステップS511:プロセッサ110は、チェックカウントの値が、0(ゼロ)であるか否かを判定する。チェックカウントの値が、0(ゼロ)以外の値であれば(ステップS511:No)、ステップS502の処理に戻る。一方、チェックカウントの値が、0(ゼロ)であれば(ステップS511:Yes)、後方サーチにより、ループする回数に達したことになるので、図14に示すフローチャートの処理を終了し、書込み処理の場合には、図6に示すステップS102の処理に戻る。一方、読込み処理の場合には、図9に示すステップS202に戻る。
ここで、再度、図15を用いて、ステップS502〜ステップS511の処理の一例を説明すると、チェックバンクは、バンク全体の終端バンクがバンクB7であるので(ステップS502:Yes)、プロセッサ110は、バンクB0をチェック対象に設定する(ステップS503)。この段階で、シーケンス番号は、まだ、254の値に達していないため(ステップS505:No)、シーケンス番号(推定値)は、現在のシーケンス番号(推定値:15)+1=16となる(ステップS506)。そして、ベース領域の現在のシーケンス番号とシーケンス番号(推定値)とは、共に16の値で一致するため(ステップS508:Yes)、ステップS509に移行する。
プロセッサ110は、チェック対象の最新バンクをバンクB0に設定し、チェック対象の最新のシーケンス番号と、シーケンス番号(推定値)を設定する(ステップS509)。そして、プロセッサ110は、ループカウントを1つ減らし(ステップS510)、ループカウントが、0(ゼロ)でないので(ステップS511:No)、ステップS502〜ステップS511の処理を繰り返す。
すると、図15に示す通り、シーケンス番号(推定値)は、17、18、19と増加していくが、バンクB4で、現在のシーケンス番号が12であるのに対し、シーケンス番号(推定値)が20となり、一致しない(ステップS508:No)。そのため、プロセッサ110は、ステップS509の処理をスキップし、ステップS510の処理を実行する。その結果、図15に示す通り、シーケンス番号(推定値)は、以後、20、21、22となる。また、チェック回数を示すチェックカウントの値が開始時には8であったのが、フローチャートの処理を実行することにより、0(ゼロ)となり(ステップS511:Yes)、プロセッサ110は、図14に示すフローチャートの処理を終了する。この処理により、最新のシーケンス番号は、19となり、プロセッサ110は、データの書込みが最新のバンクを、バンクB3と判定することができる。
[データの読込み処理の詳細]
次に、図9で示したデータの読込み処理において、最新のバンクが特定された後のデータの読込み処理をより詳細に説明する。
図16は、データの読込み処理の一例を示すフローチャートである。
データの読込み処理の詳細について、本実施形態では、上述したバンクの新旧を特定した後に、バンクの有効性判断を実行する。つまり、バンクは、図4に示すデータ構造において、データチェックの項目を有しており、プロセッサ110は、データチェックに基づくチェックサム等でデータの検証をする前に、シーケンス番号等を解析することにより、データの書込みが最新のバンクを判定することができる。これにより、全てのバンクのデータに対して、データの検証を行わずに済むので、無駄なメモリアクセスを行わずにフラッシュメモリ130の初期チェック等の処理時間を短縮することが可能となる。
ステップS601:プロセッサ110は、データを読込むために、入力値の設定を実行する。具体的には、プロセッサ110は、チェックバンクの値にバンク数を設定し、チェックバンクの値に、最新バンクの配列番号を設定する。さらに、プロセッサ110は、シーケンス番号(推定値)に、最新のシーケンス番号を設定する。
ステップS602:プロセッサ110は、当該読込み対象のバンクにおけるベース領域のチェックデータが有効であり、かつ、ベース領域のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たしている場合(ステップS602:Yes)、ステップS614の処理に移行する。一方、この条件を満たしていない場合(ステップS602:No)、ステップS603の処理に移行する。なお、ここで、チェックデータが有効であるとは、上述した通り、例えば、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しいことを意味する。
ステップS603:プロセッサ110は、ミラー領域のチェックデータが有効であり、かつ、ミラー領域のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たしている場合(ステップS603:Yes)、ステップS615の処理に移行する。一方、この条件を満たしていない場合(ステップS602:No)、ステップS604の処理に移行する。
ステップS604:プロセッサ110は、両方の領域のチェックデータが無効であるか否かを判定する。この条件を満たしている場合(ステップS604:Yes)、当該バンクについては、両方の領域とも異常なデータであり、プロセッサ110は、データの選択をしないため、ステップS608の処理に移行する。
一方、この条件を満たしていない場合(ステップS604:No)、ベース領域とミラー領域との何れか一方のデータを選択するため、ステップS605の処理に移行する。
ステップS605:プロセッサ110は、ベース領域のチェックデータが有効であるか否かを判定する。有効である場合(ステップS605:Yes)、ステップS606の処理に移行し、無効である場合(ステップS605:No)、ステップS607の処理に移行する。
ステップS606:プロセッサ110は、ベース領域のデータを選択して、正常なバンクのデータとする。
ステップS607:プロセッサ110は、既にS604の処理において、両方の領域におけるチェックデータの有効性を判定しているので、ベース領域のデータが無効であれば、ミラー領域のデータを選択して、正常なバンクのデータとする。
ステップS608:プロセッサ110は、チェックカウントの後方サーチのためのデクリメント処理(チェックカウント=チェックカウント−1)を実行する。
ステップS609:プロセッサ110は、チェックカウントの値が、0(ゼロ)の値であるか否かを判定する。0(ゼロ)の値である場合(テップS609:Yes)、ステップS611の処理に移行する。一方、0(ゼロ)以外の値である場合(テップS609:No)、ステップS610の処理に移行する。
ステップS610:プロセッサ110は、チェックバンク及びシーケンス番号(推定値)を決定するためのサブルーチンの処理を実行する。サブルーチンの処理の詳細は、図17を用いて後述する。
ステップS611:プロセッサ110は、正常なバンクのデータを記憶済みであるか否かを判定する。この条件を満たしている場合(ステップS611:Yes)、ステップS612の処理に移行し、この条件を満たしていない場合(ステップS611:No)、ステップS613の処理に移行する。
ステップS612:プロセッサ110は、格納データの読出しを実行し、図16に示すフローチャートの処理を終了する。
ステップS613:プロセッサ110は、異常を検出し、図16に示すフローチャートの処理を終了する。
ステップS614:プロセッサ110は、ベース領域から正常なバンクのデータを読出し、図16に示すフローチャートの処理を終了する。
ステップS615:プロセッサ110は、ミラー領域から正常なバンクのデータを読出し、図16に示すフローチャートの処理を終了する。
次に、上記のステップS610で実行するサブルーチンの処理を説明する。
図17は、チェックバンク及びシーケンス番号(推定値)を決定するためのサブルーチンの一例を示すフローチャートである。
ステップS701:プロセッサ110は、チェックバンクの値が、0(ゼロ)であるか否かを判定する。この条件を満たす場合(ステップS701:Yes)、ステップS702の処理に移行し、この条件を満たさない場合(ステップS701:No)、ステップS703の処理に移行する。
ステップS702:プロセッサ110は、チェックバンクをバンク全体の終端を指定する。具体的には、プロセッサ110は、チェックバンクの値に、バンク数−1の値を代入する。
ステップS703:プロセッサ110は、1つ前のバンクを指定する。具体的には、プロセッサ110は、チェックバンクの値に、1を減算するデクリメント処理を実行する。
ステップS704:プロセッサ110は、シーケンス番号が、0(ゼロ)であるか否かを判定する。この条件を満たす場合(ステップS704:Yes)、ステップS705の処理に移行し、この条件を満たさない場合(ステップS704:No)、ステップS706の処理に移行する。
ステップS705:プロセッサ110は、シーケンス番号(推定値)に、シーケンス番号の最大値を代入する。そして、図16に示すステップS602の処理に戻る。
ステップS706:プロセッサ110は、シーケンス番号(推定値)に、1を減算するデクリメント処理を実行する。そして、図16に示すステップS602の処理に戻る。
以上より、本実施形態では、バンクに記憶されているデータを読込む場合、例えば、フラッシュメモリ130のアクセス先として、最も更新順序が新しいシーケンス番号を選択することで、データの書込みが最新のバンクに記憶されているデータを読出すことができる。
また、本実施形態では、例えば、図15に示す通り、最新のバンクの次のシーケンス番号のバンクに書込み時刻が最も古いデータが記憶されている。したがって、本実施形態では、バンクに記憶されているデータを書込む場合、例えば、フラッシュメモリ130のアクセス先として、最も更新順序が古いシーケンス番号を選択することで、最も古いデータを消去して、新たにデータを書込むことができる。
また、本実施形態では、シーケンス番号を循環させてカウントする方式を採用することにより、カウンタのバイトサイズに依存せずに、データの新旧を特定できるので、図4に示すバンクのデータ構造において、そのバイトサイズを節約することができる。さらに、本実施形態では、フラッシュメモリ130上の消去回数を考慮しなければ、理論上の書込み回数は無限となる。また、本実施形態では、デバイス毎のセクタサイズに依存せずに、データの新旧を特定できる。
[本実施形態の補足事項]
(1)本実施形態では、フラッシュメモリ130において、記憶するデータの種類により、複数のエリアに分けて、バンクが構成されてもよい。
図18は、複数の種類のバンク構成例を説明する図である。本実施形態では、データの種類は、主に、書込み要求が発生するタイミングによって分けられる。例えば、エラー発生時のデータ保存領域(Freeze Frame Data)、シャットダウン時の各種情報、システム学習データ等である。
そこで、図18では、フラッシュメモリ130内に、例えば、3つのエリアを設定する。具体的には、フラッシュメモリ130は、第0エリアとして、エラー発生時のデータ保存領域(Freeze Frame Data)130a、第1エリアとして、シャットダウン情報130b、第2エリアとして、システム学習データ130cの領域を設ける。なお、それぞれエリアは、ベース領域とミラー領域とを備える。
ここで、各エリアは、データの種類の違いにより、フラッシュメモリ130に対する書込み頻度が異なるため、バンクの構成を任意に設定してもよい。例えばシャットダウン時の各種情報の場合、 シャットダウン毎に書込みが発生するため、書込み頻度が高くバンク数を多めに設定することが好ましい。
また、システムの学習データの場合、工場出荷前に一度しか書込みをしないような場合は、バンク数は1として設定することが好ましい。
(2)本実施形態では、フラッシュメモリ130のアドレス参照において、テーブルデータを基に自動的に計算してもよい。例えば、各エリアのバンクサイズ及びバンク数のデータをテーブルデータ化し、プログラムデータと共に配置してもよい。プロセッサ110は、フラッシュメモリ130の各エリアの各バンクへアクセスする場合、テーブルデータを基にアクセスするアドレスを計算してもよい。
図19は、テーブルデータの一例を示す図である。プロセッサ110は、例えば、図19に示すテーブルデータT1に基づいて、目標とするアドレスを計算してもよい。具体的には、プロセッサ110は、システム学習データのミラー領域のバンクM0にアクセスする場合、目標アドレスとして、(a)フラッシュメモリ130の先頭アドレスと、(b)エラー発生時のデータ保存領域(Freeze Frame Data)の合計サイズと、(c)シャットダウン時の各種データのベース領域サイズとの合計を求める。なお、プロセッサ110は、各エリアの合計サイズとして、必要なセクタ数×セクタサイズにより、算出してもよい。
(3)本実施形態では、ベース領域及びミラー領域において、正常にデータの書込みが終了しない場合には、再書込みをn回(例えばn=1)だけ実行するようにしてもよい。なお、ベース領域及びミラー領域のバンク数が1つの場合には、再書込みは、同領域へ続けて実施してもよい。
また、バンクが複数の場合には、再書込みは、ベース領域とミラー領域との両方の書込みの終了後に、次のバンクに実行するようにしてもよい。さらに、再書込み後に、ベース領域及びミラー領域が共に正常でなければ、書込み異常として検出するようにしてもよい。
あるいは、複数のバンクの構成において、プロセッサ110がミラー領域にデータを書込み、その上で異常と判定した場合、1回だけ、次のバンクのベース領域に書込むと共に、そのベース領域に対するミラー領域に書込むようにしてもよい。
図20は、再書込みの一例を示すフローチャートである。なお、以下で説明する再書込みは、このフローチャートの処理に限定されるものではない。
ステップS801:プロセッサ110は、書込み対象のバンクを、書込みが最新のバンクの次の配列番号のバンクに設定する。なお、ベース領域及びミラー領域のバンク数が1つの場合には、この処理をスキップし、同じバンクに設定する。
ステップS802:プロセッサ110は、ステップS801で設定したバンクのミラー領域のみ異常であるか否かを判定する。このミラー領域のみ異常である条件を満たす場合(ステップS802:Yes)、ステップS803の処理に移行する。一方、この条件を満たさない場合(ステップS802:No)、ステップS804の処理に移行する。
ステップS803:プロセッサ110は、フラッシュメモリ130上における当該書込み対象のバンクのミラー領域へ、データを書込む。これにより、フラッシュメモリ130は、そのミラー領域にデータを記憶する。
ステップS804:プロセッサ110は、フラッシュメモリ130上における書込み対象のバンクのベース領域へデータを書込む。これにより、フラッシュメモリ130は、そのベース領域にデータを記憶する。
ステップS805:プロセッサ110は、ベース領域及びミラー領域のバンク数が各々1つであり、かつ、書込み異常が発生したか否かを判定する。この条件を満たす場合(ステップS805:Yes)、ステップS806の処理に移行する。一方、この条件を満たさない場合(ステップS805:No)、ステップS807の処理に移行する。
ステップS806:プロセッサ110は、同じ領域にデータの再書込みを実行する。すなわち、バンク数が1つの場合には、プロセッサ110は、ベース領域で異常が発生した場合には、そのベース領域に再書込みを実行し、ミラー領域で異常が発生した場合には、そのミラー領域に再書込みを実行する。
ステップS807:プロセッサ110は、逆の領域にデータの再書込みを実行する。すなわち、プロセッサ110は、ベース領域で異常が発生した場合には、ベース領域に対応するミラー領域に再書込みを実行し、ミラー領域で異常が発生した場合には、そのミラー領域に対応するベース領域に再書込みを実行する。
ステップS808:プロセッサ110は、バンク数が1つであって、かつ、書込み異常が再度発生したか否かを判定する。この条件を満たす場合(ステップS808:Yes)、ステップS809の処理に移行する。一方、この条件を満たさない場合(ステップS808:No)、ステップS810の処理に移行する。
ステップS809:プロセッサ110は、ステップS806と同様、同じ領域にデータの再書込みを実行する。
ステップS810:プロセッサ110は、ベース領域及びミラー領域において、共に書込みが正常終了したか否かを判定する。正常終了した場合(ステップS810:Yes)、図20に示すフローチャートの処理を終了する。一方、正常終了しなかった場合(ステップS810:No)、ステップS811の処理に移行する。
ステップS811:プロセッサ110は、バンク数が複数、かつ、再書込みが未実施のバンクがあるか否かを判定する。この条件を満たす場合(ステップS811:Yes)、ステップS801の処理に戻る。一方、この条件を満たさない場合(ステップS811:No)、ステップS812の処理に移行する。
ステップS812:プロセッサ110は、書込み異常と検出し、図20に示すフローチャートの処理を終了する。
(4)本実施形態では、バンクのデータ読出しは、チェックデータ等が有効なバンクの中で、最新のデータの書込みをしたバンクに対して実行してもよい。この場合、プロセッサ110は、読出した最新の有効なバンクのデータについて、ベース領域又はミラー領域が異常であった場合、異常な領域に対し、正常な領域のデータを用いて、書直しを実行してもよい。このような構成により、自動車用電子制御装置100が異常停止した場合であっても、フラッシュメモリ130に記憶されたデータは、保証される。
図21、図22は、データの書直しの一例を説明する図である。図21において、一例として、図1に示す第1セクタ13aにおいて、第1セクタ13aのベース領域及び第2セクタ13bのミラー領域のバンク数が各々1つの場合、プロセッサ110は、異常な領域のみデータの書直しを実行する。具体的には、プロセッサ110は、バンクM0のミラー領域が異常であるため、ベース領域のデータをミラー領域に複写することで、書直しを実行する。
また、図22において、一例として、図1に示す第1セクタ13aにおいて、第1セクタ13aのベース領域及び第2セクタ13bのミラー領域のバンク数が複数の場合、プロセッサ110は、次のバンクへ移動し、ベース領域及びミラー領域にデータの書込みを実行する。例えば、プロセッサ110は、バンクB1のベース領域が異常であるため、バンクM1のミラー領域のデータを、ベース領域のバンクB2及びミラー領域のバンクM2に複写することで、書直しを実行する。したがって、このような制御は、チェックデータ等が正常なデータを常に二重に記憶し、データの保証性能を向上させることができる。
例えば、初回の書込み以降、書込みが発生しなかった場合、経年劣化によりフラッシュメモリ130に記憶されたデータが壊れる可能性がある。そこで、プロセッサ110は、片方の領域のデータ故障が発生した場合であっても、フラッシュメモリ130に記憶したデータをリフレッシュする。これにより、長期のデータ保持の効果が期待できる。
さらに、一例として、起動時の読出しで、ベース領域又はミラー領域の異常を検出した場合、(a)書込み異常が発生したのか、(b)書込み中に強制終了(電源異常等)したのか、(c)電源オフ中にフラッシュメモリ130のデータが壊れたのか、ユーザにとっては、確実に判断することが困難である。また、シャットダウン前の書込み異常については、異常を検知しても、シャットダウンの実行により、ユーザに通知する手段が困難な場合がある。
そこで、このようなケースに対して、読出し時に、ベース領域又はミラー領域の異常を検出した場合、プロセッサ110は、書直しを行い、その中で書込み異常が発生するかどうかを確認することで、フラッシュメモリ130への書込み異常をより正確に検出することができる。また、プロセッサ110は、データの読出し直後、例えば、図1に示す自動車用電子制御装置100の起動直後での書直しを実行した場合等、ユーザへの通知する機会を増やすことができる。
(5)本実施形態では、図1に示すRAM120上のバッファを2段構成とすることで、常時、書込み要求の受付けをするようにしてもよい。
図23は、書込み要求発生時における各バッファの更新の一例を説明する図である。
図23において、RAM120は、RAMバッファ120a〜120dを有する。RAMバッファ120aは、第0エリアとして、エラー発生時のデータ保存領域(Freeze Frame Data)に使用される。RAMバッファ120bは、第1エリアとして、シャットダウン情報に使用される。RAMバッファ120cは、第2エリアとして、システム学習データに使用される。RAMバッファ120dは、書込み開始時にRAMバッファ120a〜120cからデータをロードするために使用される。
ここで、図23に示す各エリアは、各バンクと同サイズのRAMバッファを持つ。各RAMバッファ120a〜120cへのポインタは、テーブル化され、電源投入時のフラッシュメモリ130の読出し時に自動的に各RAMバッファ120a〜120cへロードされる。書込み要求発生時には各エリアのRAMバッファが更新され、書込み開始時に、書込み中のエリアバッファ120dへ、対象となるエリアのRAMバッファ内のデータがロードされる。RAMバッファが2段構成となるため、フラッシュメモリ130への書込み中であっても、各エリアは各RAMバッファ120a〜120cを更新し、次の書込み要求を受け付けることが可能である。
(6)本実施形態では、各エリアに要求された書込みデータがRAMバッファと同一の場合、フラッシュメモリ130への書込みを省略してもよい。例えば、プロセッサ110は、書込み要求の発生時に、書込み要求のデータと現在のRAMバッファ120a〜120cの値を比較し、完全に一致した場合には、フラッシュメモリ130への書込みを省略してもよい。ただし、プロセッサ110は、フラッシュメモリ130のリフレッシュを目的として強制的な書込みをしてもよい。つまり、本実施形態では、新たなフラッシュメモリ130への書込みが不要であれば、フラッシュメモリ130への書込み回数を減らすことができるので、フラッシュメモリ130の寿命をより延ばすことができる。
(7)本実施形態では、自動車用電子制御装置100を、例えば、四輪駆動用のトランスファーECUに適用してもよい。
図24は、トランスファーECUに適用したフラッシュメモリ130の使用構成の一例を示すテーブルである。図24に示すテーブルT2は、フラッシュメモリ130の使用構成を示すテーブル形式のデータであって、「エリアインデックス」、「用途」、「バンクサイズ」、「バンク数」、「合計サイズ」、「セクタ数」、「全使用サイズ」、「書込みタイミング」等の列を含んでいる。ここで、「全使用サイズ」は、ベース領域とミラー領域を合わせたサイズとする。また、セクタのサイズは、256バイトとする。
ここで、トランスファーECUにおいて、自己診断による故障発生履歴は、故障が発生しなければデータは変化しない。そのため、故障発生履歴が確認できない場合、シャットダウン毎に書込み要求が発生しているが、データの変化がないため、本実施形態の第6の補足事項で上述した制御により、プロセッサ110は、フラッシュメモリ130への書込みを省略する。
また、トランスファーECUでは、ベース領域及びミラー領域の全バンクに異常が発生し、万が一記憶データが失われてしまった場合、対象のエリアは全て初期データとして扱われる。システム学習の値については、学習制御を再び実行してフラッシュメモリ130へ記憶する。また、フラッシュメモリ130の異常として検出した場合、プロセッサ110は、ドライバーへの表示は実行せず、フラッシュメモリ130への故障情報の記憶のみを実行してもよい。
(8)本実施形態では、後方サーチにより、最新のデータが書込みされたバンクの判定を実行したが、後方サーチに限られず、前方サーチを用いても実現可能である。また、本実施形態では、フラッシュメモリ130のメモリ上におけるブロック設定の余剰部分を利用して実行してもよい。また、本実施形態では、図4に示したバンクのデータ構造において、シーケンス番号に限られず、必要に応じて、例えば、終端バンクのアドレスの規定、任意の可変なデータサイズ等への対応を行える他に必要な属性情報等を付加するようにしてもよい。あるいは、本実施形態では、図4に示したバンクのデータ構造において、図24に示したフラッシュメモリ130の使用構成のうちで、必要な項目の情報を適宜付加するようにしてもよい。
(9)本実施形態では、不揮発メモリとして、EEPROM等のフラッシュメモリを例示したが、これに限られず、例えば、NAND(Not And)型フラッシュメモリ等、書換え回数の制限のある他のフラッシュメモリにも適用可能である。
(10)ここで、上記実施形態から把握し得る請求項以外の技術的思想について、以下に効果と共に記載する。
(a)上記制御部は、上記記憶領域に記憶されているデータを読込む場合、上記アクセス先として、最も更新順序が新しい識別子を選択し、上記データを上記記憶領域へ書込む場合、上記アクセス先として、最も更新順序が古い識別子を選択することを特徴とする請求項1に記載の自動車用電子制御装置。
このようにすれば、同一の記憶領域に対する書込み回数を制限し、各々の記憶領域におけるデータの消去回数を略均等化するようにデータの書込み先又は読込み先を決定できるので、フラッシュメモリ130の寿命をより延ばすことができる。
(b)上記記憶領域は、固有の配列番号を有し、上記制御部は、上記記憶領域の配列内で、空きを示す初期値のデータと異なるデータが記憶されている、上記配列番号が最大となる終端の記憶領域を検索し、上記終端の上記記憶領域の上記配列番号から遡る方向へ、前後の記憶領域の識別子を順次比較し、最初に所定値分が加算されている関係になっている記憶領域の組合せを特定し、上記組合せのうちで上記配列番号が大きい方の記憶領域を基準として、次に割り振られる記憶領域の上記識別子の推定値と、現在割り振られている上記識別子とを順番に比較し、互いに一致している識別子のうちで最大値を特定することで、該最大値が割り振られた記憶領域を、最新のデータが書込みされた記憶領域と判定することを特徴とする請求項1に記載の自動車用電子制御装置。
このように判定すれば、上記制御部は、データを読込む場合、データの書込みが最新のバンクからデータを容易に読込むことができる。また、上記制御部は、データを書込む場合、最新のデータが書込みされた記憶領域の次の識別子(最も更新順序が古い識別子)の記憶領域にデータを容易に書込むことができる。
以上、本件に開示する一の実施形態について明細書及び図面等を用いて説明したが、本件開示の技術は、上記実施形態に限定されるものではない。つまり、本発明の技術的範囲内において、各種の改良又は変更も本件開示の技術に含まれるのは、特許請求の範囲の記載から明らかである。