(57)【特許請求の範囲】
【請求項１】
フラッシュメモリ（５）に対してデータの読み出しおよび書き込みを行う制御装置であって、
前記フラッシュメモリ（５）は、データ消去の単位となるブロックを複数有して構成され、
前記フラッシュメモリ（５）に記録するレコードの記録先を、当該レコードが含むデータの種別に応じて仕分けするため、前記フラッシュメモリ（５）の前記複数のブロックが、複数のエリアに区分けされており、
前記制御装置は、
前記複数のエリアのうち記録先のエリア用のブロック群に属するブロックから現在の記録先のブロック以外の次のブロックを抽出し、抽出した前記次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定する消去・判定手段（１５０、１６０、１７５、２３５、２４０）と、
前記次のブロックのデータの消去に成功したと前記消去・判定手段が判定したことに基づいて、当該消去に成功したブロックを、新たな記録先のブロックとし、それまでの記録先のブロックから、一部のレコードを読み出して現在の記録先のブロックにコピーする有効データコピー手段（１７０）と、を備え、
前記消去・判定手段は、前記次のブロックのデータの消去に失敗したと判定したことに基づいて、前記次のブロックが故障したと判定して、前記次のブロックを前記記録先のエリア用のブロック群から除外し、前記複数のエリアのうち、データの記録頻度が最も低いエリアとしてあらかじめ定められたエリアである交換対象エリアに属するブロックから、更に次のブロックを抽出し、抽出した前記更に次のブロックを前記記録先のエリア用のブロック群に含め、抽出した前記更に次のブロックを前記交換対象エリア用のブロック群から除外し、抽出した前記更に次のブロックに現在記録されているレコードの一部を、前記故障したと判定したブロックにコピーし、前記故障したと判定したブロックを、前記交換対象エリア用のブロック群に含め、抽出した前記更に次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定し、
前記有効データコピー手段（１７０）は、前記更に次のブロックの消去に成功したと前記消去・判定手段が判定したことに基づいて、当該消去に成功したブロックを、新たな記録先のブロックとすることを特徴とする制御装置。
【請求項２】
前記消去・判定手段は抽出した前記更に次のブロックに現在記録されているレコードの一部を、前記故障したと判定したブロックにコピーする際、レコードの書き込みに失敗した場合は、書き込みが成功するまで、記録先のアドレスをスキップしながら、書き込みをリトライすることを特徴とする請求項１に記載の制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、フラッシュメモリに対してデータの読み出しおよび書き込みを行う制御装置に関するものである。
【背景技術】
【０００２】
従来、データ消去の最小単位となるブロックを複数有するフラッシュメモリに対してデータの読み出しおよび書き込みを行う制御装置として、あるブロックのデータを消去して新たな記録先のブロックとし、それまでの記録先のブロックのデータのうち、一部の必要なデータを現在の記録先のブロックにコピーし、その後、新たに書き込み要求が発生したデータを、当該新たな記録先のブロックに記録していくという処理を行う技術が知られている。
【０００３】
また、特許文献１では、データを現在の記録先のブロックに記録する際、記録に失敗した場合は、現在の記録先のブロックが故障していると判定し、次のブロックのデータを消去して新たな記録先のブロックとし、前回の記録先のブロックのデータのうち、一部の必要なデータを、現在の記録先のブロックにコピーすると共に、故障であると判定した前回の記録先のブロックについては、以後使用しないようにする技術が記載されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００５−２１６２９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、特許文献１のような技術では、ブロックへのデータの書き込みが失敗するまで、ブロックの故障を検知できないので、データをブロックからブロックへコピーする回数が多くなってしまうという問題がある。
【０００６】
例えば、データを１０００個程度有するブロックＡが故障して１００番目のデータの書き込みができなくなっている場合、１〜９９番目までのデータが書き込まれた後、１００番目のデータの書き込みが失敗して、ブロックＡが故障だと判定し、ブロックＡから次のブロックＢに必要なデータをコピーする。この場合、通常ならば１０００回毎に訪れるコピーのタイミングが、１００回目で訪れることになり、その結果、ブロック間のコピー頻度が増大してしまい、その結果、制御装置の処理負荷が増大してしまう。
【０００７】
本発明は上記点に鑑み、次のブロックのデータを消去して新たな記録先のブロックとし、前回の記録先のブロックのデータのうち、一部の必要なデータを現在の記録先のブロックにコピーし、その後、現在の記録先のブロックに順次データを記録していくというフラッシュメモリの書き込み制御において、ブロックの故障に起因してブロック間のデータのコピー頻度が増大するのを防ぐことを目的とする。
【課題を解決するための手段】
【０００８】
上記目的を達成するための請求項１に記載の発明は、フラッシュメモリ（５）に対してデータの読み出しおよび書き込みを行う制御装置であって、前記フラッシュメモリ（５）は、データ消去の単位となるブロックを複数有して構成され、前記制御装置は、現在の記録先のブロック以外の次のブロックを抽出し、抽出した前記次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定する消去・判定手段（１５０、１６０、１７５、１８０、２０５、２１０、２１５、２２０、２２５、２３０、２３５、２４０）と、前記次のブロックのデータの消去に成功したと前記消去・判定手段が判定したことに基づいて、当該消去に成功したブロックを、新たな記録先のブロックとし、それまでの記録先のブロックから、一部のレコードを読み出して現在の記録先のブロックにコピーする有効データコピー手段（１７０）と、を備え、前記消去・判定手段は、消去に失敗したと判定したことに基づいて、前記次のブロックが故障したと判定し、更に次のブロックを検索して抽出し、抽出した前記更に次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定し、前記有効データコピー手段（１７０）は、前記更に次のブロックの消去に成功したと前記消去・判定手段が判定したことに基づいて、当該消去に成功したブロックを、新たな記録先のブロックとすることを特徴とする制御装置である。
【０００９】
このように、本発明の制御装置は、消去が失敗したか否かを判定し、消去に失敗したと判定したことに基づいて、次のブロックが故障したと判定することで、当該次のブロックにレコードを書き込む前に故障を検知でき、また、更に次のブロックのデータの消去を試み、消去に成功した場合に当該更に次のブロックを新たな記録先とすることで、故障しているブロックへのコピーをスキップすることができる。したがって、故障しているブロックにデータを何回か書き込んだ後に故障を検出するよりも早く、故障しているブロックにデータを書き込む前に、故障を検知できるので、故障したブロックから次のブロックにデータをコピーする必要がなくなる。その結果、ブロックの故障に起因してブロック間のデータのコピー頻度が増大するのを防ぐことができる。
【００１０】
一般に、ブロックにデータを書き込むときにフラッシュメモリ（５）にかける電気的負荷は、ブロックのデータを消去するときにフラッシュメモリ（５）にかける電気的負荷よりも低い。したがって、ブロックのデータの消去に失敗した場合の方が、データの書き込みに失敗した場合よりも、ブロックが壊れている可能性が高い。逆に言えば、データの書き込みに失敗した場合は、まだそのブロックが壊れておらず、一時的な原因によってそのブロックが書き込み不能になったに過ぎない可能性が高い。
【００１１】
そこで、このことを利用して、記録先のブロックのある領域に書き込もうとして失敗したとしても、直ちにそのブロックを故障であると判定せず、そのブロックの他の領域に書き込みをリトライすることで、ブロックを従来よりも有効活用することができる。また、レコードの書き込みに失敗した場合でも、直ちにレコードを他のブロックにコピーすることがないので、ブロック間のコピーを行う回数が増加しない。そのため、データ記憶に失敗しても全体の処理時間は増加せず、処理負荷を低減することができる。
【００１２】
このように、ブロックが故障したと判定した場合に使用対象のブロック群に含まれない予備のブロックを使用対象のブロック群に含めて用いることで、使用対象のブロック群の数を減らすことなく処理を続けることができ、また、使用回数の少ない予備ブロックを用いることで、より確実にレコードを書き込むことができる。
【００１９】
また、請求項１に記載の発明は、前記フラッシュメモリ（５）に記録するレコードの記録先を、当該レコードが含むデータの種別に応じて仕分けするため、前記フラッシュメモリ（５）の前記複数のブロックが、複数のエリアに区分けされており、前記消去・判定手段は、前記複数のエリアのうち記録先のエリア用のブロック群に属するブロックから次のブロックを抽出し、抽出した次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定し、消去に失敗したと判定したことに基づいて、前記次のブロックが故障したと判定して、前記次のブロックを前記記録先のエリア用のブロック群から除外し、前記複数のエリアのうち、データの記録頻度が最も低いエリアとしてあらかじめ定められたエリアである交換対象エリアに属するブロックから、更に次のブロックを抽出し、抽出した前記更に次のブロックを前記記録先のエリア用のブロック群に含め、抽出した前記更に次のブロックを前記交換対象エリア用のブロック群から除外し、抽出したブロックに現在記録されているレコードの一部を、前記故障したと判定したブロックにコピーし、前記故障したと判定したブロックを、前記交換対象エリア用のブロック群に含め、抽出した前記更に次のブロックのデータの消去を試みると共に、消去に成功したか失敗したかを判定することを特徴とする。
【００２０】
このように、現在の記録先のエリア用のブロック群に属するブロックの故障を検出した場合、更新頻度が最も低いとあらかじめ定められた交換対象エリアに属するブロックを、記録先のエリア用のブロック群に含め、さらに、その故障ブロックを、更新頻度の最も低い交換対象エリア用のブロック群に含めることで、更新頻度が高いデータは故障の可能性が低く、かつ書き込み回数や消去回数が低いブロックに記録することができ、他方、更新頻度が低いが故に必要な記憶領域が比較的小さいデータは、故障したと判定したブロックに記録することで、効率的なブロックの使用が実現する。
【００２１】
また、請求項２に記載の発明は、請求項１に記載の制御装置において、前記消去・判定手段は抽出した前記更に次のブロックに現在記録されているレコードの一部を、前記故障したと判定したブロックにコピーする際、レコードの書き込みに失敗した場合は、書き込みが成功するまで、記録先のアドレスをスキップしながら、書き込みをリトライすることを特徴とする。なお、上記および特許請求の範囲における括弧内の符号は、特許請求の範囲に記載された用語と後述の実施形態に記載される当該用語を例示する具体物等との対応関係を示すものである。 
【図面の簡単な説明】
【００２２】
【図１】本発明の第１実施形態に係るマイクロコントローラ１の構成図である。
【図２】アプリケーションソフト、フラッシュドライバソフト、フラッシュコントローラ６、フラッシュメモリ５の階層構成の概念図である。
【図３】データをフラッシュメモリに書き込むためにＣＰＵが実行する処理のフローチャートである。
【図４】レコードの書き込みの手順を示す図である。
【図５】ブロックの消去に失敗した場合の手順を示す図である。
【図６】本発明の第２実施形態に係るマイクロコントローラ１の構成図である。
【図７】第２実施形態においてＣＰＵが実行する処理のフローチャートである。
【図８】第３実施形態においてＣＰＵが実行する処理のフローチャートである。
【図９】第４実施形態においてＣＰＵが実行する処理のフローチャートである。
【発明を実施するための形態】
【００２３】
（第１実施形態）
以下、本発明の第１実施形態について説明する。図１に、本実施形態に係るマイクロコントローラ１の構成を示す。このマイクロコントローラ１は、車両に搭載され、Ｉ／Ｏ２、ＲＯＭ３、ＲＡＭ４、フラッシュメモリ５、フラッシュコントローラ６、ＣＰＵ７等を備えている。
【００２４】
Ｉ／Ｏ２は、マイクロコントローラ１の外部の装置と信号の授受を行うためのインターフェース装置である。ＲＯＭ３は、ＣＰＵ７が実行するための各種プログラム等があらかじめ記憶された不揮発性の記憶媒体である。ＲＡＭ４は、ＣＰＵ７の作業用のメモリ領域である。
【００２５】
フラッシュメモリ５は、データ消去の最小単位となるブロックを複数個（本実施形態では３個以上）有して構成されている。各ブロックのサイズは数キロバイト（例えば、４キロバイト）であり、１つのブロック内のあるデータを消去するには、そのブロック全体のデータを消去する（すなわち、そのブロック全体のビットを１にとする）必要がある。しかし、１つのブロック内にある特定のビットを１から０に書き替える場合は、マイコン依存で２バイトや４バイト単位でデータを書き換えることができる。
【００２６】
これら複数のブロックは、ＣＰＵ７およびフラッシュコントローラ６によって、１番目のブロック１が使用され、１番目のブロック１の使用が終了すると次に２番目のブロック２が使用されるという風に、順番に書き込みに使用されるようになっている。
【００２７】
複数のブロックのそれぞれは、ヘッダフィールドおよびデータフィールドを有して構成される。各ヘッダフィールドに記録される情報から、使用中のブロックであるか未使用のブロックであるかを判別することができる。つまり、各ブロックは、ＣＰＵ７およびフラッシュコントローラ６によって、当該ブロックの使用を始める際に、使用中である旨の情報が書き込まれる。データフィールドには、先頭のアドレスから順にレコードが順次記録されるようになっている。
【００２８】
なお、レコードのデータサイズは、固定でも可変でもよいが、本実施形態では固定とする。また、レコードのデータサイズは、典型的には数十バイト程度の長さである。したがって、典型的には、１つのブロック内には、数十個〜数百個程度のレコードが記録可能である。
【００２９】
フラッシュコントローラ６は、ＣＰＵ７の制御に従ってフラッシュメモリ５に対してデータの読み出しおよび書き込みを行う周知の装置である。具体的には、ＣＰＵ７から特定のアドレスのデータの読み出し指令を受けると、当該アドレスに記録されたデータの内容をフラッシュメモリ５から読み出し、読み出した内容をＣＰＵ７に出力する。
【００３０】
また、ＣＰＵ７から特定のアドレスに特定のデータの書き込み指令を受けると、フラッシュメモリ５の当該アドレス位置へ、当該特定のデータを書き込むよう試み、書き込みに成功すると、書き込み成功の旨のメッセージをＣＰＵ７に出力し、書き込みに失敗すると、書き込み失敗の旨のメッセージをＣＰＵ７に出力する。
【００３１】
また、ＣＰＵ７からブロックの消去命令を受けると、フラッシュメモリ５の当該ブロックの全データの消去を試み、消去に成功すると、消去成功の旨のメッセージをＣＰＵ７に出力し、消去に失敗すると、消去失敗の旨のメッセージをＣＰＵ７に出力する。
【００３２】
ＣＰＵ７は、ＲＯＭ３に記録されたプログラムを実行することで、種々の処理を実現し、その処理において、必要に応じ、Ｉ／Ｏ２を用いて外部と信号の授受を行い、ＲＯＭ３からデータを読み出し、ＲＡＭ４を作業領域として用い、フラッシュコントローラ６に上記のような各種指令を出力することで、フラッシュメモリ５へのデータの読み出しおよび書き込みを行う。以下、簡単のため、ＣＰＵ７がフラッシュコントローラ６に読み出し指令を出力し、その読み出し指令に従ってフラッシュコントローラ６がフラッシュメモリ５からデータを読み出してＣＰＵ７に出力する作動については、単に、ＣＰＵ７がフラッシュメモリ５からデータを読み出すと記載する。
【００３３】
図１に示すように、ＲＯＭ３には、ＣＰＵ７が実行するプログラムとして、フラッシュドライバソフト、および、複数のアプリケーションソフトが格納されている。図２に、アプリケーションソフト、フラッシュドライバソフト、フラッシュコントローラ６、フラッシュメモリ５の階層構成を概念的に示す。
【００３４】
ＣＰＵ７は、これらアプリケーションソフトを実行することで、例えば、Ｉ／Ｏ２を介してドア開閉センサから信号を受け取って車両のドアの開閉を検出し、車両のエンジンの始動を検知するセンサから信号を受け取ってエンジンＥＣＵの始動を検出する。
【００３５】
これらのようなアプリケーションを実行したときの処理により、フラッシュメモリ５にデータを記録する必要が発生する場合がある。例えば、エンジンを始動した回数を、その回数が変化する度にフラッシュメモリ５に記録する必要が発生し、ドアを開閉した回数を、その回数が変化する度にフラッシュメモリ５に記録する必要が発生する。
【００３６】
このように、ＣＰＵ７がアプリケーションソフトの実行において書き込みデータの書き込みの必要が発生すると、書き込みデータの書き込み要求をＲＡＭ４またはＣＰＵ７のレジスタに出力する（書き込む）。この書き込み要求は、書き込みデータの種別を示すデータＩＤ（例えば、エンジンを始動した回数か、ドアを開閉した回数かの別）と、書き込みデータのデータ値（すなわち、書き込みデータの内容）とを含むデータである。
【００３７】
すると、ＣＰＵ７は、書き込み要求が出力されたことに基づいて、フラッシュドライバソフトの実行を開始し、その実行処理において、書き込みデータをフラッシュメモリ５に記録するため、フラッシュコントローラ６に必要な指令を出力する。これにより、図４（１）、（２）のように、書き込みデータがレコードとしてブロックのデータフィールドに順次追記方式で記録されていく。
【００３８】
以下では、簡単のため、ＣＰＵ７が、ある特定のアドレスにデータを書き込む書き込み指令をフラッシュコントローラ６に出力する処理を、単に、ＣＰＵ７が、ブロックの特定のアドレスにデータを書き込むと記載する。また同様に、ＣＰＵ７が、ある特定のアドレスからデータを読み出す読み出し指令をフラッシュコントローラ６に出力し、フラッシュコントローラ６から当該データを取得する処理を、単に、ＣＰＵ７が、ある特定のアドレスからデータを読み出すと記載する。
【００３９】
データの記録先となる条件を満たすブロックは、現在書き込み中のブロックか、あるいは、現在書き込み中のブロックにデータを書き込む空き領域がない場合は、現在書き込み中のブロックの次の未使用のブロック（使用中でないブロック）ブロックである。
【００４０】
以下、図３の消去処理について説明する。この消去処理は、例えば、アプリケーションソフトの実行においてブロックのデータ消去が必要になった際にＣＰＵ７が実行開始する。
【００４１】
まずステップ１５０では、ヘッダフィールドに則って、次のブロックを検索する。具体的には、ヘッダフィールドによれば未使用であるブロックのうち、最も順番が早いブロックを使用する。この特定したブロック（図４（３）の例ではブロック２）が、次のブロックである。
【００４２】
更にステップ１５０では、データ消去が必要になったブロックのデータを消去するため、当該次のブロックのデータを消去する消去指令をフラッシュコントローラ６に出力する。これにより、フラッシュコントローラ６は、当該次のブロックのデータの消去を試み、消去に成功すると、消去成功の旨のメッセージをＣＰＵ７に出力し、消去に失敗すると、消去失敗の旨のメッセージをＣＰＵ７に出力する。
【００４３】
続いてステップ１６０では、当該次のブロックのデータの消去に成功したか否かを、フラッシュコントローラ６からのメッセージに基づいて判定し、成功していると判定すれば、ステップ１７０に進む。
【００４４】
ステップ１７０では、ヘッダフィールドから使用中のブロックを特定する。更に、図４（４）に示すように、前回の記録先のブロックから、一部の必要なレコードを読み出し、読み出した各レコードを現在の記録先のブロック（図４におけるブロック２）に先頭アドレス（データフィールドの先頭アドレス。以下同じ。）から順番にコピーする。コピーは、フラッシュコントローラ６に適宜読み出し指令および書き込み指令を出力することで実現する。コピーが終了すると、ステップ１７０を終了すると共に、消去処理を終了する。
【００４５】
次に、ステップ１６０で、消去に失敗したと判定した場合について説明する。この場合、ＣＰＵ７はステップ１７５に進み、消去に失敗したブロックを故障したブロックであると判定し、この故障したブロックのヘッダフィールドに、当該ブロックが故障している旨の情報を書き込む書き込み指令を、フラッシュコントローラ６に出力する。
【００４６】
例えば、ステップ１５０で、図４（８）のようにブロック１の消去を試み、ステップ１６０で、消去に失敗したと判定した場合は、図５（１）に示すように、ブロック１を故障したブロックとみなし、ブロック１のヘッダフィールドに当該ブロックが故障している旨の情報を書き込む。
【００４７】
続いてステップ１８０に進み、消去失敗回数は、消去失敗規定回数（例えば、使用対象ブロック群リストに含まれるブロックの数から２を減算した数）以内であるか否かを判定する。この消去失敗回数は、初期値を０とし、ステップ１６０で消去に失敗したと判定する度に１回分増加させる変数を、ＲＡＭ４に記録させ、この変数を参照することで取得してもよいし、フラッシュコントローラ６中で、ヘッダフィールドに、故障したことを示すデータが書き込まれているブロックの数をカウントすることで取得してもよい。
【００４８】
消去失敗回数が消去失敗規定回数以内でなければ、エラーメッセージを出力し、図３の処理を終了する。エラーメッセージの出力先は、書き込み要求を出力したアプリケーションへの戻り値を格納するＲＡＭ４上の変数領域であってもよいし、Ｉ／Ｏ２を介した他の装置（例えば、異常検査装置）であってもよい。
【００４９】
更にステップ１５０では、検索の結果抽出した更に次のブロック（ブロック２）のデータを消去するため、当該更に次のブロックのデータを消去する消去指令をフラッシュコントローラ６に出力する。これにより、フラッシュコントローラ６は、当該更に次のブロックのデータの消去を試み、消去に成功すると、消去成功の旨のメッセージをＣＰＵ７に出力し、消去に失敗すると、消去失敗の旨のメッセージをＣＰＵ７に出力する。このステップ１５０に続くステップ１６０以降の処理は、既に説明した通りである。
【００５０】
このように、本実施形態では、次のブロックを抽出し、抽出した次のブロックのデータの消去を試みる（ステップ１５０）と共に、消去に成功したか失敗したかを判定する（ステップ１６０）。そして、消去に成功したと判定したことに基づいて、当該消去に成功したブロック（当該次のブロック）を、新たな記録先のブロックとし、前回の記録先のブロックから、有効なレコードを読み出して現在の記録先のブロックにコピー（ステップ１７０）を行う。
【００５１】
そして、ステップ１６０で消去に失敗したと判定したことに基づいて、当該次のブロックが故障したと判定し（ステップ１７５）、更に次のブロックを検索して抽出し、抽出した当該更に次のブロックのデータの消去を試みる（ステップ１５０）と共に、消去に成功したか失敗したかを判定する（ステップ１６０）、そして、消去に成功したと判定したことに基づいて、当該消去に成功したブロック（当該更に次のブロック）を、新たな記録先のブロックとし、前回の記録先のブロックから、有効なレコードを読み出して現在の記録先のブロックにコピーする（ステップ１７０）。
【００５２】
このように、本発明の制御装置は、次のブロックの消去を試みたときに、消去が失敗したか否かを判定し、消去に失敗したと判定したことに基づいて、次のブロックが故障したと判定することで、当該次のブロックにレコードを書き込む前に故障を検知でき、また、更に次のブロックのデータの消去を試み、消去に成功した場合に当該更に次のブロックにレコードをコピーすることで、故障しているブロックへのコピーをスキップすることができる。したがって、故障しているブロックにデータを何回か書き込んだ後に故障を検出するよりも早く、故障しているブロックにデータを書き込む前に、故障を検知できるので、故障したブロックから次のブロックにデータをコピーする必要がなくなる。その結果、ブロックの故障に起因してブロック間のデータのコピー頻度が増大するのを防ぐことができる。
一般に、ブロックにデータを書き込むときにフラッシュメモリ（５）にかける電気的負荷は、ブロックのデータを消去するときにフラッシュメモリ（５）にかける電気的負荷よりも低い。したがって、ブロックのデータの消去に失敗した場合の方が、データの書き込みに失敗した場合よりも、ブロックが壊れている可能性が高い。逆に言えば、データの書き込みに失敗した場合は、まだそのブロックが壊れておらず、一時的な原因によってそのブロックが書き込み不能になったに過ぎない可能性が高い。
【００５３】
そこで、このことを利用して、記録先のブロックにレコードを書き込もうとして失敗したとしても、直ちにそのブロックを故障であると判定せず、そのブロックの他の部分に書き込みをリトライすることで、ブロックを従来よりも有効活用することができる。また、書き込みデータの書き込みに失敗した場合でも、直ちにブロックが故障していると判定してレコードを他のブロックにコピーすることがなく、ブロック間のコピーを行う回数が増加しない。そのため、データ記憶に失敗しても全体の処理時間は増加せず、処理負荷を低減することができる。
【００５４】
（第２実施形態）
次に、本発明の第２実施形態について、第１実施形態とは異なる部分を中心に説明する。図６に、本実施形態に係るマイクロコントローラ１の構成を示す。本実施形態のマイクロコントローラ１のハードウェア構成は、第１実施形態と同じである。
【００５５】
ただし、本実施形態では、フラッシュメモリ５内の複数個のブロック１〜Ｎが、Ｍ個のエリアに区分けされており、各エリア内で、ブロックに順番が割り振られている。どのブロックがどのエリアに属するかの情報は、ブロックと、そのブロックに対応するブロックが属するエリアとの対応関係情報（以下、所属先エリアデータという）として、あらかじめ書き込み可能な不揮発性記憶媒体（例えば、フラッシュメモリ、ＥＥＰＲＯＭ）に記録されており、ＣＰＵ７は、所属先エリアデータを参照して、どのブロックがどのエリアに属するかを特定する。
【００５６】
エリアは、フラッシュメモリ５に書き込むレコードの記録先を、そのレコードが含むデータの種別に応じて仕分けするために設けられた領域である。例えば、ドアの開閉回数、エンジンの開閉回数等の、値が変化する頻度（すなわち、更新の頻度）が高い種別のデータは、エリア２に記録し、ソフトのバージョン等の、値が変化する頻度が低い種別のデータは、エリア１に記録する等の区分けを行う。どの種別のデータがどのエリアに記録されるかの情報は、データＩＤとエリアとの対応関係を示すエリア対応テーブルとして、ＲＯＭ３に記録されている。
【００５７】
また、本実施形態のＣＰＵ７は、アプリケーションソフトの実行において書き込み要求が出力されたことに基づいて、フラッシュドライバソフトの実行を開始し、その実行処理において、まず、書き込み要求に含まれるデータＩＤと、上述のエリア対応テーブルに基づいて、この書き込み要求に含まれる書き込みデータの記録先のエリアを特定する。
【００５８】
そして、特定した記録先のエリア内のブロックに書き込みデータを記録するため、図３に示す処理に代えて、図７に示す処理を実行する。図７の処理と図３の処理で、同じ符号が付されているステップは、互いに同じ処理を行う。
【００５９】
また、複数のエリアのうちの１つまたは複数には、通常時の書き込みに使用するブロック以外に、そのエリア用の予備ブロック設けられている。予備ブロックは、通常のデータ記憶では使用しないブロックであり、ブロックの消去に失敗したときのみ、書き込みに使用するブロックである。
【００６０】
予備ブロックを設けるエリアは、頻繁に値が変化するデータを記録するエリア（例えばエリア２、３）のみとし、値の変化が頻繁でないデータを記録するエリア（例えば、エリア２、３に記録するデータよりも値の変化の頻度が低いデータが記録されるエリア１）には、予備ブロックを設けないようになっていてもよい。予備ブロックとそうでないブロックの識別方法は例えば、エリアごとに使用できるブロック数が決まっており、エリアに割り当てられているブロックの数が使用できるブロック数＋１の場合は、1つ予備ブロック（例えば最後の順番のブロック）を有していると判断する。
【００６１】
以下、図７の処理について説明するが、記録先として決定したエリアが、上述の例における、予備ブロックを有するエリア２であった場合を例に取って説明する。まず、ステップ１５０における、次のブロックを検索し、検索の結果抽出した当該次のブロックのデータを消去する点は、第１実施形態と同じである。
【００６２】
また、消去に成功したと判定し（ステップ１６０）、必要なレコードのコピーを行うと共にヘッダフィールドを書き換える（ステップ１７０）部分についても、第１実施形態と同様である。
【００６３】
本実施形態が第１実施形態と異なるのは、ステップ１６０でブロックのデータ消去に失敗し、ステップ１７５で第１実施形態と同様に当該ブロックの故障があると判定した後の処理である。ステップ１７５に続いては、ステップ２０５で、現在の記録対象のエリア内に未使用の予備ブロックがあるか否かを判定する。
【００６４】
未使用の予備ブロックとは、当該エリアに属する予備ブロックで、ヘッダフィールドによれば未使用である予備ブロックである。
【００６５】
ステップ２０５で未使用の予備ブロックがあると判定した場合は、続いてステップ２１０で、当該抽出した予備ブロックを次のブロックとして選択し、当該次のブロック（予備ブロック）のデータを消去するため、当該次のブロック（予備ブロック）のデータを消去する消去指令をフラッシュコントローラ６に出力する。これにより、フラッシュコントローラ６は、当該次のブロック（予備ブロック）のデータの消去を試み、消去に成功すると、消去成功の旨のメッセージをＣＰＵ７に出力し、消去に失敗すると、消去失敗の旨のメッセージをＣＰＵ７に出力する。その後、処理はステップ１６０に進む。
【００６６】
ステップ１６０以降は、既に第１実施形態で説明した通りである。例えば、ステップ１６０で消去に成功したと判定すると、ステップ１７０に進む。
【００６７】
更に、前回の記録先のブロックから、必要なすべてのレコードを読み出し、読み出した各レコードを現在の記録先のブロック（予備ブロック）に先頭アドレスから順番にコピーする。
【００６８】
また、ステップ２０５で未使用の予備ブロックがないと判定した場合は、エラーメッセージを出力し、図７の処理を終了する。エラーメッセージの出力先は、第１実施形態と同じでもよい。なお、本実施形態では、予備ブロックを有さないエリアを記録先のエリアとする場合は、図７でなく図３の処理を行うようになっていてもよい。
【００６９】
以上説明した通り、図７の処理において、ＣＰＵ７は、次のブロックを抽出し、抽出した次のブロックのデータの消去を試みると共に（ステップ１５０）、消去に成功したか失敗したかを判定し（ステップ１６０）、消去に失敗したと判定したことに基づいて、次のブロックが故障したと判定し（ステップ１７５）、同じエリア内で予備ブロックがあれば（ステップ２０５）、その予備ブロックから更に次のブロックを抽出し、抽出した当該更に次のブロック（予備ブロック）を使用対象ブロック群に含め（ステップ２１０）、抽出した当該更に次のブロック（予備ブロック）のデータの消去を試みる（ステップ１５０）と共に、消去に成功したか失敗したかを判定する（ステップ１６０）。
【００７０】
このように、ブロックが故障したと判定した場合に使用対象ブロック群に含まれない予備のブロックを使用対象ブロック群に含めて用いることで、使用対象ブロック群の数を減らすことなく処理を続けることができ、また、使用回数の少ない予備ブロックを用いることで、より確実に書き込みデータを書き込むことができる。また、記録先のエリア用の使用対象ブロック群の１つを、当該エリア専用の予備ブロックとして用いることで、当該エリアの予備ブロックのストックをより確実に確保することができる。  
【００７１】
（第３実施形態）
次に、本発明の第３実施形態について、第２実施形態との違いを中心に説明する。本実施形態は、フラッシュメモリ５内の複数個のブロック１〜Ｎが、Ｍ個のエリアに区分けされている点は同じであるが、それらエリアのうち１つが、予備ブロック用のエリア（以下、予備エリアという）として用いられる点が異なる。どのエリアが予備エリアであるかは、あらかじめＲＯＭ３に記録された情報に基づいて特定できるようになっている。加えて、予備エリアとは別にエリアごとに予備ブロックを有していても良い。
【００７２】
したがって、データＩＤとエリアとの対応関係を示すエリア対応テーブルにおいては、予備エリアにはどのデータＩＤも対応付けられていない。これら予備エリアに属する予備ブロックは、後述するように、他のエリアのブロックの代替として用いられることになる。予備エリア中の各予備ブロックをどのエリアの予備ブロックとして使用するかはフラッシュメモリに予備ブロック割り当てテーブルとして書込み管理する。また、マイクロコントローラ１の使用開示時は、各予備ブロックはデータが消去された状態になっており、まだどのエリアのブロックの代替として用いられているかは決まっていない。
【００７３】
そして、本実施形態のＣＰＵ７は、図７の処理に代えて、図８に示す処理を実行するようになっている。図７と図８で同一の処理については、同じ符号を付す。
【００７４】
この図８の処理が第２実施形態と異なるのは、ステップ１６０で対象のエリアのブロックのデータ消去に失敗し、ステップ１７５で当該ブロックの故障があると判定した後の処理である。ステップ１７５に続いては、ステップ２１５で、予備エリア内に未使用の予備ブロックがあるか否かを判定する。
【００７５】
予備エリア内で未使用の予備ブロックとは、予備エリアに属するブロックのうち、ヘッダフィールドによれば未使用である予備ブロックである。
【００７６】
ステップ２１５で未使用の予備ブロックがあると判定した場合は、続いてステップ２２０で、予備エリアに属する未使用の予備ブロックのうち１つの予備ブロック（例えば、最も順番が早い予備ブロック）を抽出し、予備ブロック割り当てテーブルにおいて、当該予備ブロックがエリア２に割り当てられている旨を記録する。
【００７７】
更にステップ２２０では、当該抽出した予備ブロックを次のブロックとして選択し、当該次のブロック（予備ブロック）のデータを消去するため、当該次のブロック（予備ブロック）のデータを消去する消去指令をフラッシュコントローラ６に出力する。これにより、フラッシュコントローラ６は、当該次のブロック（予備ブロック）のデータの消去を試み、消去に成功すると、消去成功の旨のメッセージをＣＰＵ７に出力し、消去に失敗すると、消去失敗の旨のメッセージをＣＰＵ７に出力する。その後、処理はステップ１６０に進む。ステップ１６０以降は、既に第２実施形態で説明した通りである。例えば、ステップ１６０で消去に成功したと判定した場合は、更にステップ１７０で、前回の記録先のブロックから、必要なレコードを読み出し、読み出した各レコードを現在の記録先のブロック（予備ブロック）に先頭アドレスから順番にコピーする。
【００７８】
また、ステップ２１５で未使用の予備ブロックがないと判定した場合は、エラーメッセージを出力し、図８の処理を終了する。エラーメッセージの出力先は、第２実施形態と御同じでもよい。
【００７９】
以上説明した通り、図８の処理において、ＣＰＵ７は、次のブロックを抽出し、抽出した次のブロックのデータの消去を試みると共に（ステップ１５０）、消去に成功したか失敗したかを判定し（ステップ１６０）、消去に失敗したと判定したことに基づいて、次のブロックが故障したと判定し（ステップ１７５）、どのエリア用の使用対象ブロック群にも属さない予備エリア内で予備ブロックがあれば（ステップ２１５）、その予備ブロックから更に次のブロックを抽出し（ステップ２２０）、抽出した当該更に次のブロック（予備ブロック）のデータの消去を試みる（ステップ１５０）と共に、消去に成功したか失敗したかを判定する（ステップ１６０）。
【００８０】
なお、ＣＰＵ７は、記録先のエリアがどのエリアの場合であっても、図８の処理を実行する。したがって、予備エリアの予備ブロックは、どのエリアのブロックの代替のブロックとしても使用可能である。あるいは、特定の複数のエリアのいずれかが記録先である場合に限り、図８の処理を行い、特定の複数のエリア以外のエリアが記録先である場合は、図３の処理を行うようになっていてもよい。この場合でも、予備エリアの予備ブロックは、特定の複数のエリアうち、どのエリアのブロックの代替のブロックとしても使用可能である。
【００８１】
このように、ブロックが故障したと判定した場合に使用対象ブロック群に含まれない予備のブロックを使用対象ブロック群に含めて用いることで、使用対象ブロック群の数を減らすことなく処理を続けることができ、また、使用回数の少ない予備ブロックを用いることで、より確実に書き込みデータを書き込むことができる。また、どのエリアのブロックの予備としても用いることができる予備ブロックを有することで、予備ブロックの汎用性が増す。なお、本実施形態では、予備エリア以外のエリアが、予備ブロックを含んでいてもよいし、含んでいなくてもよい。
【００８２】
（第４実施形態）
次に、本発明の第４実施形態について、第３実施形態と異なる部分を説明する。本実施形態が第３実施形態と異なるのは、ＣＰＵ７が、図８に示した処理に代えて、図９に示す処理を実行する場合がある点である。
【００８３】
また、本実施形態では、予備エリア以外のすべてのエリアのうち、記録するデータの更新頻度（すなわち、レコードが書き込まれる頻度）が最も少ないエリアのエリアＩＤが、交換対象エリアＩＤとしてあらかじめＲＯＭ３に記録されている点も、第３実施形態とは異なる。
【００８４】
マイクロコントローラ１の設計時には、どの種別のデータがどの程度の更新頻度であるかが概ねわかっているので、予備エリア以外のエリアのうち、どのエリアが一番データの更新頻度が低いかが判っており、設計者は、そのエリアのエリアＩＤを交換対象エリアＩＤとしてＲＯＭ３に記録しておく。なお、記録するデータの更新頻度が最も少ないエリアが含むブロック数は、更新頻度が少ない故、他のエリアよりも少なく、例えば２個程度である。記録するデータの更新頻度が最も少ないエリアは、本実施形態では、マイクロコントローラ１が実行するソフトウェアのバージョン等のデータが記録されるエリア１とする。
【００８５】
以下、図９の処理について説明する。ＣＰＵ７は、上述の交換対象エリアＩＤの示すエリア１以外のエリア（以下、エリア２とする）を記録対象として特定した場合、図８の処理に代えて、図９の処理を実行するようになっている。図９の処理内容が第３実施形態の図８の処理と異なるのは、図８のステップ２１５、２２０の処理を、図９のステップ２３５、２４０の処理に置き換えたことである。
【００８６】
ステップ１７５に続くステップ２３５では、交換対象エリアＩＤが示すエリア１（以下交換対象エリアという）からブロックを検索して抽出する。抽出するブロックは、当該交換対象エリア１に属するブロックのうち、ヘッダフィールドによれば使用中であるブロックとする。このように、当該交換対象エリア１が属するブロックのうち、現在の記録対象となっているブロックを選ぶのは、そのブロックにはレコードの順次書き込みが行われている途中なので、交換対象エリア中で最も故障の可能性が低いブロックだからである。
【００８７】
更にステップ２３５では、所属先エリアデータにおいて、当該抽出したブロックの所属先のエリアをエリア２に書き換え、また、直前のステップ１６０で消去に失敗したブロックの所属先のエリアを交換対象エリアに書き換える。これにより、当該抽出したブロックを当該交換対象エリア１の使用対象のブロック群から除外して現在の記録先エリア２の使用対象のブロック群に組み入れ、また、直前のステップ１６０で消去に失敗したブロックを現在の記録先エリア２の使用対象のブロック群から除外して、当該交換対象エリア１の使用対象のブロック群に組み入れる。これにより、交換対象エリア１と現在の記録先エリア２との間で、ブロックの交換が行われたことになる。
【００８８】
続いてステップ２４０では、抽出したブロックに現在記録されているレコードのうち、有効なレコードのすべてを、直前のステップ１７５で故障と判定したブロックにコピーする。
【００８９】
このようにするのは、故障したと判定したブロックでも、完全に故障しているのではなく、書き込み可能な領域が少しは残っている可能性があり、抽出したブロック（すなわち、記録するデータの更新頻度が最も少ないエリアのブロック）中のレコードは、更新の頻度が少ないので、そのような少しの領域でも充分使用可能である可能性が高いからである。このため、コピーの際は、レコードの書き込みに失敗した場合は、ステップ１２０、１３０の書き込み処理と同様に、書き込みが成功するまで、記録先のアドレスをスキップしながら、書き込みをリトライする。ステップ２３０に続いては、ステップ１５０に戻る。それ以降は、第３実施形態と同じである。
【００９０】
このように、現在の記録先のエリア２用の使用対象ブロック群に属するブロックの故障を検出した場合、更新頻度が最も低いとあらかじめ定められた交換対象エリアに属するブロックを記録先のエリア２用の使用対象ブロック群に含め、さらに、その故障ブロックを、更新頻度の最も低い交換対象エリア用の使用対象ブロック群に含めることで、更新頻度が高いデータは故障の可能性が低く、かつ書き込み回数や消去回数が低いブロックに記録することができ、他方、更新頻度が低いが故に必要な記憶領域が比較的小さいデータは、故障したと判定したブロックに記録することで、効率的なブロックの使用が実現する。なお、本実施形態では、予備エリア、予備ブロックがなくてもよい。
【００９１】
なお、上記実施形態において、ＣＰＵ７が、ステップ１１０を実行することで満杯状態判定手段の一例として機能し、ステップ１２０、１３０、１４０を実行することで書き込み処理手段の一例として機能し、ステップ１５０、１６０、１７５、１８０、２０５、２１０、２１５、２２０、２２５、２３０、２３５、２４０を実行することで消去・判定手段の一例として機能し、ステップ１７０を実行することで有効データコピー手段の一例として機能する。
【００９２】
（他の実施形態）
以上、本発明の実施形態について説明したが、本発明の範囲は、上記実施形態のみに限定されるものではなく、本発明の各発明特定事項の機能を実現し得る種々の形態を包含するものである。
【００９３】
例えば、上記の実施形態において、ＣＰＵ７がプログラムを実行することで実現している各機能は、それらの機能を有するハードウェア（例えば回路構成をプログラムすることが可能なＦＰＧＡ）を用いて実現するようになっていてもよい。
【００９４】
また、上記実施形態では、フラッシュコントローラ６とＣＰＵ７とは分離した装置となっているが、単一のＩＣが、フラッシュコントローラ６とＣＰＵ７の機能を実現するようになっていてもよい。
【００９５】
また、上記実施形態では、１つのマイクロコントローラ１の中にＩ／Ｏ２、ＲＯＭ３、ＲＡＭ４、フラッシュメモリ５、フラッシュコントローラ６が記録されているが、フラッシュメモリ５は、マイクロコントローラ１の外部に設けられていてもよい。すなわち、本発明の制御装置は、フラッシュメモリを備えていてもよいし、備えていなくてもよい。
【００９６】
また、上記実施形態では、本発明の制御装置の例として、車載用途のマイクロコントローラ１を示したが、本発明の制御装置は、車載用途に限らず、他の用途に応用可能である。
【符号の説明】
【００９７】
１                マイクロコントローラ
２                Ｉ／Ｏ
３                ＲＯＭ
４                ＲＡＭ
５                フラッシュメモリ
６                フラッシュコントローラ
７                ＣＰＵ
【図１】
0005541194.tif 000002
【図２】
0005541194.tif 000003
【図３】
0005541194.tif 000004
【図４】
0005541194.tif 000005
【図５】
0005541194.tif 000006
【図６】
0005541194.tif 000007
【図７】
0005541194.tif 000008
【図８】
0005541194.tif 000009
【図９】
0005541194.tif 000010