(57)【特許請求の範囲】
【請求項１】
データの最小消去単位であるセクタを複数の記憶領域に分割してデータを記憶し、前記記憶領域を指定するための配列番号が付与され、データの再書込みが可能な不揮発性メモリと、該不揮発性メモリへのアクセスを制御する制御部とを含む自動車用電子制御装置であって、
前記制御部は、
前記記憶領域を順次変更してデータを該記憶領域へ書込む場合、書込み順を示す識別子を循環させてカウントする方式で、データの書込み対象の前記記憶領域に前記識別子を割り振り、該識別子に基づいてデータの新旧を特定し、
前記記憶領域の配列内で、空きを示すデータと異なるデータが記憶されている、前記配列番号が最大となる終端の記憶領域を検索し、
前記終端の記憶領域から前後の記憶領域の識別子を順次比較し、異常値が誤って書込まれることによる、後続の判定処理でのエラーを防ぐ処理をした後、
最新のデータが書込みされた記憶領域を判定し、
該最新のデータの有効性を検証し、検証結果に基づいて、前記記憶領域へのアクセス先を決定することを特徴とする自動車用電子制御装置。
【請求項２】
各々の前記記憶領域は、データを記憶する第１領域と、該データの複製データを記憶する第２領域とを、前記不揮発性メモリの異なる前記セクタ上に有し、
前記制御部は、前記第１領域と、前記第２領域とに対して、前記識別子を各々割り振り、各々の前記識別子に基づいて、前記第１領域及び第２領域のデータの新旧を特定することを特徴とする請求項１に記載の自動車用電子制御装置。
【請求項３】
データの最小消去単位であるセクタを複数の記憶領域に分割してデータを記憶し、前記記憶領域を指定するための配列番号が付与され、データの再書込みが可能な不揮発性メモリへのアクセスを制御する、自動車用電子制御装置の制御部が、
前記記憶領域を順次変更してデータを該記憶領域へ書込む場合、書込み順を示す識別子を循環させてカウントする方式で、データの書込み対象の前記記憶領域に前記識別子を割り振り、該識別子に基づいてデータの新旧を特定し、
前記記憶領域の配列内で、空きを示すデータと異なるデータが記憶されている、前記配列番号が最大となる終端の記憶領域を検索し、
前記終端の記憶領域から前後の記憶領域の識別子を順次比較し、異常値が誤って書込まれることにより、後続の判定処理でのエラーを防ぐ処理をした後、
最新のデータが書込みされた記憶領域を判定し、
該最新のデータの有効性を検証し、検証結果に基づいて、前記記憶領域へのアクセス先を決定する処理を実行することを特徴とするデータ記憶方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自動車等の車両に搭載する自動車用電子制御装置及びデータ記憶方法に関する。
【背景技術】
【０００２】
自動車用のＥＣＵ（Electronic Control Unit）等の自動車用電子制御装置には、電源切断後もデータを保持するために、例えば、ＥＥＰＲＯＭ（Electrically Erasable Programmable Read-Only Memory）等の不揮発性メモリが使用されている。なお、ＥＥＰＲＯＭ等の不揮発性メモリは、データの消去に関し、動作が保証される消去回数が限られている。
そこで、従来、不揮発性メモリでは、例えば、そのメモリ上に複数の記憶領域を設け、同一の記憶領域に対する書込み回数を制限し、各々の記憶領域におけるデータの消去回数を略均等化するため、記憶領域を選択して順番にデータを更新する技術が用いられている。
ここで、従来例では、各記憶領域内にデータ格納部と、各記憶領域のデータの書換え毎に増加される領域選択用のカウンタと、データの有効性を検証するためのチェックデータを格納するチェックデータ部とを設けている。これにより、従来例では、記憶領域の書込み先を移動させてデータを記憶させるために、カウンタの値に基づいて、各記憶領域のデータの新旧を判定して、書込み先を決定している（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００７−２８７０２２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかし、従来例では、単に、カウンタの値の大小関係で、各記憶領域のデータの新旧を判定するので、カウンタへの書込み可能な回数（上限値）がカウンタ自体のバイトサイズに依存し、上限値を大きくすればする程、記憶領域毎にカウンタのバイトサイズの領域をより確保しなければならないという問題が生じてしまう。
【０００５】
そこで、本発明の１つの側面では、従来技術の問題点に鑑み、カウンタのバイトサイズに依存せずに、記憶領域を選択して順番にデータを更新できる技術を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明による自動車用電子制御装置は、データの最小消去単位であるセクタを複数の記憶領域に分割してデータを記憶し、記憶領域を指定するための配列番号が付与され、データの再書込みが可能な不揮発性メモリと、その不揮発性メモリへのアクセスを制御する制御部とを含む自動車用電子制御装置であって、制御部は、記憶領域を順次変更してデータをその記憶領域へ書込む場合、書込み順を示す識別子を循環させてカウントする方式で、データの書込み対象の記憶領域に識別子を割り振り、その識別子に基づいてデータの新旧を特定し、記憶領域の配列内で、空きを示すデータと異なるデータが記憶されている、配列番号が最大となる終端の記憶領域を検索し、終端の記憶領域から前後の記憶領域の識別子を順次比較し、異常値が誤って書込まれることによる、後続の判定処理でのエラーを防ぐ処理をした後、最新のデータが書込みされた記憶領域を判定し、その最新のデータの有効性を検証し、検証結果に基づいて、記憶領域へのアクセス先を決定する。
【発明の効果】
【０００７】
本発明の１つの側面によれば、カウンタのバイトサイズに依存せずに、記憶領域を選択して順番にデータを更新できる。
【図面の簡単な説明】
【０００８】
【図１】自動車用電子制御装置のハード構成例を示す図である。
【図２】バンクの構成例を説明する図である。
【図３】バンクの構成例を説明する図である。
【図４】バンクのデータ構造の一例を説明する図である。
【図５】図１に示す第１セクタ１３ａ及び第２セクタ１３ｂの構成の一例を比較して説明する図である。
【図６】データの書込み処理の一例を示すフローチャートである。
【図７】１つのセクタを複数のバンクに分割した場合におけるデータ更新の手順の一例を説明する図である。
【図８】複数のセクタで１つのバンクを構成した場合におけるデータ更新の手順の一例を説明する図である。
【図９】データの読込み処理の一例を示すフローチャートである。
【図１０】バンクの終端検索処理の一例を示すフローチャートである。
【図１１】シーケンス番号のチェック処理の一例を示すフローチャートである。
【図１２】シーケンス番号のチェック処理の一例を説明する図である。
【図１３】シーケンス番号のチェック処理の一例を説明する図である。
【図１４】最新のバンクの判定処理の一例を示すフローチャートである。
【図１５】最新のバンクの判定処理の一例を説明する図である。
【図１６】データの読込み処理の一例を示すフローチャートである。
【図１７】チェックバンク及びシーケンス番号（推定値）を決定するためのサブルーチンの一例を示すフローチャートである。
【図１８】複数の種類のバンク構成例を説明する図である。
【図１９】テーブルデータの一例を示す図である。
【図２０】再書込みの一例を示すフローチャートである。
【図２１】データの書直しの一例を説明する図である。
【図２２】データの書直しの一例を説明する図である。
【図２３】書込み要求発生時における各バッファの更新の一例を説明する図である。
【図２４】トランスファーＥＣＵに適用したフラッシュメモリ１３０の使用構成の一例を示すテーブルである。
【発明を実施するための形態】
【０００９】
以下、添付された図面を参照し、本発明を実施するための実施形態について詳述する。
［自動車用電子制御装置のハード構成例］
図１は、自動車用電子制御装置のハード構成例を示す図である。図１に示す自動車用電子制御装置１００は、例えば、自動車に搭載され、エンジン、自動変速機、燃料ポンプ等を電子制御するデバイスである。
自動車用電子制御装置１００は、プロセッサ１１０と、ＲＡＭ（Random Access Memory）１２０と、フラッシュメモリ１３０と、バス１４０とを備える。プロセッサ１１０、ＲＡＭ１２０及びフラッシュメモリ１３０は、バス１４０を介して、互いに接続されている。なお、プロセッサ１１０は、制御部の一例であり、フラッシュメモリ１３０は、不揮発性メモリの一例である。
【００１０】
プロセッサ１１０は、自動車用電子制御装置１００の統括的な制御を行うものである。具体的には、プロセッサ１１０は、ＲＡＭ１２０及びフラッシュメモリ１３０へのアクセスを制御する。なお、プロセッサ１１０は、ＣＰＵ（Central Processing Unit）コアが複数設けられているコアプロセッサの構成であってもよい。
【００１１】
ＲＡＭ１２０は、例えば、演算処理等に用いられるデータの一時的な作業領域となるメモリであって、電源供給が遮断されると、記憶内容が消える揮発性メモリである。なお、ＲＡＭ１２０は、例えば、ダイナミックＲＡＭやスタティックＲＡＭであってもよい。
【００１２】
フラッシュメモリ１３０は、例えば、ＥＥＰＲＯＭ等、電源供給を遮断してもデータが保持される不揮発性の半導体メモリである。フラッシュメモリ１３０は、データの再書込みが可能な複数のバンクを有する。バンクは、記憶領域の一例であって、本実施形態では、フラッシュメモリ１３０の最小消去単位（以下「セクタ」という。）を複数のバンクに分割して、データを記憶する。
【００１３】
図１に示す通り、フラッシュメモリ１３０は、データを記憶する複数のバンクを有する第１セクタ１３ａと、そのデータの複製データを記憶する複数のバンクを有する第２セクタ１３ｂとを含む。つまり、各バンクは、複製データ（同一データ）を保管するバンク（ミラーバンク）を有し、異なるセクタ上に設定される。なお、第１セクタ１３ａ上の各バンクは、第１領域の一例であり、第２セクタ１３ｂ上の各バンクは、第２領域の一例である。
【００１４】
図２、図３は、バンクの構成例を説明する図である。図２では、図１に示す第１セクタ１３ａの一例として、第１セクタ１３ａに含まれるセクタＳ０、Ｓ１を複数のバンクＢに分割した場合を例示している（第２セクタ１３ｂも同様）。なお、バンクＢに付与された番号は、バンクＢを指定するための配列番号（アドレス番号）の一例である。ここで、配列番号は、例えば、０,１,２,・・・Ｎ（バンク数−１）とする。セクタＳ０は、バンクＢ０〜Ｂ３を有し、セクタＳ１は、Ｂ４〜Ｂ７を有している。
【００１５】
また、図３では、図１に示す第１セクタ１３ａの一例として、複数のセクタで１つのバンクＢを構成した場合について例示している（第２セクタ１３ｂも同様）。例えば、セクタＳ０，Ｓ１でバンクＢ０を構成している。セクタＳ２〜Ｓ１５についても、図３に示す通り、各々のバンクＢ１〜バンクＢ７を構成している。
【００１６】
図４は、バンクのデータ構造の一例を説明する図である。例えば、バンクＢ０を代表して説明すると、バンクＢ０は、シーケンス番号と、チェックデータと、実際のデータを書込む格納データとを含むデータ構造を有する（他のバンクも同様）。なお、シーケンス番号は、識別子の一例である。本実施形態では、例えば、シーケンス番号を、１バイト構成にした場合、８ビットの値として、０から２５４として用い、２５５（０ｘＦＦ）の値をフラッシュメモリ１３０の初期値とする。なお、プロセッサ１１０は、シーケンス番号をカウントするカウンタを設け、シーケンス番号を管理する。
【００１７】
シーケンス番号は、各々のバンクにデータが書込まれる毎に、付与される連続した番号である。具体的には、プロセッサ１１０は、各々のバンクにおけるデータの消去回数を略均等化するべく、書込み順を示す連続したシーケンス番号を循環させてカウントする方式で、データの書込み対象のバンクにシーケンス番号を割り振る。この場合、プロセッサ１１０は、一例として、図４に示すシーケンス番号の領域にシーケンス番号を書込む。
これにより、プロセッサ１１０は、カウンタのサイズに依存せずに、データの新旧を特定できる。そして、プロセッサ１１０は、特定したデータの新旧に基づいて、新たなデータの書込み先、又は、データの読込み先のアクセス先を決定する。なお、詳細については、処理動作の説明の際、後述する。
【００１８】
チェックデータは、格納データの領域に書込まれたデータの有効性を判断するためのチェック用のデータである。プロセッサ１１０は、チェックデータを、データの信頼性を検査するためのチェックサムや巡回冗長検査（Cyclic Redundancy Check, CRC）等に使用する。
【００１９】
図５は、図１に示す第１セクタ１３ａ及び第２セクタ１３ｂの構成の一例を比較して説明する図である。図５では、第１セクタ１３ａは、セクタＳ０に複数のバンク（一例として、バンクＢ０〜バンクＢ３）を有する。第２セクタ１３ｂは、セクタＳ１に複数のバンク（一例として、バンクＭ０〜バンクＭ３）を有する。なお、バンク数は、必要に応じて、任意の数を設定することができる。また、第１セクタ１３ａの各バンクＢ０〜Ｂ３には、実データが記憶され、第２セクタ１３ｂの各バンクＭ０〜Ｍ３には、同じ配列番号に従って、実データの複製データが記憶される。つまり、例えば、バンクＢ０の実データは、バンクＭ０に複製データが記憶される。
【００２０】
なお、本実施形態では、説明の便宜上、実データが記憶されるバンクをベース領域とし、複製データ（同一データ）が記憶されるバンクをミラー領域として区別する。図５では、説明をわかりやすくするため、一例として、第１セクタ１３ａのセクタＳ０にベース領域を設定し、第２セクタ１３ｂのセクタＳ１にミラー領域を設定しているが、これに限定されるものではない。また、図中、「データあり」は、データが記憶されていることを示す。また、ベース領域及びミラー領域の各々のバンクには、プロセッサ１１０により、各々独立にシーケンス番号（ＳＮ）が割り振られている。この場合、プロセッサ１１０は、例えば、ベース領域、ミラー領域に分けて、同じシーケンス番号を循環させて割り振る。なお、説明の便宜上、図５では、シーケンス番号（ＳＮ）をバンク外に示している（以下同様）。
【００２１】
［処理動作の説明］
次に、本実施形態におけるデータ記憶方法の動作の一例について説明する。先ず、フラッシュメモリ１３０への書込みや消去の仕方の概要について説明する。なお、本実施形態におけるデータ記憶方法は、データの書込みだけでなく、データの読込み（読出し）も含む。
【００２２】
図６は、データの書込み処理の一例を示すフローチャートである。プロセッサ１１０は、例えば、データの書込み要求が発生する毎に、図６に示すデータの書込み処理を実行する。この書込み処理は、記憶されているデータを消去して、新たなデータを書込むデータ更新を含む。
【００２３】
ステップＳ１０１：プロセッサ１１０は、データの書込みが最新のバンクとなる判定処理のサブルーチンを実行する。ここで、この最新のバンクを判定することは、データの新旧を特定することの一例に相当する。なお、このサブルーチンの処理について、データの読込み処理でも同様の処理を行うため、詳細については、図１０〜図１５等を用いて後述する。プロセッサ１１０が、最新のバンクを判定すると、ステップＳ１０２の処理に移行する。
【００２４】
ステップＳ１０２：プロセッサ１１０は、フラッシュメモリ１３０が初期状態か否かを判定する。フラッシュメモリ１３０が初期状態である場合（ステップＳ１０２：Ｙｅｓ）、ステップＳ１０５の処理に移行する。つまり、フラッシュメモリ１３０が初期状態であれば、まだ、シーケンス番号が割り振られていない。そこで、プロセッサ１１０は、データの書込み先として、例えば、図２に示すバンクＢ０にシーケンス番号（ＳＮ＝０）を割り振るため、ステップＳ１０５の処理に移行する。一方、フラッシュメモリ１３０が初期状態でない場合（ステップＳ１０２：Ｎｏ）、ステップＳ１０３の処理に移行する。
【００２５】
ステップＳ１０３：プロセッサ１１０は、データの書込みが最新のバンクに記憶されているシーケンス番号を読出す。
ステップＳ１０４：プロセッサ１１０は、シーケンス番号が最大値であるか否かを判定する。この判定処理は、シーケンス番号が最大値の場合、シーケンス番号を循環させる必要があり、プロセッサ１１０が、シーケンス番号を０（ゼロ）に戻すためである。なお、シーケンス番号の最大値は、全てのバンクにシーケンス番号が割り振れるようにするため、バンクの総数の値よりも大きいこととする。そこで、シーケンス番号が最大値である場合（ステップＳ１０４：Ｙｅｓ）、ステップＳ１０５の処理に移行し、シーケンス番号が最大値でない場合（ステップＳ１０４：Ｎｏ）、ステップＳ１０６の処理に移行する。
【００２６】
ステップＳ１０５：プロセッサ１１０は、シーケンス番号を０（ゼロ）とする。
ステップＳ１０６：プロセッサ１１０は、シーケンス番号のインクリメント処理を行う。具体的には、プロセッサ１１０は、シーケンス番号を、現在のシーケンス番号＋１の値とする。
【００２７】
ステップＳ１０７：プロセッサ１１０は、データの書込み先を決定する。つまり、プロセッサ１１０は、ステップＳ１０５又はステップＳＳ１０６の処理で設定したシーケンス番号を、次の配列番号のバンクへの書込み対象のシーケンス番号に設定する。
【００２８】
ステップＳ１０８：プロセッサ１１０は、書込み対象のバンクに既にデータが記憶されているか否かを判定する。既にデータが記憶されている場合（ステップＳ１０８：Ｙｅｓ）、ステップＳ１０９の処理に移行し、まだ、データが記憶されていない場合（ステップＳ１０８：Ｎｏ）、ステップＳ１１０の処理に移行する。
ステップＳ１０９：プロセッサ１１０は、そのデータを消去して新しいデータを格納領域に書込み、チェックデータの領域にチェックデータ用の情報を書込む。また、シーケンス番号の領域にシーケンス番号を書込む。
ステップＳ１１０：プロセッサ１１０は、新しいデータを格納領域に書込み、ステップＳ１０９の処理と同様にして、チェックデータ用の情報やシーケンス番号を書込む。つまり、ステップＳ１０９、Ｓ１１０の処理において、一例として、プロセッサ１１０は、ベース領域における書込み対象のシーケンス番号のバンクに対して、データの書込みをする。さらに、プロセッサ１１０は、ベース領域に書込んだシーケンス番号、チェックデータ用の情報、新しいデータ等の複製データの書込みを、ミラー領域の同一のシーケンス番号のバンクに対して実行する。そして、プロセッサ１１０は、フローチャートの処理を終了する。
【００２９】
以下、図７、図８を用いて、データの書込み処理の一例について説明する。なお、説明をわかりやすくするため、図７、図８に示す書込みの処理では、図６に示す書込み処理を、より簡略化している。つまり、本実施形態の書込み処理は、図６に示すフローチャートの処理に限定されない。なお、図７、図８では、ベース領域でのデータの書込み処理を例示する（ミラー領域も同様）。
【００３０】
図７は、１つのセクタを複数のバンクに分割した場合におけるデータ更新の手順の一例を説明する図である。なお、図２では、２つのセクタを８つのバンクに分割した場合を例示した。図７では、説明をわかりやすくするため、図１に示す第１セクタ１３ａにおいて、１つのセクタを４つのバンクに分割した場合を例示している。図７に示すバンク構成では、フラッシュメモリ１３０は、プロセッサ１１０の書込み処理の実行命令により、１度の書込みで１つのバンクに対して、データを記憶する（データの書込み）。そして、フラッシュメモリ１３０は、セクタに対するデータの消去処理を、図７に示す全て（４つ）のバンクを使用した後、再び、バンクＢ０に新たなデータを書込む前に実施する。
【００３１】
具体的には、先ず、プロセッサ１１０は、１回目の書込みを実行する。図７では、全てのバンクにデータが記憶されていない場合について例示している。そのため、フラッシュメモリ１３０は、図４に示すバンクのデータ構造に従って、１回目の書込みとして、バンクＢ０の格納データの領域にデータを記憶する。また、フラッシュメモリ１３０は、シーケンス番号（ＳＮ）の領域にプロセッサ１１０が割り振ったシーケンス番号（ＳＮ＝０）を記憶する。さらに、フラッシュメモリ１３０は、チェックデータの領域にチェックデータ用の情報を記憶する。
【００３２】
次に、プロセッサ１１０は、２回目の書込みを実行する。先ず、プロセッサ１１０は、シーケンス番号に基づいて、データの新旧を特定する。この場合、シーケンス番号（ＳＮ＝０）のみ、データが記憶されているため、バンクＢ０のデータが、書込み時間が古いデータとなる。ここで、特定した結果から導かれる書込み先を示すシーケンス番号は、現在のシーケンス番号にインクリメントとした値（ＳＮ＝０＋１）となる。そこで、プロセッサ１１０は、バンクＢ１にシーケンス番号（ＳＮ＝１）を割り振り、データの書込み先としてバンクＢ１に決定する。これにより、フラッシュメモリ１３０は、１回目の書込みと同様、バンクＢ１の格納データの領域に新たなデータを記憶し、チェックデータの領域にチェックデータ用の情報を記憶する。また、フラッシュメモリ１３０は、シーケンス番号（ＳＮ）の領域にプロセッサ１１０が割り振ったシーケンス番号（ＳＮ＝１）を記憶する。
【００３３】
次に、プロセッサ１１０は、３回目の書込みを実行する。先ず、プロセッサ１１０は、シーケンス番号に基づいて、データの新旧を特定する。この場合、プロセッサ１１０は、データの書込みが最新のバンクを選択すればよく、例えばデータの書込み時刻が最も新しいバンクＢ１を選択する。ここで、特定した結果から導かれる書込み先を示すシーケンス番号は、現在のシーケンス番号にインクリメントとした値（ＳＮ＝１＋１）となる。そこで、プロセッサ１１０は、バンクＢ２にシーケンス番号（ＳＮ＝２）を割り振り、データの書込み先としてバンクＢ１に決定する。
【００３４】
これにより、フラッシュメモリ１３０は、１回目の書込みと同様、データ、チェックデータ及びシーケンス番号を記憶する。以下同様の処理を実行することにより、フラッシュメモリ１３０は、例えば、バンクＢ３の格納データの領域に４回目の書込みとして、バンクＢ３の格納データの領域にデータを記憶する。また、フラッシュメモリ１３０は、シーケンス番号（ＳＮ）の領域に、プロセッサ１１０が割り振ったシーケンス番号（ＳＮ＝３）を記憶すると、次回（５回目）の書込みの前に、バンクＢ０〜バンクＢ４のデータを消去する。
【００３５】
このような書込みにより、プロセッサ１１０は、フラッシュメモリ１３０のバンクＢ０に対して、１回目、５回目、９回目、・・・という更新順序で書込み処理を実行する。また、プロセッサ１１０は、フラッシュメモリ１３０のバンクＢ１に対して、２回目、６回目、１０回目、・・・という更新順序で書込み処理を実行する。さらに、プロセッサ１１０は、バンクＢ２，Ｂ３も同様にして、書込み処理を実行する。
【００３６】
また、プロセッサ１１０は、バンクＢ０に対して、連続したシーケンス番号を循環させてカウントする方式で、シーケンス番号を、ＳＮ＝０（１回目の書込み）、ＳＮ＝４（５回目の書込み）、ＳＮ＝８（９回目の書込み）というように割り振る。なお、シーケンス番号が最大値に達すると、プロセッサ１１０は、次のシーケンス番号を０に戻す。また、フラッシュメモリ１３０は、バンクＢ１〜Ｂ３についても、同様にして、シーケンス番号を割り振る。
【００３７】
図８は、複数のセクタで１つのバンクを構成した場合におけるデータ更新の手順の一例を説明する図である。なお、図３では、８つのバンクのそれぞれについて、２つのセクタで１つのバンクを構成した場合について例示した。図８では、説明をわかりやすくするため、図１に示す第１セクタ１３ａにおいて、４つのバンクのそれぞれについて、２つのセクタ（不図示）で１つのバンクを構成した場合について例示している。
【００３８】
図８のバンク構成では、フラッシュメモリ１３０は、プロセッサ１１０の書込み処理の実行命令により、１度の書込みで１つのバンクに対して、データを記憶する。そして、フラッシュメモリ１３０は、一例として、セクタに対する消去処理を、次回のバンクへの書込みの直前に、書込み対象のバンクのみ実行する。
【００３９】
具体的には、フラッシュメモリ１３０は、図７に示した処理と同様、１回目として、バンクＢ０の格納データの領域にデータを記憶すると共に、シーケンス番号（ＳＮ）の領域に、プロセッサ１１０が割り振ったシーケンス番号（ＳＮ＝０）を記憶する。また、フラッシュメモリ１３０は、チェックデータの領域にチェックデータ用の情報を記憶する。以下同様の処理を実行することにより、フラッシュメモリ１３０は、例えば、バンクＢ３の格納データの領域に４回目の書込みとして、バンクＢ３の格納データの領域にデータを記憶し、シーケンス番号（ＳＮ）の領域に、シーケンス番号（ＳＮ＝３）を記憶する。また、フラッシュメモリ１３０は、チェックデータの領域にチェックデータ用の情報を記憶する。
【００４０】
さらに、フラッシュメモリ１３０は、次回（５回目）の書込みの前に、バンクＢ０のみデータを消去し、そのバンクに新たなデータを記憶し、シーケンス番号（ＳＮ）の領域に、シーケンス番号（ＳＮ＝４）を記憶する。続いて、フラッシュメモリ１３０は、次回（６回目）の書込みの際、バンクＢ１のデータ（２つのセクタ）を先ず消去した後、そのバンクに新たなデータを記憶し、シーケンス番号（ＳＮ）の領域に、シーケンス番号（ＳＮ＝５）を記憶する（以下同様）。
【００４１】
以上より、本実施形態では、カウンタのバイトサイズに依存せずに、記憶領域を選択して順番にデータを書込むことができる。
なお、本実施形態では、図７及び図８に示す処理の何れであってもよいが、説明の便宜上、以下の説明では、図７に示す、１つのセクタを複数のバンクに分割した場合におけるデータ記憶方法を例示する。
【００４２】
また、図７、図８において、最新のバンクを判定する場合、シーケンス番号をインクリメントしていく形で判定したが、以下に説明する読込み処理と同様にして、データの書込みが最新のバンクを判定する方法を採用してもよい。
【００４３】
次に、本実施形態におけるデータの読込み処理の概要について説明する。
図９は、データの読込み処理の一例を示すフローチャートである。この処理は、例えば、自動車用電子制御装置１００の電源（不図示）がオンされ、起動を開始した際に実行される。
ステップＳ２０１：プロセッサ１１０は、先ず、データの書込みが最新のバンクとなる判定処理のサブルーチンを実行する。なお、このサブルーチンの処理については、図１０〜図１５等を用いて後述する。
【００４４】
ステップＳ２０２：プロセッサ１１０は、フラッシュメモリ１３０に対してデータが記憶されたバンクが存在するか否かを判定する。なお、ステップＳ２０１のサブルーチンの処理では、バンクへのデータの書込みの有無もチェックしている。データが記憶されたバンクが存在する場合（ステップＳ２０２：Ｙｅｓ）、ステップＳ２０３に移行する。一方、データが記憶されたバンクが存在しない場合（ステップＳ２０２：Ｎｏ）、後述するステップＳ２１０に移行する。
【００４５】
ステップＳ２０３：プロセッサ１１０は、読込み対象のバンクが有効であるか否かを判定する。具体的には、プロセッサ１１０は、一例として、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しく、かつ、シーケンス番号が異常値でなく正しい場合に、読込み対象のバンクが有効であると判定する。そのため、読込み対象のバンクが有効である場合（ステップＳ２０３：Ｙｅｓ）、ステップＳ２０４の処理に移行する。
【００４６】
一方、当該読込み対象のバンクが無効である場合（ステップＳ２０３：Ｎｏ）、ステップＳ２０５の処理に移行する。なお、プロセッサ１１０は、読込み対象のバンクが有効であるか否かの判定に関し、チェックサムに限られず、例えば、巡回冗長検査等、他の検証手段を採用してもよい。
【００４７】
ステップＳ２０４：プロセッサ１１０は、読込み対象のバンクからデータを読込み、ＲＡＭ１２０上にそのデータを展開する。これにより、ＲＡＭ１２０は、そのデータを一時的に記憶する。そして、プロセッサ１１０は、図９に示すフローチャートの処理を終了する。
【００４８】
ステップＳ２０５：プロセッサ１１０は、次に新しいデータが記憶されたバンクが存在するか否かを判定する。換言すると、プロセッサ１１０は、ステップＳ２０３の処理における当該読込み対象のバンクに基づいて、配列番号が１つ前のバンクに記憶されたデータが存在するか否かを判定する。したがって、次に新しいデータが記憶されたバンクが存在した場合（ステップＳ２０５：Ｙｅｓ）、ステップＳ２０８の処理に移行する。一方、次に新しいデータが記憶されたバンクが存在しない場合（ステップＳ２０５：Ｎｏ）、ステップＳ２０６の処理に移行する。
【００４９】
ステップＳ２０６：プロセッサ１１０は、チェックデータのみが正常なデータを記憶したバンクであるか否かを判定する。すなわち、プロセッサ１１０は、ステップＳ２０３の処理で、読込み対象のバンクが無効と一旦判定した場合であっても、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しければ、チェックデータのみが正常なデータを記憶したバンクと判定する。つまり、本実施形態では、読込み対象のバンクが有効であると再判定する。そこで、ステップＳ２０６の判定条件を満たした場合（ステップＳ２０６：Ｙｅｓ）、ステップＳ２０７の処理に移行し、この判定条件を満たしていない場合（ステップＳ２０６：Ｎｏ）、ステップＳ２０９の処理に移行する。
【００５０】
ステップＳ２０７：プロセッサ１１０は、ステップＳ２０６の処理で有効と再判定されたバンクを読込み対象のバンクに設定する。そして、ステップＳ２０４の処理に移行し、プロセッサ１１０は、読込み対象のバンクからデータを読出し、ＲＡＭ１２０上にそのデータを書込む制御を実行する。そして、プロセッサ１１０は、図９に示すフローチャートの処理を終了する。
【００５１】
ステップＳ２０８：プロセッサ１１０は、次に新しいデータが記憶されたバンクを読込み対象のバンクに設定し、ステップＳ２０３の処理に戻る。
ステップＳ２０９：プロセッサ１１０は、チェックデータが誤っているので、記憶データの消失と判定し、図９に示すフローチャートの処理を終了する。
ステップＳ２１０：プロセッサ１１０は、データの書込みが未実施と判定し、図９に示すフローチャートの処理を終了する。
以上より、プロセッサ１１０は、データの書込みが最新のバンクからデータを読込むことができる。
【００５２】
次に、データの書込みが最新のバンクとなる判定処理のサブルーチンについて説明する。プロセッサ１１０は、図６に示すステップＳ１０１の処理、又は、図９に示すステップＳ２０１の処理の際、このサブルーチンを実行する。ここで、このサブルーチンの処理は、大きく分けて、（１）バンクの終端検索処理、（２）シーケンス番号のチェック処理、（３）最新のバンクの判定処理を含む。プロセッサ１１０が、（１）〜（３）の処理を実行することで、最新のデータが書込みされたバンクを判定することができる。以下、具体的にこれらの（１）〜（３）の処理を例示する。
【００５３】
［バンクの終端検索処理］
図１０は、バンクの終端検索処理の一例を示すフローチャートである。
ステップＳ３０１：プロセッサ１１０は、チェックバンクの設定処理を実行する。ここで、チェックバンクは、配列番号（アドレス番号）である。本実施形態では、チェックバンクを検索対象のバンクを指定するために利用する。具体的には、プロセッサ１１０は、データが記憶されたバンクの終端を、以下に示す後方サーチにより調べるため、チェックバンクに、バンク数−１の値を設定する。本実施形態では、バンクの配列番号を、０（ゼロ）から指定しているので、バンク全体の終端の配列番号は、バンク数−１の値となる。なお、バンクの配列番号を１から指定すれば、プロセッサ１１０は、チェックバンクにバンク数の値を設定すればよい。
【００５４】
ステップＳ３０２：プロセッサ１１０は、ベース領域又はミラー領域（例えば、図５に示す１３ａ、１３ｂ）の検索対象となるバンクのシーケンス番号が初期値であるか否かを判断する。したがって、図４に示すシーケンス番号の領域に、初期値が記憶されている場合、データの書込みが、なされていないこととなる。そのため、ベース領域又はミラー領域のシーケンス番号の領域に、初期値以外のデータが記憶されている場合（ステップＳ３０２：Ｎｏ）、データの書込みがなされていることになるので、ステップＳ３０３の処理に移行する。
【００５５】
一方、本実施形態では、ベース領域又はミラー領域のシーケンス番号の領域に、初期値のデータが記憶されている場合（ステップＳ３０２：Ｙｅｓ）、当該検索対象のバンクには、書込みがなされていないとして、ステップＳ３０４の処理に移行する。
【００５６】
ステップＳ３０３：プロセッサ１１０は、ステップＳ３０２において、検索対象のバンクのチェックバンク（配列番号）を、終端バンクに設定する。そして、図１１に示すシーケンス番号のチェック処理に移行する。なお、チェックバンクの値が、バンク数−１であれば、全てのバンクにデータが書込まれていることになる。
【００５７】
ステップＳ３０４：プロセッサ１１０は、チェックバンクの値が、０（ゼロ）であるか否かを判定する。ここで、チェックバンクの値が、０（ゼロ）である場合（ステップＳ３０４：Ｙｅｓ）、ステップＳ３０６の処理に移行する。一方、チェックバンクの値が、０（ゼロ）と異なる場合（ステップＳ３０４：Ｎｏ）、ステップＳ３０５の処理に移行する。つまり、チェックバンクの値が、０（ゼロ）であるということは、後方サーチにより、先端のバンクの配列番号０についても、シーケンス番号の領域に初期値が記憶されていることになり、全てのバンクについて、データの書込みがされていないことを意味する。
【００５８】
ステップＳ３０５：プロセッサ１１０は、後方サーチによるデクリメント処理のため、チェックバンクの値に、チェックバンク−１の値を設定する。そして、ステップＳ３０２の処理に戻る、つまり、プロセッサ１１０は、配列番号が１つ前のバンクについて、ステップＳ３０２の処理を実行する。
【００５９】
ステップＳ３０６：プロセッサ１１０は、全てのバンクについてデータが記憶されていないため、フラッシュメモリ１３０の初期状態として判断し、図１０に示すフローチャートの処理を終了し、書込み処理の場合には、図６に示すステップＳ１０２の処理に戻る。この場合、シーケンス番号がまだ割り振られていないため、上述した通り、ステップＳ１０５の処理にスキップし、プロセッサ１１０は、データの書込み先について、バンクの配列番号を０（ゼロ）とし、シーケンス番号を０（ゼロ）に設定することになる。
【００６０】
一方、読込み処理の場合には、図９に示すステップＳ２０２に戻る。この場合、ステップＳ２０２の処理において、データが記憶されたバンクが存在しないため（ステップＳ２０２：Ｎｏ）、ステップＳ２１０に移行することになる。
【００６１】
［シーケンス番号のチェック処理］
図１１は、シーケンス番号のチェック処理の一例を示すフローチャートである。シーケンス番号のチェック処理では、例えば、異常値等が誤って書込まれることにより、図１４で後述する最新のバンクの判定処理でのエラーを防ぐ必要がある。そこで、シーケンス番号のチェック処理では、検索対象の現バンクと配列番号が１つ前のバンクとの間のシーケンス番号の関係が、最初に所定値を加算した関係にあるバンクの組合せを検索する。本実施形態では、例えば、所定値を１とする。つまり、プロセッサ１１０は、終端バンクの配列番号から遡る方向へ、前後のバンクのシーケンス番号を順次比較し、最初に所定値分、シーケンス番号が加算されている関係になっているバンクの組合せを特定する後方サーチを実行する。
【００６２】
なお、シーケンス番号のチェック処理では、例えば、予め設定した範囲のシーケンス番号以外の数値が書込まれたり、同じシーケンス番号が誤って連続して書込まれたりする場合、異常値が書込まれたと判定する。そして、プロセッサ１１０は、異常値と判定されたシーケンス番号のバンクを選択しないようにする。ここで、シーケンス番号のチェック処理では、最初に所定値を加算した関係にあるバンクの組合せを特定すれば、最新のバンクの判定処理に移行することができる。そのため、通常は、異常値等が誤って書込まれることはないので、例えば、チェックバンクの値が０（ゼロ）でなければ、本実施形態では、ステップＳ４０１、Ｓ４０２、Ｓ４０４、Ｓ４０５、Ｓ４０６の処理の流れになる。以下、具体的に処理の流れを説明する。
【００６３】
ステップＳ４０１：プロセッサ１１０は、チェックカウントとして、終端バンク数＋１の値を設定すると共に、チェックバンクとして、終端バンクを設定する。ここで、チェックカウントは、ループ処理用のカウント値である。終端バンク数＋１の値を設定するのは、バンクの配列番号を０（ゼロ）から開始しているため、検索対象のバンク数は、終端バンク数＋１の値になるからである。
【００６４】
ステップＳ４０２：プロセッサ１１０は、チェックバンクの値が、０（ゼロ）であるか否かを判定する。チェックバンクの値が、０（ゼロ）の場合（ステップＳ４０２：Ｙｅｓ）、ステップＳ４０３に移行する。一方、チェックバンクの値が、０（ゼロ）以外の場合（ステップＳ４０２：Ｎｏ）、ステップＳ４０４に移行する。
【００６５】
ステップＳ４０３：プロセッサ１１０は、バンク全体の終端を指定する。具体的には、プロセッサ１１０は、１つ前のバンクを指定するため、バンク数−１の値を設定する。プロセッサ１１０が、このような処理を実行するのは、本実施形態では、バンクＢ０（配列番号＝０）の場合は、１つ前のバンクが存在しないため、バンク全体の終端の配列番号に戻すための措置である。そして、ステップＳ４０５の処理に移行する。
ステップＳ４０４：プロセッサ１１０は、１つ前のバンクを指定する。具体的には、プロセッサ１１０は、チェックバンク−１の値を設定する。そして、ステップＳ４０５の処理に移行する。
ステップＳ４０５：プロセッサ１１０は、ベース領域とミラー領域との少なくとも一方のシーケンス番号の関係が、＋１であるか否かを判定する。この条件を満たしていれば（ステップＳ４０５：Ｙｅｓ）、ステップＳ４０６に移行する。一方、この条件を満たしていなければ（ステップＳ４０５：Ｎｏ）、ステップＳ４０７に移行する。
【００６６】
ステップＳ４０６：プロセッサ１１０は、最新のバンクの判定処理を実行するための検索用基準バンクの値として、現在のチェックバンクの値を設定する。つまり、プロセッサ１１０は、最初に所定値分、シーケンス番号が加算されている関係になっているバンクの組合せを特定し、その組合せのうちで配列番号が大きい方のバンクを選択して、現在のチェックバンクの値とし、検索用基準バンクの値として設定する。
ステップＳ４０７：プロセッサ１１０は、後方サーチにより、１つ前のバンクを選択するため、チェックバンクの値に、チェックバンク−１の値を代入すると共に、チェックカウントの値にチェックカウント−１の値を代入する。
【００６７】
ステップＳ４０８：プロセッサ１１０は、チェックカウントの値が、０（ゼロ）であるか否かを判定する。チェックカウントの値が、０（ゼロ）の場合（ステップＳ４０８：Ｙｅｓ）、ステップＳ４０９の処理に移行する。一方、チェックカウントの値が、０（ゼロ）以外の場合（ステップＳ４０８：Ｎｏ）、ステップＳ４０２の処理に戻る。
【００６８】
ステップＳ４０９：プロセッサ１１０は、終端バンクを最新のバンクとする。これは、チェックカウント（ループカウント）分、回しても、シーケンス番号が、＋１になる関係の組合せが存在しないことで、通常は発生しないケースを想定しており、本実施形態では、バンク全体の終端を最新のバンクとみなして、図１１に示すフローチャートの処理を終了し、書込み処理の場合には、図６に示すステップＳ１０２の処理に戻る。そして、ステップＳ１０３の処理において、シーケンス番号の読出しは、バンク全体における終端のバンクのシーケンス番号となる。
一方、読込み処理の場合には、図９に示すステップＳ２０２に戻る。この場合、ステップＳ２０３の判定処理に移行する。
【００６９】
図１２、図１３は、シーケンス番号のチェック処理の一例を説明する図である。なお、説明の便宜上、ベース領域について説明している（ミラー領域についても同様）。例えば、図１に示す第１セクタ１３ａにおいて、１セクタを使用して４バンクを構成した場合（図１２の左側参照）、一例として、バンクＢ２にデータが記憶されており、バンクＢ３にデータが記憶されていないので、書込み済みのバンクの終端は、バンクＢ２になる。そして、バンクＢ２とバンクＢ１とのシーケンス番号の関係が、＋１の関係を満たしているので、検索用基準バンクは、バンクＢ２になる。
【００７０】
また、例えば、図１に示す第１セクタ１３ａにおいて、２セクタを使用して８バンクを構成した場合（図１２の右側参照）、一例として、書込み済みのバンクの終端は、バンクＢ７になる。そして、バンクＢ７とバンクＢ６とのシーケンス番号の関係が、＋１の関係を満たしているので、検索用基準バンクは、バンクＢ７になる。
【００７１】
一方、図１３に示す通り、例えば、図１に示す第１セクタ１３ａにおいて、２セクタを使用して４バンクを構成した場合（図１３の左側参照）、一例として、本来ならば、バンクＢ７には、シーケンス番号（ＳＮ＝７）が割り振られるところ、シーケンス番号（ＳＮ＝６）が割り振られている。この場合、プロセッサ１１０は、この値を異常値としてみなして、バンクＢ６とバンクＢ５とのシーケンス番号の関係が、＋１の関係を満たしているので、検索用基準バンクは、バンクＢ６とする。
【００７２】
また、例えば、図１に示す第１セクタ１３ａにおいて、３セクタを使用して４バンクを構成した場合（図１３の右側参照）、一例として、本来ならば、バンクＢ９には、シーケンス番号（ＳＮ＝２５０）が割り振られるところ、異常値として、シーケンス番号（ＳＮ＝２５５）が割り振られている。この場合、プロセッサ１１０は、バンクＢ１１とバンクＢ１０とのシーケンス番号の関係が、＋１の関係を満たしているので、たとえ、バンクＢ９に異常値が混入していても、検索用基準バンクを、バンクＢ１１とする。このように異常値を無視しても、最新のバンクの判定処理に移行する際に、異常値による影響を受けずに済むからである。このようにして、検索用基準バンクが決定されると、プロセッサ１１０は、次に、以下のバンクの判定処理を実行する。
【００７３】
［最新のバンクの判定処理］
図１４は、最新のバンクの判定処理の一例を示すフローチャートである。図１５は、最新のバンクの判定処理の一例を説明する図である。この判定処理では、推定値というパラメータを導入することで、データの書込みが最新のバンクの判定を容易にすることができる。
【００７４】
ステップＳ５０１：プロセッサ１１０は、最新のバンクを判定するため、初期設定を実行する。具体的には、プロセッサ１１０は、先ず、（１）チェックカウント、（２）チェックバンク、（３）シーケンス番号の推定値、（４）最新バンク、（５）最新シーケンス番号の値をそれぞれ設定する。
ここで、チェックカウントには、データの書込みされているバンク数が設定される。この値は、後述するステップＳ５１１において、チェック回数として、ステップＳ５０２〜Ｓ５１１の処理をループする回数を設定することに相当する。また、チェックバンクには、検索基準バンクの配列番号が設定される。
【００７５】
さらに、シーケンス番号の推定値は、先ず、初期値として、チェックバンク（検索基準バンク）のシーケンス番号が設定される。また、最新バンクは、先ず、処理開始のバンクを設定するため、検索基準バンクの配列番号を設定する。最新シーケンス番号は、検索基準バンクのシーケンス番号が設定される。
【００７６】
例えば、図１５では、図１に示す第１セクタ１３ａにおいて、一例として、２セクタを使用して８バンクの構成を示しており、チェックカウントは、バンクＢ０〜バンクＢ７まで、データの書込みがなされているので、８の値が設定される。また、チェックバンクは、検索基準バンクがバンクＢ７であるので、その配列番号７が設定される。また、シーケンス番号の推定値は、検索基準バンクのシーケンス番号であるので、１５の値が設定される。最新バンクは、検索基準バンクがバンクＢ７であるので、先ず、その配列番号７が設定される。最新シーケンス番号は、検索基準バンクのシーケンス番号であるので、１５の値が設定される。
【００７７】
ステップＳ５０２：プロセッサ１１０は、チェックバンクの値がバンク全体の終端か否かを判定する。具体的には、チェックバンクの値が（バンク数−１）以上であるか否かを判定する。これは、当該判定対象のバンクが配列番号の最後か否かを判定することを意味する。チェックバンクの値が（バンク数−１）以上であれば（ステップＳ５０２：Ｙｅｓ）、処理対象のバンクをバンクＢ０に戻す必要があるので、ステップＳ５０３に移行する。一方、チェックバンクの値が（バンク数−１）よりも小さい値であれば（ステップＳ５０２：Ｎｏ）、ステップＳ５０４に移行する。
【００７８】
ステップＳ５０３：プロセッサ１１０は、チェックバンクの値を０（ゼロ）に設定する。つまり、配列番号が０（ゼロ）の先頭バンクが設定されることになる。ここで、一例として、図１５を参照すると、バンク数−１の値が７になり、チェックバンクの値が７であるので、バンク全体の終端をチェックしていることになるので、プロセッサ１１０は、バンクＢ０に設定する。
ステップＳ５０４：プロセッサ１１０は、チェックバンクの値をチェックバンク＋１に設定する。
【００７９】
ステップＳ５０５：プロセッサ１１０は、シーケンス番号（推定値）が、シーケンス番号（最大値）と等しいか否かを判定する。この条件を満たさない場合（ステップＳ５０５：Ｎｏ）、ステップＳ５０６に移行する。一方、この条件を満たした場合（ステップＳ５０５：Ｙｅｓ）、ステップＳ５０７に移行する。
【００８０】
本実施形態では、上述した通り、例えば、シーケンス番号として、０から２５４まで循環させてカウントする方式を採用しているため、シーケンス番号の最大値は、２５４の値になる。つまり、シーケンス番号が２５４に達すると、該シーケンス番号を０（ゼロ）に戻す必要がある。そのため、ステップＳ５０５の処理でシーケンス番号が最大値（２５４）に達した場合には、ステップＳ５０７の処理に移行させるようにしている。
【００８１】
ステップＳ５０６：プロセッサ１１０は、シーケンス番号（推定値）のインクリメント処理を行う。具体的には、プロセッサ１１０は、シーケンス番号（推定値）に、シーケンス番号（推定値）＋１の値を設定する。
ステップＳ５０７：プロセッサ１１０は、シーケンス番号（推定値）に、０（ゼロ）を設定する。
【００８２】
ステップＳ５０８：プロセッサ１１０は、ベース領域とミラー領域との少なくとも一方のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たした場合（ステップＳ５０８：Ｙｅｓ）、ステップＳ５０９に移行する。一方、この条件を満たさない場合（ステップＳ５０８：Ｎｏ）、ステップＳ５１０に移行する。
ステップＳ５０９：プロセッサ１１０は、最新バンクにチェックバンクの値を設定し、最新シーケンス番号に、シーケンス番号（推定値）を設定する。
【００８３】
ステップＳ５１０：プロセッサ１１０は、後方サーチを実行するため、チェックカウントの値に、（チェックカウント−１）の値を設定する。
ステップＳ５１１：プロセッサ１１０は、チェックカウントの値が、０（ゼロ）であるか否かを判定する。チェックカウントの値が、０（ゼロ）以外の値であれば（ステップＳ５１１：Ｎｏ）、ステップＳ５０２の処理に戻る。一方、チェックカウントの値が、０（ゼロ）であれば（ステップＳ５１１：Ｙｅｓ）、後方サーチにより、ループする回数に達したことになるので、図１４に示すフローチャートの処理を終了し、書込み処理の場合には、図６に示すステップＳ１０２の処理に戻る。一方、読込み処理の場合には、図９に示すステップＳ２０２に戻る。
【００８４】
ここで、再度、図１５を用いて、ステップＳ５０２〜ステップＳ５１１の処理の一例を説明すると、チェックバンクは、バンク全体の終端バンクがバンクＢ７であるので（ステップＳ５０２：Ｙｅｓ）、プロセッサ１１０は、バンクＢ０をチェック対象に設定する（ステップＳ５０３）。この段階で、シーケンス番号は、まだ、２５４の値に達していないため（ステップＳ５０５：Ｎｏ）、シーケンス番号（推定値）は、現在のシーケンス番号（推定値：１５）＋１＝１６となる（ステップＳ５０６）。そして、ベース領域の現在のシーケンス番号とシーケンス番号（推定値）とは、共に１６の値で一致するため（ステップＳ５０８：Ｙｅｓ）、ステップＳ５０９に移行する。
【００８５】
プロセッサ１１０は、チェック対象の最新バンクをバンクＢ０に設定し、チェック対象の最新のシーケンス番号と、シーケンス番号（推定値）を設定する（ステップＳ５０９）。そして、プロセッサ１１０は、ループカウントを１つ減らし（ステップＳ５１０）、ループカウントが、０（ゼロ）でないので（ステップＳ５１１：Ｎｏ）、ステップＳ５０２〜ステップＳ５１１の処理を繰り返す。
【００８６】
すると、図１５に示す通り、シーケンス番号（推定値）は、１７、１８、１９と増加していくが、バンクＢ４で、現在のシーケンス番号が１２であるのに対し、シーケンス番号（推定値）が２０となり、一致しない（ステップＳ５０８：Ｎｏ）。そのため、プロセッサ１１０は、ステップＳ５０９の処理をスキップし、ステップＳ５１０の処理を実行する。その結果、図１５に示す通り、シーケンス番号（推定値）は、以後、２０、２１、２２となる。また、チェック回数を示すチェックカウントの値が開始時には８であったのが、フローチャートの処理を実行することにより、０（ゼロ）となり（ステップＳ５１１：Ｙｅｓ）、プロセッサ１１０は、図１４に示すフローチャートの処理を終了する。この処理により、最新のシーケンス番号は、１９となり、プロセッサ１１０は、データの書込みが最新のバンクを、バンクＢ３と判定することができる。
【００８７】
［データの読込み処理の詳細］
次に、図９で示したデータの読込み処理において、最新のバンクが特定された後のデータの読込み処理をより詳細に説明する。
図１６は、データの読込み処理の一例を示すフローチャートである。
データの読込み処理の詳細について、本実施形態では、上述したバンクの新旧を特定した後に、バンクの有効性判断を実行する。つまり、バンクは、図４に示すデータ構造において、データチェックの項目を有しており、プロセッサ１１０は、データチェックに基づくチェックサム等でデータの検証をする前に、シーケンス番号等を解析することにより、データの書込みが最新のバンクを判定することができる。これにより、全てのバンクのデータに対して、データの検証を行わずに済むので、無駄なメモリアクセスを行わずにフラッシュメモリ１３０の初期チェック等の処理時間を短縮することが可能となる。
【００８８】
ステップＳ６０１：プロセッサ１１０は、データを読込むために、入力値の設定を実行する。具体的には、プロセッサ１１０は、チェックバンクの値にバンク数を設定し、チェックバンクの値に、最新バンクの配列番号を設定する。さらに、プロセッサ１１０は、シーケンス番号（推定値）に、最新のシーケンス番号を設定する。
【００８９】
ステップＳ６０２：プロセッサ１１０は、当該読込み対象のバンクにおけるベース領域のチェックデータが有効であり、かつ、ベース領域のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たしている場合（ステップＳ６０２：Ｙｅｓ）、ステップＳ６１４の処理に移行する。一方、この条件を満たしていない場合（ステップＳ６０２：Ｎｏ）、ステップＳ６０３の処理に移行する。なお、ここで、チェックデータが有効であるとは、上述した通り、例えば、当該読込み対象のバンク内におけるデータのチェックサムの検証が正しいことを意味する。
【００９０】
ステップＳ６０３：プロセッサ１１０は、ミラー領域のチェックデータが有効であり、かつ、ミラー領域のシーケンス番号が推定値と一致するか否かを判定する。この条件を満たしている場合（ステップＳ６０３：Ｙｅｓ）、ステップＳ６１５の処理に移行する。一方、この条件を満たしていない場合（ステップＳ６０２：Ｎｏ）、ステップＳ６０４の処理に移行する。
【００９１】
ステップＳ６０４：プロセッサ１１０は、両方の領域のチェックデータが無効であるか否かを判定する。この条件を満たしている場合（ステップＳ６０４：Ｙｅｓ）、当該バンクについては、両方の領域とも異常なデータであり、プロセッサ１１０は、データの選択をしないため、ステップＳ６０８の処理に移行する。
一方、この条件を満たしていない場合（ステップＳ６０４：Ｎｏ）、ベース領域とミラー領域との何れか一方のデータを選択するため、ステップＳ６０５の処理に移行する。
【００９２】
ステップＳ６０５：プロセッサ１１０は、ベース領域のチェックデータが有効であるか否かを判定する。有効である場合（ステップＳ６０５：Ｙｅｓ）、ステップＳ６０６の処理に移行し、無効である場合（ステップＳ６０５：Ｎｏ）、ステップＳ６０７の処理に移行する。
【００９３】
ステップＳ６０６：プロセッサ１１０は、ベース領域のデータを選択して、正常なバンクのデータとする。
ステップＳ６０７：プロセッサ１１０は、既にＳ６０４の処理において、両方の領域におけるチェックデータの有効性を判定しているので、ベース領域のデータが無効であれば、ミラー領域のデータを選択して、正常なバンクのデータとする。
【００９４】
ステップＳ６０８：プロセッサ１１０は、チェックカウントの後方サーチのためのデクリメント処理（チェックカウント＝チェックカウント−１）を実行する。
ステップＳ６０９：プロセッサ１１０は、チェックカウントの値が、０（ゼロ）の値であるか否かを判定する。０（ゼロ）の値である場合（テップＳ６０９：Ｙｅｓ）、ステップＳ６１１の処理に移行する。一方、０（ゼロ）以外の値である場合（テップＳ６０９：Ｎｏ）、ステップＳ６１０の処理に移行する。
【００９５】
ステップＳ６１０：プロセッサ１１０は、チェックバンク及びシーケンス番号（推定値）を決定するためのサブルーチンの処理を実行する。サブルーチンの処理の詳細は、図１７を用いて後述する。
ステップＳ６１１：プロセッサ１１０は、正常なバンクのデータを記憶済みであるか否かを判定する。この条件を満たしている場合（ステップＳ６１１：Ｙｅｓ）、ステップＳ６１２の処理に移行し、この条件を満たしていない場合（ステップＳ６１１：Ｎｏ）、ステップＳ６１３の処理に移行する。
【００９６】
ステップＳ６１２：プロセッサ１１０は、格納データの読出しを実行し、図１６に示すフローチャートの処理を終了する。
ステップＳ６１３：プロセッサ１１０は、異常を検出し、図１６に示すフローチャートの処理を終了する。
ステップＳ６１４：プロセッサ１１０は、ベース領域から正常なバンクのデータを読出し、図１６に示すフローチャートの処理を終了する。
ステップＳ６１５：プロセッサ１１０は、ミラー領域から正常なバンクのデータを読出し、図１６に示すフローチャートの処理を終了する。
【００９７】
次に、上記のステップＳ６１０で実行するサブルーチンの処理を説明する。
図１７は、チェックバンク及びシーケンス番号（推定値）を決定するためのサブルーチンの一例を示すフローチャートである。
【００９８】
ステップＳ７０１：プロセッサ１１０は、チェックバンクの値が、０（ゼロ）であるか否かを判定する。この条件を満たす場合（ステップＳ７０１：Ｙｅｓ）、ステップＳ７０２の処理に移行し、この条件を満たさない場合（ステップＳ７０１：Ｎｏ）、ステップＳ７０３の処理に移行する。
ステップＳ７０２：プロセッサ１１０は、チェックバンクをバンク全体の終端を指定する。具体的には、プロセッサ１１０は、チェックバンクの値に、バンク数−１の値を代入する。
【００９９】
ステップＳ７０３：プロセッサ１１０は、１つ前のバンクを指定する。具体的には、プロセッサ１１０は、チェックバンクの値に、１を減算するデクリメント処理を実行する。
ステップＳ７０４：プロセッサ１１０は、シーケンス番号が、０（ゼロ）であるか否かを判定する。この条件を満たす場合（ステップＳ７０４：Ｙｅｓ）、ステップＳ７０５の処理に移行し、この条件を満たさない場合（ステップＳ７０４：Ｎｏ）、ステップＳ７０６の処理に移行する。
【０１００】
ステップＳ７０５：プロセッサ１１０は、シーケンス番号（推定値）に、シーケンス番号の最大値を代入する。そして、図１６に示すステップＳ６０２の処理に戻る。
ステップＳ７０６：プロセッサ１１０は、シーケンス番号（推定値）に、１を減算するデクリメント処理を実行する。そして、図１６に示すステップＳ６０２の処理に戻る。
【０１０１】
以上より、本実施形態では、バンクに記憶されているデータを読込む場合、例えば、フラッシュメモリ１３０のアクセス先として、最も更新順序が新しいシーケンス番号を選択することで、データの書込みが最新のバンクに記憶されているデータを読出すことができる。
また、本実施形態では、例えば、図１５に示す通り、最新のバンクの次のシーケンス番号のバンクに書込み時刻が最も古いデータが記憶されている。したがって、本実施形態では、バンクに記憶されているデータを書込む場合、例えば、フラッシュメモリ１３０のアクセス先として、最も更新順序が古いシーケンス番号を選択することで、最も古いデータを消去して、新たにデータを書込むことができる。
【０１０２】
また、本実施形態では、シーケンス番号を循環させてカウントする方式を採用することにより、カウンタのバイトサイズに依存せずに、データの新旧を特定できるので、図４に示すバンクのデータ構造において、そのバイトサイズを節約することができる。さらに、本実施形態では、フラッシュメモリ１３０上の消去回数を考慮しなければ、理論上の書込み回数は無限となる。また、本実施形態では、デバイス毎のセクタサイズに依存せずに、データの新旧を特定できる。
【０１０３】
［本実施形態の補足事項］
（１）本実施形態では、フラッシュメモリ１３０において、記憶するデータの種類により、複数のエリアに分けて、バンクが構成されてもよい。
図１８は、複数の種類のバンク構成例を説明する図である。本実施形態では、データの種類は、主に、書込み要求が発生するタイミングによって分けられる。例えば、エラー発生時のデータ保存領域（Freeze Frame Data）、シャットダウン時の各種情報、システム学習データ等である。
そこで、図１８では、フラッシュメモリ１３０内に、例えば、３つのエリアを設定する。具体的には、フラッシュメモリ１３０は、第０エリアとして、エラー発生時のデータ保存領域（Freeze Frame Data）１３０ａ、第１エリアとして、シャットダウン情報１３０ｂ、第２エリアとして、システム学習データ１３０ｃの領域を設ける。なお、それぞれエリアは、ベース領域とミラー領域とを備える。
【０１０４】
ここで、各エリアは、データの種類の違いにより、フラッシュメモリ１３０に対する書込み頻度が異なるため、バンクの構成を任意に設定してもよい。例えばシャットダウン時の各種情報の場合、 シャットダウン毎に書込みが発生するため、書込み頻度が高くバンク数を多めに設定することが好ましい。
また、システムの学習データの場合、工場出荷前に一度しか書込みをしないような場合は、バンク数は１として設定することが好ましい。
【０１０５】
（２）本実施形態では、フラッシュメモリ１３０のアドレス参照において、テーブルデータを基に自動的に計算してもよい。例えば、各エリアのバンクサイズ及びバンク数のデータをテーブルデータ化し、プログラムデータと共に配置してもよい。プロセッサ１１０は、フラッシュメモリ１３０の各エリアの各バンクへアクセスする場合、テーブルデータを基にアクセスするアドレスを計算してもよい。
【０１０６】
図１９は、テーブルデータの一例を示す図である。プロセッサ１１０は、例えば、図１９に示すテーブルデータＴ１に基づいて、目標とするアドレスを計算してもよい。具体的には、プロセッサ１１０は、システム学習データのミラー領域のバンクＭ０にアクセスする場合、目標アドレスとして、（ａ）フラッシュメモリ１３０の先頭アドレスと、（ｂ）エラー発生時のデータ保存領域（Freeze Frame Data）の合計サイズと、（ｃ）シャットダウン時の各種データのベース領域サイズとの合計を求める。なお、プロセッサ１１０は、各エリアの合計サイズとして、必要なセクタ数×セクタサイズにより、算出してもよい。
【０１０７】
（３）本実施形態では、ベース領域及びミラー領域において、正常にデータの書込みが終了しない場合には、再書込みをｎ回（例えばｎ＝１）だけ実行するようにしてもよい。なお、ベース領域及びミラー領域のバンク数が１つの場合には、再書込みは、同領域へ続けて実施してもよい。
【０１０８】
また、バンクが複数の場合には、再書込みは、ベース領域とミラー領域との両方の書込みの終了後に、次のバンクに実行するようにしてもよい。さらに、再書込み後に、ベース領域及びミラー領域が共に正常でなければ、書込み異常として検出するようにしてもよい。
あるいは、複数のバンクの構成において、プロセッサ１１０がミラー領域にデータを書込み、その上で異常と判定した場合、１回だけ、次のバンクのベース領域に書込むと共に、そのベース領域に対するミラー領域に書込むようにしてもよい。
【０１０９】
図２０は、再書込みの一例を示すフローチャートである。なお、以下で説明する再書込みは、このフローチャートの処理に限定されるものではない。
【０１１０】
ステップＳ８０１：プロセッサ１１０は、書込み対象のバンクを、書込みが最新のバンクの次の配列番号のバンクに設定する。なお、ベース領域及びミラー領域のバンク数が１つの場合には、この処理をスキップし、同じバンクに設定する。
ステップＳ８０２：プロセッサ１１０は、ステップＳ８０１で設定したバンクのミラー領域のみ異常であるか否かを判定する。このミラー領域のみ異常である条件を満たす場合（ステップＳ８０２：Ｙｅｓ）、ステップＳ８０３の処理に移行する。一方、この条件を満たさない場合（ステップＳ８０２：Ｎｏ）、ステップＳ８０４の処理に移行する。
【０１１１】
ステップＳ８０３：プロセッサ１１０は、フラッシュメモリ１３０上における当該書込み対象のバンクのミラー領域へ、データを書込む。これにより、フラッシュメモリ１３０は、そのミラー領域にデータを記憶する。
ステップＳ８０４：プロセッサ１１０は、フラッシュメモリ１３０上における書込み対象のバンクのベース領域へデータを書込む。これにより、フラッシュメモリ１３０は、そのベース領域にデータを記憶する。
【０１１２】
ステップＳ８０５：プロセッサ１１０は、ベース領域及びミラー領域のバンク数が各々１つであり、かつ、書込み異常が発生したか否かを判定する。この条件を満たす場合（ステップＳ８０５：Ｙｅｓ）、ステップＳ８０６の処理に移行する。一方、この条件を満たさない場合（ステップＳ８０５：Ｎｏ）、ステップＳ８０７の処理に移行する。
ステップＳ８０６：プロセッサ１１０は、同じ領域にデータの再書込みを実行する。すなわち、バンク数が１つの場合には、プロセッサ１１０は、ベース領域で異常が発生した場合には、そのベース領域に再書込みを実行し、ミラー領域で異常が発生した場合には、そのミラー領域に再書込みを実行する。
【０１１３】
ステップＳ８０７：プロセッサ１１０は、逆の領域にデータの再書込みを実行する。すなわち、プロセッサ１１０は、ベース領域で異常が発生した場合には、ベース領域に対応するミラー領域に再書込みを実行し、ミラー領域で異常が発生した場合には、そのミラー領域に対応するベース領域に再書込みを実行する。
ステップＳ８０８：プロセッサ１１０は、バンク数が１つであって、かつ、書込み異常が再度発生したか否かを判定する。この条件を満たす場合（ステップＳ８０８：Ｙｅｓ）、ステップＳ８０９の処理に移行する。一方、この条件を満たさない場合（ステップＳ８０８：Ｎｏ）、ステップＳ８１０の処理に移行する。
【０１１４】
ステップＳ８０９：プロセッサ１１０は、ステップＳ８０６と同様、同じ領域にデータの再書込みを実行する。
ステップＳ８１０：プロセッサ１１０は、ベース領域及びミラー領域において、共に書込みが正常終了したか否かを判定する。正常終了した場合（ステップＳ８１０：Ｙｅｓ）、図２０に示すフローチャートの処理を終了する。一方、正常終了しなかった場合（ステップＳ８１０：Ｎｏ）、ステップＳ８１１の処理に移行する。
【０１１５】
ステップＳ８１１：プロセッサ１１０は、バンク数が複数、かつ、再書込みが未実施のバンクがあるか否かを判定する。この条件を満たす場合（ステップＳ８１１：Ｙｅｓ）、ステップＳ８０１の処理に戻る。一方、この条件を満たさない場合（ステップＳ８１１：Ｎｏ）、ステップＳ８１２の処理に移行する。
ステップＳ８１２：プロセッサ１１０は、書込み異常と検出し、図２０に示すフローチャートの処理を終了する。
【０１１６】
（４）本実施形態では、バンクのデータ読出しは、チェックデータ等が有効なバンクの中で、最新のデータの書込みをしたバンクに対して実行してもよい。この場合、プロセッサ１１０は、読出した最新の有効なバンクのデータについて、ベース領域又はミラー領域が異常であった場合、異常な領域に対し、正常な領域のデータを用いて、書直しを実行してもよい。このような構成により、自動車用電子制御装置１００が異常停止した場合であっても、フラッシュメモリ１３０に記憶されたデータは、保証される。
【０１１７】
図２１、図２２は、データの書直しの一例を説明する図である。図２１において、一例として、図１に示す第１セクタ１３ａにおいて、第１セクタ１３ａのベース領域及び第２セクタ１３ｂのミラー領域のバンク数が各々１つの場合、プロセッサ１１０は、異常な領域のみデータの書直しを実行する。具体的には、プロセッサ１１０は、バンクＭ０のミラー領域が異常であるため、ベース領域のデータをミラー領域に複写することで、書直しを実行する。
【０１１８】
また、図２２において、一例として、図１に示す第１セクタ１３ａにおいて、第１セクタ１３ａのベース領域及び第２セクタ１３ｂのミラー領域のバンク数が複数の場合、プロセッサ１１０は、次のバンクへ移動し、ベース領域及びミラー領域にデータの書込みを実行する。例えば、プロセッサ１１０は、バンクＢ１のベース領域が異常であるため、バンクＭ１のミラー領域のデータを、ベース領域のバンクＢ２及びミラー領域のバンクＭ２に複写することで、書直しを実行する。したがって、このような制御は、チェックデータ等が正常なデータを常に二重に記憶し、データの保証性能を向上させることができる。
【０１１９】
例えば、初回の書込み以降、書込みが発生しなかった場合、経年劣化によりフラッシュメモリ１３０に記憶されたデータが壊れる可能性がある。そこで、プロセッサ１１０は、片方の領域のデータ故障が発生した場合であっても、フラッシュメモリ１３０に記憶したデータをリフレッシュする。これにより、長期のデータ保持の効果が期待できる。
【０１２０】
さらに、一例として、起動時の読出しで、ベース領域又はミラー領域の異常を検出した場合、（ａ）書込み異常が発生したのか、（ｂ）書込み中に強制終了(電源異常等)したのか、（ｃ）電源オフ中にフラッシュメモリ１３０のデータが壊れたのか、ユーザにとっては、確実に判断することが困難である。また、シャットダウン前の書込み異常については、異常を検知しても、シャットダウンの実行により、ユーザに通知する手段が困難な場合がある。
【０１２１】
そこで、このようなケースに対して、読出し時に、ベース領域又はミラー領域の異常を検出した場合、プロセッサ１１０は、書直しを行い、その中で書込み異常が発生するかどうかを確認することで、フラッシュメモリ１３０への書込み異常をより正確に検出することができる。また、プロセッサ１１０は、データの読出し直後、例えば、図１に示す自動車用電子制御装置１００の起動直後での書直しを実行した場合等、ユーザへの通知する機会を増やすことができる。
【０１２２】
（５）本実施形態では、図１に示すＲＡＭ１２０上のバッファを２段構成とすることで、常時、書込み要求の受付けをするようにしてもよい。
図２３は、書込み要求発生時における各バッファの更新の一例を説明する図である。
図２３において、ＲＡＭ１２０は、ＲＡＭバッファ１２０ａ〜１２０ｄを有する。ＲＡＭバッファ１２０ａは、第０エリアとして、エラー発生時のデータ保存領域（Freeze Frame Data）に使用される。ＲＡＭバッファ１２０ｂは、第１エリアとして、シャットダウン情報に使用される。ＲＡＭバッファ１２０ｃは、第２エリアとして、システム学習データに使用される。ＲＡＭバッファ１２０ｄは、書込み開始時にＲＡＭバッファ１２０ａ〜１２０ｃからデータをロードするために使用される。
【０１２３】
ここで、図２３に示す各エリアは、各バンクと同サイズのＲＡＭバッファを持つ。各ＲＡＭバッファ１２０ａ〜１２０ｃへのポインタは、テーブル化され、電源投入時のフラッシュメモリ１３０の読出し時に自動的に各ＲＡＭバッファ１２０ａ〜１２０ｃへロードされる。書込み要求発生時には各エリアのＲＡＭバッファが更新され、書込み開始時に、書込み中のエリアバッファ１２０ｄへ、対象となるエリアのＲＡＭバッファ内のデータがロードされる。ＲＡＭバッファが２段構成となるため、フラッシュメモリ１３０への書込み中であっても、各エリアは各ＲＡＭバッファ１２０ａ〜１２０ｃを更新し、次の書込み要求を受け付けることが可能である。
【０１２４】
（６）本実施形態では、各エリアに要求された書込みデータがＲＡＭバッファと同一の場合、フラッシュメモリ１３０への書込みを省略してもよい。例えば、プロセッサ１１０は、書込み要求の発生時に、書込み要求のデータと現在のＲＡＭバッファ１２０ａ〜１２０ｃの値を比較し、完全に一致した場合には、フラッシュメモリ１３０への書込みを省略してもよい。ただし、プロセッサ１１０は、フラッシュメモリ１３０のリフレッシュを目的として強制的な書込みをしてもよい。つまり、本実施形態では、新たなフラッシュメモリ１３０への書込みが不要であれば、フラッシュメモリ１３０への書込み回数を減らすことができるので、フラッシュメモリ１３０の寿命をより延ばすことができる。
【０１２５】
（７）本実施形態では、自動車用電子制御装置１００を、例えば、四輪駆動用のトランスファーＥＣＵに適用してもよい。
【０１２６】
図２４は、トランスファーＥＣＵに適用したフラッシュメモリ１３０の使用構成の一例を示すテーブルである。図２４に示すテーブルＴ２は、フラッシュメモリ１３０の使用構成を示すテーブル形式のデータであって、「エリアインデックス」、「用途」、「バンクサイズ」、「バンク数」、「合計サイズ」、「セクタ数」、「全使用サイズ」、「書込みタイミング」等の列を含んでいる。ここで、「全使用サイズ」は、ベース領域とミラー領域を合わせたサイズとする。また、セクタのサイズは、２５６バイトとする。
【０１２７】
ここで、トランスファーＥＣＵにおいて、自己診断による故障発生履歴は、故障が発生しなければデータは変化しない。そのため、故障発生履歴が確認できない場合、シャットダウン毎に書込み要求が発生しているが、データの変化がないため、本実施形態の第６の補足事項で上述した制御により、プロセッサ１１０は、フラッシュメモリ１３０への書込みを省略する。
【０１２８】
また、トランスファーＥＣＵでは、ベース領域及びミラー領域の全バンクに異常が発生し、万が一記憶データが失われてしまった場合、対象のエリアは全て初期データとして扱われる。システム学習の値については、学習制御を再び実行してフラッシュメモリ１３０へ記憶する。また、フラッシュメモリ１３０の異常として検出した場合、プロセッサ１１０は、ドライバーへの表示は実行せず、フラッシュメモリ１３０への故障情報の記憶のみを実行してもよい。
【０１２９】
（８）本実施形態では、後方サーチにより、最新のデータが書込みされたバンクの判定を実行したが、後方サーチに限られず、前方サーチを用いても実現可能である。また、本実施形態では、フラッシュメモリ１３０のメモリ上におけるブロック設定の余剰部分を利用して実行してもよい。また、本実施形態では、図４に示したバンクのデータ構造において、シーケンス番号に限られず、必要に応じて、例えば、終端バンクのアドレスの規定、任意の可変なデータサイズ等への対応を行える他に必要な属性情報等を付加するようにしてもよい。あるいは、本実施形態では、図４に示したバンクのデータ構造において、図２４に示したフラッシュメモリ１３０の使用構成のうちで、必要な項目の情報を適宜付加するようにしてもよい。
【０１３０】
（９）本実施形態では、不揮発メモリとして、ＥＥＰＲＯＭ等のフラッシュメモリを例示したが、これに限られず、例えば、ＮＡＮＤ（Not And）型フラッシュメモリ等、書換え回数の制限のある他のフラッシュメモリにも適用可能である。
【０１３１】
（１０）ここで、上記実施形態から把握し得る請求項以外の技術的思想について、以下に効果と共に記載する。
（ａ）上記制御部は、上記記憶領域に記憶されているデータを読込む場合、上記アクセス先として、最も更新順序が新しい識別子を選択し、上記データを上記記憶領域へ書込む場合、上記アクセス先として、最も更新順序が古い識別子を選択することを特徴とする請求項１に記載の自動車用電子制御装置。
このようにすれば、同一の記憶領域に対する書込み回数を制限し、各々の記憶領域におけるデータの消去回数を略均等化するようにデータの書込み先又は読込み先を決定できるので、フラッシュメモリ１３０の寿命をより延ばすことができる。
【０１３２】
（ｂ）上記記憶領域は、固有の配列番号を有し、上記制御部は、上記記憶領域の配列内で、空きを示す初期値のデータと異なるデータが記憶されている、上記配列番号が最大となる終端の記憶領域を検索し、上記終端の上記記憶領域の上記配列番号から遡る方向へ、前後の記憶領域の識別子を順次比較し、最初に所定値分が加算されている関係になっている記憶領域の組合せを特定し、上記組合せのうちで上記配列番号が大きい方の記憶領域を基準として、次に割り振られる記憶領域の上記識別子の推定値と、現在割り振られている上記識別子とを順番に比較し、互いに一致している識別子のうちで最大値を特定することで、該最大値が割り振られた記憶領域を、最新のデータが書込みされた記憶領域と判定することを特徴とする請求項１に記載の自動車用電子制御装置。
このように判定すれば、上記制御部は、データを読込む場合、データの書込みが最新のバンクからデータを容易に読込むことができる。また、上記制御部は、データを書込む場合、最新のデータが書込みされた記憶領域の次の識別子（最も更新順序が古い識別子）の記憶領域にデータを容易に書込むことができる。
【０１３３】
以上、本件に開示する一の実施形態について明細書及び図面等を用いて説明したが、本件開示の技術は、上記実施形態に限定されるものではない。つまり、本発明の技術的範囲内において、各種の改良又は変更も本件開示の技術に含まれるのは、特許請求の範囲の記載から明らかである。
【符号の説明】
【０１３４】
１００…自動車用電子制御装置
１１０…プロセッサ
１２０…ＲＡＭ
１３０…フラッシュメモリ
１４０…バス
１３ａ…第１セクタ
１３ｂ…第２セクタ
【図１】
0006317653.tif 000002
【図２】
0006317653.tif 000003
【図３】
0006317653.tif 000004
【図４】
0006317653.tif 000005
【図５】
0006317653.tif 000006
【図６】
0006317653.tif 000007
【図７】
0006317653.tif 000008
【図８】
0006317653.tif 000009
【図９】
0006317653.tif 000010
【図１０】
0006317653.tif 000011
【図１１】
0006317653.tif 000012
【図１２】
0006317653.tif 000013
【図１３】
0006317653.tif 000014
【図１４】
0006317653.tif 000015
【図１５】
0006317653.tif 000016
【図１６】
0006317653.tif 000017
【図１７】
0006317653.tif 000018
【図１８】
0006317653.tif 000019
【図１９】
0006317653.tif 000020
【図２０】
0006317653.tif 000021
【図２１】
0006317653.tif 000022
【図２２】
0006317653.tif 000023
【図２３】
0006317653.tif 000024
【図２４】
0006317653.tif 000025