(57)【要約】【課題】不正なデータが書き込まれた場合であってもデータの復旧を可能にする。【解決手段】データ書き込み装置は、同一の書き込みデータを第１〜第３の記憶領域の夫々に所定の順序で書き込む書き込み部と、所定のタイミングで、第１〜第３の記憶領域に記憶されているデータの相互の異同を判定する異同判定部と、異同判定部の判定結果に基づいて、書き込みデータが正常に書き込まれていない第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に、書き込みデータが正常に書き込まれている第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に記憶されているデータを書き込むデータ復旧部と、を備える。【選択図】図１
2009288963.tif 000002
【特許請求の範囲】
【請求項１】
同一の書き込みデータを第１〜第３の記憶領域の夫々に所定の順序で書き込む書き込み部と、
所定のタイミングで、前記第１〜第３の記憶領域に記憶されているデータの相互の異同を判定する判定部と、
前記判定部の判定結果に基づいて、前記書き込みデータが正常に書き込まれていない前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に、前記書き込みデータが正常に書き込まれている前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に記憶されている前記データを書き込む復旧部と、
を備えることを特徴とするデータ書き込み装置。
【請求項２】
請求項１に記載のデータ書き込み装置であって、
前記書き込み部は、
繰り返し実行される主処理から、前記第１〜第３の記憶領域の何れか一つに前記書き込みデータを書き込む書き込み処理への分岐を３回繰り返すことにより、前記書き込みデータを前記第１〜第３の記憶領域の夫々に書き込むこと、
を特徴とするデータ書き込み装置。
【請求項３】
請求項１又は２に記載のデータ書き込み装置であって、
前記第１〜第３の記憶領域が形成された記憶媒体を備えることを特徴とするデータ書き込み装置。
【請求項４】
請求項３に記載のデータ書き込み装置であって、
前記記憶媒体は、連続する複数の記憶領域に、１回の書き込み命令でデータを書き込み可能であり、
前記第１〜第３の記憶領域は非連続であること、
を特徴とするデータ書き込み装置。
【請求項５】
プロセッサに、
同一の書き込みデータを第１〜第３の記憶領域の夫々に所定の順序で書き込む機能と、
所定のタイミングで、前記第１〜第３の記憶領域に記憶されているデータの相互の異同を判定する機能と、
前記異同の判定結果に基づいて、前記書き込みデータが正常に書き込まれていない前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に、前記書き込みデータが正常に書き込まれている前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に記憶されている前記データを書き込む機能と、
を実現させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ書き込み装置及びプログラムに関する。
【背景技術】
【０００２】
マイコンを使用する製品では、様々な目的で、ＥＥＰＲＯＭやフラッシュメモリ等の不揮発性のメモリにデータを書き込むことがある。例えば、充電式の製品の場合、電池が満充電されてから過放電状態となるまでの放電量を計測し、計測した放電量をメモリに書き込んでおくことにより、電池の残量の算出精度の向上を図ることがある（例えば、特許文献１）。また、例えば、製品の使用回数や使用時間、使用時に発生したエラーの履歴情報等をメモリに書き込んでおくことにより、製品が故障で回収された際に、その原因を探ることができる。
【特許文献１】特開２００７−１０３７０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
ところで、例えば、不揮発性メモリへの書き込み処理の最中にマイコンがリセットされたり、プログラムが暴走したりすると、不正なデータがメモリに書き込まれてしまう場合がある。このような場合、データを復旧することができず、所期の目的を達成するためにデータを用いることができないことになる。
【０００４】
本発明は上記課題を鑑みてなされたものであり、不正なデータが書き込まれた場合であってもデータの復旧を可能にすることを目的とする。
【課題を解決するための手段】
【０００５】
上記目的を達成するため、本発明の一つの側面に係るデータ書き込み装置は、同一の書き込みデータを第１〜第３の記憶領域の夫々に所定の順序で書き込む書き込み部と、所定のタイミングで、前記第１〜第３の記憶領域に記憶されているデータの相互の異同を判定する異同判定部と、前記異同判定部の判定結果に基づいて、前記書き込みデータが正常に書き込まれていない前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に、前記書き込みデータが正常に書き込まれている前記第１〜第３の記憶領域のうちの少なくとも１つの記憶領域に記憶されている前記データを書き込むデータ復旧部と、を備える。
【発明の効果】
【０００６】
不正なデータが書き込まれた場合であってもデータの復旧が可能になる。
【発明を実施するための最良の形態】
【０００７】
図１は、本発明の一実施形態であるマイコンの構成を示す図である。マイコン（データ書き込み装置）１０は、プロセッサ２０、ＥＥＰＲＯＭ（Electrically Erasable and Programmable Read Only Memory）２２、及びＲＡＭ（Random Access Memory）２４を含んで構成されている。マイコン１０は、例えば、充電式の装置に組み込まれて充電池の残時間を算出したり、その他各種装置に組み込まれて使用回数や使用時間、エラー履歴の管理等を行ったりする。
【０００８】
プロセッサ２０は、マイコン１０全体を統括制御するものであり、ＥＥＰＲＯＭ２２に格納されているプログラムを実行することにより各種機能を実現する。ＥＥＰＲＯＭ２２は、不揮発性で書き換え可能なメモリ（記憶媒体）であり、プログラムや各種データが記憶される。ＲＡＭ２４は、プロセッサ２０が各種処理を実行する際に用いられるデータが一時的に格納されるメモリである。
【０００９】
なお、図１に示す例では、マイコン１０にＥＥＰＲＯＭ２２が内蔵されていることとしたが、ＥＥＰＲＯＭ２２がマイコン１０の外部に設けられていることとしてもよい。また、ＥＥＰＲＯＭ２２に限らず、フラッシュメモリ等、その他の不揮発性メモリを用いることができる。また、不揮発性のメモリの代わりに、ハードディスク等の記憶媒体を用いることも可能である。
【００１０】
図２は、プロセッサ２０によって実現される機能ブロックの一部を示す図である。図２に示すように、プロセッサ２０がＥＥＰＲＯＭ２２に格納されたプログラムを実行することにより、書き込み部３０、判定部３２、及び復旧部３４が実現される。
【００１１】
書き込み部３０は、例えば、電池が満充電されてから過放電状態となるまでの放電量を計測し、計測した放電量を書き込みデータとしてＥＥＰＲＯＭ２２に書き込む。ＥＥＰＲＯＭ２２に書き込まれたデータは、例えば、マイコン１０のリセットスタート時やメインループ内で読み出されて処理に用いられる。例えば、書き込みデータが電池の放電量の場合、マイコン１０では、電池の残容量と読み出された書き込みデータとに基づいて電池の残時間が算出され、所定の表示領域に電池の残時間が表示される。このように電池の放電量を学習することにより、電池の残容量を精度良く算出することができる。なお、書き込み部３０は、書き込みデータをＥＥＰＲＯＭ２２に書き込む際に、同一の書き込みデータをＥＥＰＲＯＭ２２内の異なる３つの領域Ａ〜Ｃ（第１〜第３の記憶領域）に書き込む。
【００１２】
判定部３２は、ＥＥＰＲＯＭ２２の領域Ａ〜Ｃに記憶されているデータをＲＡＭ２４に読み出し、読み出したデータ相互の異同を判定する。例えば、ある書き込みデータをＥＥＰＲＯＭ２２の領域Ａ〜Ｃに書き込む場合、領域Ａ〜Ｃ全てに対する書き込みが正常に行われていれば、領域Ａ〜Ｃから読み出したデータは全て一致することになる。また、例えば、領域Ａへの書き込みが何らかの理由により失敗していれば、領域Ｂ，Ｃから読み出されたデータは一致するものの、領域Ａから読み出されたデータは領域Ｂ，Ｃから読み出されたデータと不一致となる。
【００１３】
復旧部３４は、判定部３２の判定結果に基づいて、領域Ａ〜Ｃの夫々について、書き込みデータが正常に書き込まれているかどうか判定し、書き込みデータが正常に書き込まれていない領域は、正常に書き込まれている領域のデータを用いて復旧する。例えば、領域Ｂ，Ｃから読み出されたデータは一致し、領域Ａから読み出されたデータは領域Ｂ，Ｃから読み出されたデータと不一致の場合、復旧部３４は、書き込みデータが領域Ａに正常に書き込まれていないと判定し、領域ＢまたはＣに記憶されているデータを領域Ａに上書きする。なお、判定部３２の判定結果による詳細な処理については後述する。
【００１４】
図３は、ＥＥＰＲＯＭ２２上に形成される領域Ａ〜Ｃの一例を示す図である。ＥＥＰＲＯＭ２２は、例えば１バイト単位で書き込みが可能となっている。また、ＥＥＰＲＯＭ２２には、アドレスが連続する複数の領域に１回の書き込み命令でデータを書き込むことも可能である。このように連続する領域への書き込みはシーケンシャルライトと呼ばれる。そして、領域Ａ〜Ｃは、ＥＥＰＲＯＭ２２上において、連続する領域ではなく離れた領域となっている。例えば、図３に示すように、領域Ａ〜Ｃを夫々１バイトの領域とし、領域Ａのアドレスを０ｘ０００（０ｘは１６進数表記）、領域Ｂのアドレスを０ｘ０８０、領域Ｃのアドレスを０ｘ１００とすることができる。このように領域Ａ〜Ｃを離れた領域とすることにより、例えば、プログラムの暴走等によって領域Ａ〜Ｃの何れか一つを含む領域に対して誤ってシーケンシャルライトが実行された場合であっても、その他の領域に記憶されたデータが不正となってしまうことを防ぐことができる。なお、ＥＥＰＲＯＭ２２の代わりに、シーケンシャルライトが行われず、ページ単位での書き込みが行われるフラッシュメモリを記憶媒体として用いる場合、例えば、領域Ａ〜Ｃを連続した３ページに割り当てることとしてもよい。
【００１５】
図４は、マイコン２０が実行するメインループ（主処理）の一例を示すフローチャートである。メインループでは、例えば、放電量の計測等の各種処理が実行される（Ｓ１０１）。各種処理の結果、書き込みデータをＥＥＰＲＯＭ２２に書き込む必要がある場合には、書き込みイベントが発生する。書き込みイベントが発生すると、プロセッサ２０内のレジスタやＲＡＭ２４に、書き込みイベントが発生していることを示す情報が設定される。すなわち、書き込みイベントが立っている状態となる。メインループにおいて、書き込み部３０は、書き込みイベントが立っているかどうか判定し（Ｓ１０２）、書き込みイベントが立っていない場合は（Ｓ１０２：Ｎ）、ＥＥＰＲＯＭ２２への書き込み処理を実行せずにメインループの繰り返し制御に戻る。
【００１６】
書き込みイベントが立つと（Ｓ１０２：Ｙ）、メインループから書き込み処理に分岐する。書き込み部３０は、書き込み処理において、まず、ＲＡＭ２４に記憶されている所定の書き込みデータを領域Ａに書き込み済みであるかどうかを確認する（Ｓ１０３）。なお、書き込みデータを領域Ａ，Ｂに書き込み済みであるかどうかを示す情報は、例えば、ＲＡＭ２４に書き込みフラグとして記憶されていることとする。領域Ａに書き込み済みでない場合（Ｓ１０３：Ｎ）、書き込み部３０は、領域Ａに書き込みデータを書き込み（Ｓ１０４）、領域Ａへの書き込みが完了したことを示すよう書き込みフラグを更新し、メインループの繰り返し制御に戻る。メインループの繰り返し制御に戻った際、書き込みイベントは立ったままとなっているため（Ｓ１０２：Ｙ）、再度、メインループから書き込み処理に分岐する。領域Ａへの書き込みが完了し（Ｓ１０３：Ｙ）、領域Ｂへの書き込みが完了していないため（Ｓ１０５：Ｎ）、書き込み部３０は、領域Ｂに書き込みデータを書き込み（Ｓ１０６）、領域Ｂへの書き込みが完了したことを示すよう書き込みフラグを更新し、メインループの繰り返し制御に戻る。ここでも、書き込みイベントは立ったままとなっているため（Ｓ１０２：Ｙ）、再度、メインループから書き込み処理に分岐する。領域Ａ，Ｂへの書き込みが完了しているため（Ｓ１０３，Ｓ１０５：Ｙ）、書き込み部３０は、領域Ｃに書き込みデータを書き込み（Ｓ１０７）、書き込みイベントをクリアして（Ｓ１０８）、メインループの繰り返し制御に戻る。また、領域Ａ，Ｂに対する書き込みフラグもクリアされる。なお、書き込みフラグのクリアは、書き込みイベントの発生時に行ってもよい。書き込みイベントがクリアされると、メインループから書き込み処理への分岐は起こらず（Ｓ１０２：Ｎ）、再び書き込みイベントが立つまで、各種処理（Ｓ１０１）が繰り返される。
【００１７】
図５は、マイコン２０がリセットスタート時に実行する処理の一例を示すフローチャートである。電源投入時やエラー発生時にマイコン２０がリセットされると、判定部３２は、ＥＥＰＲＯＭ２２の領域Ａ〜Ｃに記憶されているデータをＲＡＭ２４に読み出し（Ｓ２０１）、相互の異同を判定する（Ｓ２０２〜Ｓ２０６）。
【００１８】
復旧部３４は、判定部３２の判定結果に基づいて、書き込みデータが正常に書き込まれていない領域に、書き込みデータが正常に書き込まれている領域に記憶されているデータを書き込むことにより書き込みデータの復旧処理を行い、メインループへ移行する。具体的には、次のように復旧処理が行われる。なお、領域Ａ〜Ｃから読み出されたデータを、夫々Ａ〜Ｃと表す。
【００１９】
Ａ＝Ｂ＝Ｃである場合（Ｓ２０２：Ｙ）、復旧部３４は領域Ａ〜Ｃに対する書き込みデータの書き込みが全て成功していると判断し（Ｓ２０７）、データの復旧は行わずにメインループへと移行する。
【００２０】
Ａ≠Ｂ＝Ｃである場合（Ｓ２０３：Ｙ）、復旧部３４は、領域Ａへの書き込みに失敗していると判断する（Ｓ２０８）。これは、例えば、領域Ａへの書き込み時にリセットが発生し、領域Ａに記憶されているデータが不正な状態となり、領域Ｂ，Ｃに記憶されているデータは未更新の場合である。この場合、復旧部３４は、領域Ｂに記憶されているデータを領域Ａに書き込むことにより、書き込みデータを復旧する（Ｓ２０９）。なお、領域Ｃに記憶されているデータを領域Ａに書きこんでも良い。
【００２１】
Ａ≠Ｂ≠Ｃである場合（Ｓ２０４：Ｙ）、復旧部３４は、領域Ｂへの書き込みに失敗していると判断する（Ｓ２１０）。これは、例えば、領域Ａへの書き込みが成功した後、領域Ｂへの書き込み時にリセットが発生し、領域Ｂに記憶されているデータが不正な状態となり、領域Ｃに記憶されているデータは未更新の場合である。この場合、復旧部３４は、書き込みが成功している領域Ａに記憶されているデータを領域Ｂ，Ｃに書き込むことにより、書き込みデータを復旧する（Ｓ２１１）。
【００２２】
Ａ＝Ｂ≠Ｃである場合（Ｓ２０５：Ｙ）、復旧部３４は、領域Ｃへの書き込みに失敗していると判断する（Ｓ２１２）。これは、例えば、領域Ａ，Ｂへの書き込みが成功した後、領域Ｃへの書き込み時にリセットが発生し、領域Ｃに記憶されているデータが不正な状態となった場合である。この場合、復旧部３４は、領域Ａに記憶されているデータを領域Ｃに書き込むことにより、書き込みデータを復旧する（Ｓ２１３）。なお、領域Ｂに書き込まれているデータを領域Ｃに書きこんでも良い。
【００２３】
Ａ＝Ｃ≠Ｂである場合（Ｓ２０６）、復旧部３４は、プログラムの暴走等によって領域Ｂに記憶されているデータのみが不正な状態となっていると判断する（Ｓ２１４）。もしくは、更新データが同じでも書き込みイベントを立てるプログラムの場合、領域Ｂへの書き込み時にリセットがかかった可能性もある。この場合、復旧部３４は、領域Ａに記憶されているデータを領域Ｂに書き込むことにより、書き込みデータを復旧する（Ｓ２１５）。なお、領域Ｃに記憶されているデータを領域Ｂに書きこんでも良い。
【００２４】
以上に説明したマイコン１０では、同一の書き込みデータがＥＥＰＲＯＭ２２の領域Ａ〜Ｃに順に書き込まれる。そして、リセットスタート時に、領域Ａ〜Ｃに記憶されているデータの相互の異同が判定され、判定結果に基づいて、書き込みデータの復旧が行われる。つまり、ＥＥＰＲＯＭ２２に不正なデータが書き込まれた場合であっても、書き込みデータを復旧することができる。なお、リセットスタート時に限らず、例えば、メインループ内で所定時間ごとに異同を判定し、データの復旧を行うこととしてもよい。
【００２５】
また、マイコン１０では、図４に示したように、メインループからの一度の分岐で領域Ａ〜Ｃの全てが更新されるわけではなく、１つの領域にデータを書き込む書き込み処理への分岐が３回繰り返される。したがって、例えば、プログラムの暴走等によって領域Ｂが不正に更新されたとしても、領域Ａ，Ｃも不正な状態となる可能性は低い。つまり、プログラムの暴走によって領域Ｂへの書き込み処理にプログラムカウンタが飛んできたとしても、メインループへの戻り番地がスタックに格納されていないため、再度、メインループから書き込み処理へと分岐して領域Ａ，Ｃも不正に更新されてしまう可能性は低い。したがって、暴走等によってある領域が不正に更新されたとしても、他の領域が不正に更新されてしまうことが防止され、書き込みデータの復旧が可能になる。
【００２６】
また、マイコン１０は、領域Ａ〜Ｃが形成されたＥＥＰＲＯＭ２２を有している。したがって、例えば、領域Ａ〜Ｃへの書き込みデータが、マイコン１０が組み込まれた製品の使用回数や使用時間、エラー履歴等の情報である場合、マイコン１０を回収することにより、製品の使用状況等を調査することができる。
【００２７】
また、マイコン１０では、図３に示したように、領域Ａ〜ＣがＥＥＰＲＯＭ２２上の非連続な領域である。したがって、例えば、プログラムの暴走等によってシーケンシャルライトが実行されたとしても、領域Ａ〜Ｃの全てが不正に更新されてしまうことを防ぎ、書き込みデータの復旧を可能としている。
【００２８】
なお、上記実施形態は本発明の理解を容易にするためのものであり、本発明を限定して解釈するためのものではない。本発明は、その趣旨を逸脱することなく、変更、改良され得ると共に、本発明にはその等価物も含まれる。
【図面の簡単な説明】
【００２９】
【図１】本発明の一実施形態であるマイコンの構成を示す図である。
【図２】プロセッサによって実現される機能ブロックの一部を示す図である。
【図３】ＥＥＰＲＯＭ上に形成される領域Ａ〜Ｃの一例を示す図である。
【図４】マイコンが実行するメインループの一例を示すフローチャートである。
【図５】マイコンがリセットスタート時に実行する処理の一例を示すフローチャートである。
【符号の説明】
【００３０】
１０  マイコン
２０  プロセッサ
２２  ＥＥＰＲＯＭ
２４  ＲＡＭ
３０  書き込み部
３２  判定部
３４  復旧部
【図１】
2009288963.tif 000003
【図２】
2009288963.tif 000004
【図３】
2009288963.tif 000005
【図４】
2009288963.tif 000006
【図５】
2009288963.tif 000007