(57)【特許請求の範囲】
【請求項１】
アプリケーションプログラムの変数をフラッシュメモリにバックアップデータとしてセーブさせる情報処理装置において、
前記変数は変数データと変数ＩＤとを含み、
前記変数データのＲＡＭ上の位置と、前記フラッシュメモリ上のセーブ位置との対応関係を記憶した変数ディレクトリを、変数ＩＤをつけてＲＡＭ上に構築する手段と、
あらかじめ設定したセーブ条件にもとづき、前記変数データと前記変数ＩＤとをセーブする情報として、前記フラッシュメモリ上の新たなセーブ位置にセーブする手段と、を備え、
前記フラッシュメモリは、シーケンシャルにデータが書き込まれるものであり、データが書き込まれている書き込みセクタとデータが書き込まれていない非書き込みセクタとからなる複数のセクタで構成され、最後尾の書き込みセクタから連続する非書き込みセクタが少なくとも二つ以上無いとき、前記最後尾の書き込みセクタに連続する二つ以上のセクタが非書き込みセクタとなるようにデータ消去処理を行って、前記非書き込みセクタに設定する手段を備えることを特徴とする情報処理装置。
【請求項２】
前記変数を前記フラッシュメモリにバックアップデータとしてセーブする際に、前記変数データがデフォルト値を維持し続けていることを検出すると、前記変数をバックアップデータとしてセーブしない手段を備えた請求項１に記載の情報処理装置。
【請求項３】
アプリケーションプログラムの起動時において、フラッシュメモリをスキャンして前記変数ディレクトリを再構築する手段を備えた請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記フラッシュメモリのセクタをグループ化し、前記セーブ手段は、前記変数の種類に応じてセーブするグループを決める請求項１〜請求項３のいずれかに記載の情報処理装置。
【請求項５】
前記フラッシュメモリは、消去対象となったセクタ内に前記変数ディレクトリで参照されるデータがあるときに、該データをフラッシュメモリ上の新たなセーブ位置に移す手段を備えた請求項１〜請求項４のいずれかに記載の情報処理装置。
【請求項６】
前記フラッシュメモリは、セクタを消去する場合には、電源電圧が低下した時に優先してセーブするように予め設定したデータを、フラッシュメモリ上の新たなセーブ位置に、セクタを消去する前にセーブする手段を備えた請求項１〜請求項５のいずれかに記載の情報処理装置。
【請求項７】
コンピュータによって実行されるアプリケーションプログラムが使用する変数をフラッシュメモリにバックアップデータとしてセーブする手段として前記コンピュータを機能させるためのプログラムであって、
前記変数は変数データと変数ＩＤとを含み、
前記プログラムは、
前記変数データのＲＡＭ上の位置とフラッシュメモリ上のセーブ位置との対応関係を記憶した変数ディレクトリを、変数ＩＤをつけてＲＡＭ上に構築する手段と、
あらかじめ設定したセーブ条件に基づいて、前記変数データと前記変数ＩＤとを、セーブする情報としてフラッシュメモリ上の新たなセーブ位置に、前記アプリケーションプログラムとは非同期にセーブするセーブ手段、
として前記コンピュータを機能させるプログラムであって、
シーケンシャルにデータが書き込まれ、データが書き込まれている書き込みセクタとデータが書き込まれていない非書き込みセクタとからなる複数のセクタで構成される前記フラッシュメモリに対して、最後尾の書き込みセクタから連続する非書き込みセクタが少なくとも二つ以上無いとき、前記最後尾の書き込みセクタに連続する二つ以上のセクタが非書き込みセクタとなるようにデータ消去処理を行って、前記非書き込みセクタに設定する手段を前記コンピュータに機能させるプログラム。
【請求項８】
前記変数を前記フラッシュメモリにバックアップデータとしてセーブする際に、前記変数データがデフォルト値を維持し続けていることを検出すると、前記変数をバックアップデータとしてセーブしない手段を前記コンピュータに機能させる請求項７に記載のプログラム。
【請求項９】
アプリケーションプログラムの起動時に、フラッシュメモリをスキャンして前記変数ディレクトリを再構築する手段を前記コンピュータに機能させる請求項７または請求項８に記載のプログラム。
【請求項１０】
前記フラッシュメモリのセクタをグループ化し、前記セーブ手段によって、前記変数の種類に応じてセーブするグループを決めることを、前記コンピュータに機能させる請求項７〜請求項９のいずれかに記載のプログラム。
【請求項１１】
前記フラッシュメモリに対して、消去対象となったセクタ内に前記変数ディレクトリで参照されるデータがあるときに、該データをフラッシュメモリ上の新たなセーブ位置に移す手段を前記コンピュータに機能させる請求項７〜請求項１０のいずれかに記載のプログラム。
【請求項１２】
前記フラッシュメモリに対して、セクタを消去する場合に、電源電圧が低下した時に優先してセーブするように予め設定したデータを、フラッシュメモリ上の新たなセーブ位置に、セクタを消去する前にセーブする手段を前記コンピュータに機能させる請求項７〜請求項１１のいずれかに記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アプリケーションプログラムの変数データおよびステータスデータのバックアップを行う、情報処理装置とプログラムとに関する。
【背景技術】
【０００２】
アプリケーションプログラムのステータスデータや変数のバックアップ処理を行う際には、バックアップ媒体として、ハードディスクやＤＶＤなどの周辺記憶装置や、データ保存用に電池を装荷したランダムアクセスメモリ（以下、ＲＡＭという。）や、保存用のフラッシュメモリが用いられる。コストや保守性の観点からはフラッシュメモリを媒体とする方法が優れていて、容量の大きさや、データ読み出しの容易さなどが特徴として挙げられる。
【０００３】
フラッシュメモリを媒体とする方法では、一般にフラッシュメモリ上のあるアドレスへデータが書き込まれるとそのアドレスに対する上書き処理ができなくなる。もう一度同じアドレスに対してデータを書き込むためには、セクタと呼ばれる複数のビットからなる物理的に定められた単位全体を消去し、そのセクタ消去後に再びそのアドレスへのデータ書き込みが可能となる。
【０００４】
また、フラッシュメモリ上のセクタを構成するビットの書き換えにはデータ保証回数の制限があり、一般に１０の４乗回から１０の６乗回のビットの書き換えが行われると不良なビットとなり、ビットの書き換えができなくなる性質がある。
【０００５】
このようなフラッシュメモリを用いてバックアップ処理を行う際には、データの書き込みは、書き込みをするアドレスからシーケンシャルに行い、セクタの最後までデータが書き込まれると、次のセクタの先頭から再びシーケンシャルにデータを書き込むシーケンシャルアクセス方式がとられる場合が多い。
【０００６】
また、データの管理形式としては、データをファイルとして（以下、ファイル形式という。）バックアップする形式と、データをフラッシュメモリの物理アドレスに直接書き込み（以下、アドレス形式という。）バックアップする形式とがある。
【０００７】
ファイル形式の場合には、フラッシュメモリ上にファイル情報を記憶するディレクトリ部という領域を用意する必要があり、ディレクトリ部の書き換え頻度が大きくなりやすく、そのために不良ビットが発生しやすいという問題がある。また、構造が複雑で、そのためにデータの書き込み時間と読み出し時間が長くなりやすいという問題もある。しかし、この形式はバックアップするアプリケーション変数の型や量の変更に関して柔軟であり、アプリケーションソフトのデータ構造に無関係に変数の型や量の変更ができるという長所がある。
【０００８】
一方、アドレス形式は、メモリにディレクトリ部のような特殊な領域を作る必要がなく、メモリの有効的な活用が行える。また、特殊な領域を作る必要がないためにデータ構造が単純で、そのためにデータの書き込み時間と読み出し時間が短い場合が多い。しかし、変数の型や量の変更に対応するためには、システム設計者がフラッシュメモリ上のアドレスを完全に把握する必要があるという短所をもつ。
【０００９】
アドレス形式を用いてバックアップ処理を行うアプリケーションを設計する場合には、フラッシュメモリ上のバックアップデータのアドレスがアプリケーションソフトの構造に依存するため、システム設計者はアプリケーションプログラムの設計のたびにバックアッププログラムを再構築する必要があり、その際には、フラッシュメモリ上のアドレスを完全に把握し、データの書き込み効率やバックアップの頑健性を考慮する必要があった。
【００１０】
そのため、システム設計者にとって、アプリケーションの内容とは関係の薄いバックアップ処理の設計作業が増え、システム設計者の負担が重くなるという問題があった。
【発明の概要】
【発明が解決しようとする課題】
【００１１】
情報処理装置におけるフラッシュメモリを用いたバックアップ処理において、アドレス形式のバックアップ処理は、バックアップのインフラとして共通化したり再利用したりできず、システム設計者にとって、作業負担が重い場合が多いという問題があった。
【００１２】
この問題を解決するために本発明では、データの読み込み時間と書き込み時間が短いアドレス形式のデータ管理でありながら、システム設計者が容易にバックアップ処理をアプリケーションに導入でき、フラッシュメモリの書き込み効率がよく、バックアップ処理の頑健性も高い、情報処理装置またはプログラムを提供することを目的とする。
【００１３】
また、本発明は、データを移行する局面での電源断があったとしても、エラーデータの読み込みを防ぐことを目的とする。
【課題を解決するための手段】
【００１４】
本発明は、アプリケーションプログラムの変数をフラッシュメモリにバックアップデータとしてセーブさせる情報処理装置において、変数は変数データと変数ＩＤとを含み、変数データのＲＡＭ上の位置とフラッシュメモリ上のセーブ位置との対応関係を記憶した変数ディレクトリを、変数ＩＤをつけてＲＡＭ上に構築する手段と、あらかじめ設定したセーブ条件にもとづき、変数データと変数ＩＤとをセーブする情報として、フラッシュメモリ上の新たなセーブ位置にセーブする手段と、を備え、フラッシュメモリは、シーケンシャルにデータが書き込まれるものであり、データが書き込まれている書き込みセクタとデータが書き込まれていない非書き込みセクタとからなる複数のセクタで構成され、最後尾の書き込みセクタから連続する非書き込みセクタが少なくとも二つ以上無いとき、最後尾の書き込みセクタに連続する二つ以上のセクタが非書き込みセクタとなるようにデータ消去処理を行って、非書き込みセクタに設定する手段を備えることを特徴とする。
【００１５】
また、本発明は、変数をフラッシュメモリにバックアップデータとしてセーブする際に、変数データがデフォルト値を維持し続けていることを検出すると、変数をバックアップデータとしてセーブしない手段を備えたことを特徴としている。
【００１６】
また、本発明は、アプリケーションプログラムの起動時において、フラッシュメモリをスキャンして変数ディレクトリを再構築する手段を備えたことを特徴としている。
【００１７】
また、本発明は、フラッシュメモリのセクタをグループ化し、セーブ手段は、変数の種類に応じてセーブするグループを決めることを特徴としている。
【００１８】
また、本発明では、フラッシュメモリは、消去対象となったセクタ内に変数ディレクトリで参照されるデータがあるときに、該データをフラッシュメモリ上の新たなセーブ位置に移す手段を備えたことを特徴としている。
【００１９】
また、本発明では、フラッシュメモリは、セクタを消去する場合には、電源電圧が低下した時に優先してセーブするように予め設定したデータを、フラッシュメモリ上の新たなセーブ位置に、セクタを消去する前にセーブする手段を備えたことを特徴としている。
【００２０】
以下、本発明でのバックアップ処理を図３のデータ構造を参照して説明する。
【００２１】
本発明のバックアップ処理においては、バックアップする変数データ１０のＲＡＭ１００上の位置と、フラッシュメモリ１０１上のセーブ位置との対応関係を変数ＩＤをつけてＲＡＭ１００上に変数ディレクトリ２として記憶する手段と、あらかじめ設定したセーブ条件にもとづき、前記変数データ１０と前記変数ＩＤとをセーブする情報として、新たなセーブ位置にセーブする手段とを備え一つのアプリケーション変数１０には、一つの変数ＩＤを配する。
【００２２】
このようにアプリケーション変数のＲＡＭ１００上の位置（以下ＲＡＭアドレスという。）と、フラッシュメモリ１０１上のセーブ位置（以下フラッシュアドレスという。）とを記憶した変数ディレクトリ２というデータベースをＲＡＭ１００上に設置し、その変数データ１０と変数ＩＤとを一つのセットとし、フラッシュメモリ１０１にバックアップする。
【００２３】
変数ディレクトリ２上には、バックアップデータの様々な情報を記憶する領域（以下、フィールドという。）を配し、ＲＡＭアドレスをＲＡＭアドレスフィールド２２に記憶し、フラッシュアドレスをフラッシュアドレスフィールド２３に記憶し、変数ＩＤを変数ＩＤフィールド２１に記憶する。このように一つの変数ＩＤに対し、複数の情報を記憶するフィールドの組２０を一つ配しておく。
【００２４】
さらに、フラッシュアドレス１０１上に、バックアップデータに関する記憶領域（以下、エレメントという。）４を配し、エレメント４の中にバックアップデータ１６とそのバックアップデータに関する情報を記憶し（以下、この情報を記憶した領域３０をヘッダという。）、このエレメント４を書き込みの単位としてフラッシュメモリ１０１にデータを書き込む。
【００２５】
バックアッププログラムは、変数データ１０や、バックアップデータ１６などを監視し、規定のバックアップ条件が満たされた場合には、ＲＡＭ１００上の変数データ１０をフラッシュメモリ１０１上の新たなアドレスに新たなエレメント４として記憶し、変数ＩＤヘッダ３１に変数ＩＤを記述する。また、その際には変数ディレクトリ２上のフラッシュアドレスフィールド２３を移動した先の新しいフラッシュアドレスの値に更新する。
【００２６】
本発明のバックアップ処理において、あるアプリケーション変数が配列変数１８である場合には、その配列変数１８に一つの変数ＩＤを配し、その配列変数１８の一つの要素１９には一つの指数（以下、配列インデックスという。）を配し、配列要素１９ごとにフラッシュメモリ１０１にエレメント４として記憶する。
【００２７】
また、この配列変数１８の変数ディレクトリ２には、各配列要素１９の配列インデックスとフラッシュアドレスとを対応付けて記憶しておくテーブル（以下、配列テーブルという。）９を設ける。
【００２８】
配列テーブル９上には、フィールドを配し、配列インデックスは配列インデックスフィールド１４に記憶し、配列要素のフラッシュアドレスは配列要素フラッシュアドレスフィールド１５に記憶する。
【００２９】
また、フラッシュメモリ１０１上の一つのエレメント４には、各配列要素１９をバックアップデータ１６として記憶するとともに、配列変数１８の変数ＩＤを変数ＩＤヘッダ３１に記憶し、配列要素１９の配列インデックスを配列インデックスヘッダ３２に一つのエレメント４としてバックアップする。
【００３０】
規定のバックアップ条件が満たされた場合には、フラッシュメモリ１０１上の新たなアドレスに、ＲＡＭ１００上の配列要素のデータ１９を新たなエレメント４として記憶し、変数ＩＤと配列インデックスとを記憶する。また、配列要素フラッシュアドレスフィールド１５を移動した先の新しいフラッシュアドレスに更新する。
【００３１】
本発明における変数ディレクトリ２の再構築は、アプリケーションプログラムの起動時に、フラッシュメモリ１０１内にバックアップされていたバックアップデータ１６をもとに行う。フラッシュメモリ１０１の先頭のセクタからシーケンシャルにフラッシュメモリ１０１を読み込んでいくと同時に、変数ＩＤごとに変数ディレクトリ２を構築する。この際に、同じ変数ＩＤのエレメント４があれば、その変数ＩＤの変数ディレクトリ２及び変数データ１０の内容は上書き処理される。フラッシュメモリ１０１にはシーケンシャルに新しいエレメントを記憶していくため、この上書き処理により変数ディレクトリ２及び変数データ１０の内容は最新のバックアップデータ１６と同期する。この変数ディレクトリ２の再構築は一度フラッシュメモリ１０１全体に対して行い、次にシーケンシャルに並んだ先頭のセクタから、次に書き込みを行うアドレスまで行う。
【００３２】
また、本発明では前記フラッシュメモリ１０１のセーブ領域をグループ化する。変数データ１０を種類に応じてグループに分け、設定されたグループの数に従い、バックアップ処理を並列的に実行する。
【００３３】
また、本発明におけるフラッシュメモリ１０１のセクタ消去は、書き込みを行うアドレスが新しいセクタに移動するときに、一番古くに書き込みが行われたセクタに対して行う。エレメント４には、そのエレメント４を消去するかを判定するためのアクティブフラグを用意し、そのアクティブフラグを記憶するアクティブフラグフィールド２４を変数ディレクトリ２上に配し、活性化したフラグを持つ変数ＩＤであって消去セクタ上に最新のバックアップデータがある場合には、そのエレメント４を新たなセクタへと複写する。消去セクタ上の消してはいけないエレメント４を全て移動させた後にセクタ消去を行う。
【００３４】
また、本発明では、システムのハードウェアに電源電圧の低下（以下、パワーフェイルという。）が起こったときに、優先してバックアップするデータ（以下、パワーフェイルデータという。）が設定されている場合、セクタ消去が実行される前の段階で毎回必ずパワーフェイルデータのバックアップを行う。
【発明の効果】
【００３５】
本発明によれば、アドレス形式のデータ管理でありながらも異なるアプリケーションやハードウェアに共通に利用可能で、システム設計者が容易にバックアップをアプリケーションプログラムに導入でき、再利用も容易なバックアップ方式を提供できる。
【００３６】
また本発明によれば、変数ディレクトリを用いることで、アプリケーションプログラムの設計者は、バックアップ処理におけるフラッシュメモリのアドレス管理を、変数ＩＤを介した管理にルーチン化することができ、作業負担の減少をさせることができる。
【００３７】
また本発明によれば、配列要素を個別にバックアップ処理することにより、配列変数全体をバックアップ処理する場合に比べてデータ書き換え量を抑制でき、フラッシュメモリの長寿化が実現できる。
【００３８】
また、本発明の変数ディレクトリ再構築手段によれば、最新のデータを判定する必要がなく、また特別な判別フラグも必要としないため、簡易なデータ構造で再構築が行うことができる。
【００３９】
また、本発明のセクタグループ化手段によれば、データの重要度に応じて、データバックアップの頻度をそろえ、効率的なセクタ利用と調寿命化を実現することができる。
【００４０】
また、本発明のセクタ消去手段によれば、セクタ消去はセクタ３に書き込み可能な領域がなくなったときにのみ行われる。そのために、セクタ消去はデータ書き込み量にのみ依存させることができ。非常に小さいセクタ消去頻度を実現できる。
【００４１】
また、本発明のパワーフェイルデータのバックアップ手段によれば、フラッシュメモリのセクタ消去中にパワーフェイルが起こった場合でも、確実にパワーフェイルデータをバックアップすることができる。
【図面の簡単な説明】
【００４２】
【図１】本発明に係る情報処理装置の構成図
【図２】セクタ消去の手順を示す図
【図３】変数IDに対応した変数ディレクトリの動作を示す概観図
【図４】バックアップ条件に従った動作を示すフローチャート
【図５】バックアップ処理起動時の動作を示すフローチャート
【発明を実施するための形態】
【００４３】
図１は本発明の実施形態例であるフラッシュメモリと変数ディレクトリとＲＡＭ上の変数データとを配した情報処理装置の構成図であり、図３は、一つの変数ＩＤに対応した変数ディレクトリと、エレメントとの概観図である。
【００４４】
情報処理装置２０２は、アプリケーションプログラムのバックアップ以外の処理を行うアプリケーションモジュール２００とバックアップ処理を行うバックアップモジュール２０１とで構成されていて、中央演算回路５にフラッシュメモリ１０１、ＲＡＭ１００、入力デバイス６および出力デバイス７が接続されている。アプリケーションモジュール２００には、ＲＡＭ１００上にアプリケーション変数のデータを変数データリスト１として配する。
【００４５】
バックアップモジュール２０１には、変数ディレクトリ２上に、一つの変数ＩＤごとに複数の情報を記憶させておくフィールドの組２０を配する。フィールドとしてはＲＡＭアドレスを記憶するＲＡＭアドレスフィールド２２および、フラッシュアドレスを記憶するフラッシュアドレスフィールド２３、変数ＩＤを記憶する変数ＩＤフィールド２１、セクタ消去の際に新たなセクタ３に移動するかを判定するアクティブフラグフィールド２４などを用いる。また、フラッシュメモリ１０１のエレメント４上には、バックアップデータ１６とともに複数の情報を記憶させておくヘッダの組３０を配する。ヘッダとしては、変数ＩＤを記憶する変数ＩＤヘッダ３１や、配列インデックスを記憶させておく配列インデックスヘッダ３２、データサイズを示すサイズヘッダ３４、などを用いる。
【００４６】
また、この実施形態では、以降で示すさまざまな処理のために複数のフィールドやヘッダを用いている。変数データが配列変数かどうかを記述するタイプフィールド４２、配列変数の場合に配列数を記述する配列数フィールド２５、単体の変数の場合には変数のビットサイズを記述しておき、配列変数の場合には要素のビットサイズを記述しておくサイズフィールド４３、変数データを登録および復帰させる場合にそのバックアップデータを復帰させるかをアプリケーションモジュールにより登録される登録フラグフィールド２７、セクタ消去時にも消去することなく保存を続けるべきバックアップデータを登録するパーマネントフラグフィールド２８、バックアップ条件の種類を記述しておく条件フィールド２６などが用いられる。
【００４７】
なお、変数ディレクトリ２上に、クリティカルフラグフィールド４４を設け、変数データ１０を読み出す時のアクセス方式が割り込み禁止によるアクセスかどうかを判定し、割り込み禁止機能を実現することもできる。また、バックアップデータが保存されているセクタ３の番号を記憶しておく新セクタフィールド４５、ひとつ前のバックアップデータが保存されているセクタ３の番号を記憶しておく旧セクタフィールド４６、ひとつ前のバックアップデータが保存されているエレメント４のアドレスを記憶しておく旧フラッシュアドレスフィールド４７、バックアップデータがエラーを含んでいる場合にエラーを記述しておくエラーフラグフィールド４８などを記憶させておいて、一つ前のバックアップデータの特定や、変数データの特定、変数データの変更検知などに用いてもよい。
【００４８】
また、条件フィールド２６より指定されるバックアップ条件の種類としては、アプリケーションから指定されるタイミングをコマンドフィールド４１に記憶し実行される場合や、あらかじめ周期フィールド４０に記憶されたタイミングで実行される場合や、カウンタフィールド２９でのカウントに基づいて実行される場合などのタイミングで実行することができる。また、バックアップを行う条件として、ＲＡＭアドレスとフラッシュアドレスとが指定するそれぞれのデータをアプリケーションモジュール２００で監視し、データの内容に変更が行われた場合には変数データ１０をバックアップするという条件を加えてもよい。以上のような様々な条件に従いＲＡＭアドレスの指定する変数データ１０と、変数ディレクトリ２や配列テーブル９に保存されている情報とを、新たなエレメント４としてフラッシュメモリ１０１上のアドレスにバックアップする。
【００４９】
以上のようにアプリケーションプログラム実行時には、変数データリスト１上のある変数データ１０に対して、アプリケーションによる読み出しあるいは変更が行われる。また、その変数ＩＤの変数ディレクトリ２では、ＲＡＭアドレスフィールド２２に記憶したＲＡＭアドレスをもとに変数データリスト１上の変数データ１０を参照し、フラッシュアドレスフィールド２３をもとにエレメント４上のバックアップデータ１６のアドレスを得る。そして、あらかじめ設定したバックアップ条件に従い、前期変数データ１０をフラッシュメモリ１０１上の新たなアドレスに記憶する。その際バックアップモジュール２０１はアプリケーションモジュール２００の通常時の処理とは切り離し実行する。
【００５０】
また、配列変数の場合、各配列要素を一つのエレメント４として新たなフラッシュアドレスにバックアップする。変数ディレクトリ２に保存されたあるひとつの変数ＩＤが示すデータが配列変数１８である場合、変数ディレクトリ２上のフラッシュアドレスフィールド２３は、ＲＡＭ１００上に別途設置された配列テーブル９のＲＡＭアドレスを記憶し、変数ディレクトリ２上に配列数フィールド２５を設ける。配列テーブル９では、それぞれの配列要素１９を区別する配列インデックスとそれぞれの配列要素１９のフラッシュアドレス上でのアドレスとを対応付ける。このようにフラッシュメモリ１０１上での配列要素１９のアドレス管理を一つ一つ行うことにより、たとえば配列変数１８のひとつの要素１９のみにデータの変更が起こった場合に、配列全体１８をバックアップデータ１６としてバックアップ処理するのではなく、その配列要素１９のみをバックアップデータ１６としてバックアップ処理することができる。
【００５１】
なお、変数ディレクトリ２上のＲＡＭアドレスフィールド２２が指定するＲＡＭアドレスと配列要素１９のデータサイズとから各配列要素のＲＡＭ１００上のデータ１９を特定することができる。
【００５２】
なお、この例においては配列変数１８に変数ＩＤを附してバックアップ処理を行うが、配列要素１９に変数ＩＤを附してバックアップ処理を行ってもよい。
【００５３】
次に、フラッシュメモリ１０１内へのデータの複写方法を図２で表す。一つのエレメント４ごとに、ひとつのバックアップデータ１６と、そのバックアップデータに対応した情報をヘッダ３０として記憶している。まず変数データ１０の保存はフラッシュメモリ１０１の先頭のセクタ３の先頭アドレスからシーケンシャルに行う。図２（ａ）のように、書き込みが行われているセクタ３に書き込み予定のデータのサイズよりも大きい空き領域がある場合には、空き領域にデータを書き込む。一方、図２（ｂ）のように、データサイズ分の空き領域がない場合には、次のセクタ領域を新たな書き込みを行うセクタ領域とする。
【００５４】
新たなセクタに書き込み領域が移る際には、フラッシュメモリ１０１の先頭セクタからシーケンシャルにフラッシュメモリ１０１上の空きセクタ領域を検索する。その結果、フラッシュメモリ１０１の書き込みを行っていたセクタ３から規定数先までのセクタ領域が空き領域でなければ、もっとも前に書き込んだセクタを消去する。消去の際には消去対象のセクタ３に含まれるエレメント４すべてを一度に消去する。図２（ｃ）のように規定数先のセクタ領域から、消さずに保存しておくべきエレメント４を新しいセクタに複写した後、消去セクタのデータを消去する。
【００５５】
これにより、フラッシュメモリ１０１上には規定数の連続してデータ消去されたセクタ領域と、連続して書き込まれているセクタ領域とが常に存在する。
【００５６】
また、フラッシュメモリ１０１の最後尾のセクタまで消去され、新たにセクタ消去を行う必要がある場合には、フラッシュメモリ先頭のセクタ領域を消去する。すると、このフラッシュメモリ１０１の書き込み領域と非書き込み領域は、常に円環状に循環し、循環して連続な書き込み領域の先頭のセクタには最も古い変数データがバックアップされ、循環して連続な書き込み領域の最後尾のセクタの、最後尾のアドレスに、バックアップするエレメント４を書き込む。
【００５７】
セクタ消去時に、一定の条件を満たすエレメント４は新しいセクタ３に移動させる。このエレメント４は、アプリケーションが使用していてバックアップを行うように登録されたエレメント４のみではなく、消去せずにフラッシュメモリ１０１上に常に残すように登録されたバックアップデータのエレメント４も含む。エレメント４にはそのエレメントが変数ディレクトリ２に登録されているという情報を記憶しておく登録フラグフィールド２７と、消去せずに常に残しておくという情報を記憶しておくパーマネントフラグフィールド２８とが配されており、フラッシュメモリ１０１上のエレメント４にはパーマネントフラグを記憶する属性フラグ・チェックサムヘッダ３５が配され、パーマネントフラグの状態をフラッシュメモリ１０１のバックアップデータ上にも保存される。登録フラグがＯＮの変数とパーマネントフラグがＯＮの変数は、セクタ消去の際に消去されずに新しいセクタ３に移動する。
【００５８】
次に、バックアップ処理を行うタイミングについて述べる。バックアップを定期的に行う場合には、アプリケーションからバックアップモジュール２０１を、何らかの形で自動的に繰り返し呼び出す。バックアップモジュール２０１側で、変数ディレクトリ２に条件フィールド２６を配し、時間をカウントして定期処理を行う場合に用いられる周期フィールド４０やカウンタフィールド２９などを配した構成にして時間計測を行い、アプリケーションによってあらかじめ登録された周期に達した場合にバックアップ処理を行う。
【００５９】
また、変数データ１０に変更が加わるたびにバックアップ処理を行いたい場合には、変数ディレクトリ２のＲＡＭアドレスフィールド２２の指し示す変数データ１０とフラッシュアドレスフィールド２３の指し示すバックアップデータ１６を逐次比較し、２つの値が異なる場合に、バックアップ処理を行う。
【００６０】
また、アプリケーション側で任意にバックアップ処理を行うタイミングを指定する場合には、変数ディレクトリ２に、同時にコマンドフィールド４１を配し、アプリケーションからの指示を保存する。このコマンドフィールド４１を監視し、バックアップが指示されるとバックアップを行う。
【００６１】
ここで図４に条件別バックアップ実施例の処理フローを示す。複数のアプリケーションデータに対してそれぞれ異なるタイミングで条件付けてバックアップ処理を行う。バックアップ処理に演算回路の処理が渡された場合に変数ディレクトリ２に登録されているすべての変数ＩＤに対して、以下の処理が行われる。まずステップ１においてコマンドフィールド４１にアプリケーションからのバックアップ指示の設定がされているかを判定し、バックアップ指示の設定を与えられている変数である場合には、ステップ９においてバックアップ処理が行われる。
【００６２】
また、バックアップ指示の設定がない場合においても、ステップ２において条件フィールド２６を読み込み、バックアップが変数変化時に行うように設定されている場合には、ステップ３において、変数がデフォルト値を維持し続けているならばバックアップ処理を行わない。またそうでない場合はステップ４において変数に変化が起きているかを、変数ディレクトリ２のＲＡＭアドレスフィールド２２の指定する値とフラッシュアドレスフィールド２３の指定する値とを比較することで検知する。変化がない場合にはバックアップを行わないが、変化があった場合においても、ステップ５においてさらに、変化している状態が数ターン維持されていることを条件に加えて、その条件を満たした後バックアップ処理がステップ１０で行う。
【００６３】
また、バックアップ条件が変数変化時ではない場合においても、ステップ６において条件フィールド２６を読み込み、定期的にバックアップ処理を行うように設定されていれば定期バックアップ処理を行う。ステップ７において、定期時間かどうかを判定し、定期時間であればステップ８の処理を行う。ステップ８では、変数がデフォルト値を維持し続けているかを判定する。そして、維持し続けていない場合にはバックアップ処理を行う。
【００６４】
ステップ３とステップ８とにおいて、変数がデフォルト値を維持し続けているならばバックアップ処理を行わないように設定する。変数が宣言された当初から、規定値を維持し続けている場合には、バックアップを行う必要がなく、この条件を判定することでバックアップ処理の量を抑制できる。たとえば変数の宣言時には全ての変数を０に設定すれば過去のバックアップデータがない変数データで値が０のデータはバックアップを省くことができる。
【００６５】
ステップ５においてさらに、変化している状態が数ターン維持されていることを条件に加える場合には、アプリケーション設計者がバックアップの条件として任意に時間を設定する。
【００６６】
また、条件フィールド２６にバックアップ条件が記述されていないデータはバックアップ処理されない。
【００６７】
次に、アプリケーションの起動時のアプリケーション変数への値の回復処理について説明する。アプリケーションの起動時には、バックアップデータ１６から変数ディレクトリ２を再構築するとともに、変数データリスト１を再編成する。変数ディレクトリ２を構築した後、アプリケーションが指定する再使用したいデータの変数ＩＤのバックアップデータ１６が、変数データリスト１に読み込まれるとともに、バックアップを取る変数ＩＤが指定され変数ディレクトリ２の登録フラグフィールド２７に登録される。
【００６８】
通常、フラッシュメモリ１０１上には、循環して連続な書き込み済みセクタ領域と、同様に連続な非書き込みセクタ領域とが設置される。また、書き込み済みセクタ領域には、同一変数ＩＤのバックアップデータが複数回書き込まれている。データはシーケンシャルに並び、連続して書き込まれた領域のもっとも先頭のデータが最も古くに書き込まれたデータで、そこから時間順に記憶されている。そのため、最も新しいデータは、同一変数ＩＤのエレメントのうち、最も後方のエレメントに位置する。
【００６９】
変数ディレクトリ２の再構築の際には、まず、フラッシュメモリ１０１の先頭セクタの先頭アドレスから最後尾セクタの最後尾アドレスまで、すべてのバックアップデータ１６をシーケンシャルに変数ディレクトリ２へと書き込む。同時に、シーケンシャルに並んだエレメントのうち最も後方のエレメントの位置を検索しておき、再び先頭セクタから検索したエレメントまでの再書き込みを行う。これにより、常に最も新しいデータで変数ディレクトリ２の変数ＩＤが上書き処理される。
【００７０】
この変数ディレクトリ２の再構築により、フラッシュアドレス１０１にバックアップされたデータと変数ディレクトリ２とを整合させる。その後、さらにアプリケーションの変数データリスト１との整合をとったり、バックアップ処理条件の登録を受けたりしてもよい。
【００７１】
次に、アプリケーション側から見た場合のバックアップ実行のための手続きを図５で示す。ステップ３０のアプリケーションからのバックアップモジュール起動処理により、ステップ２０のバックアップ処理が起動する。バックアップ処理が起動すると、ステップ２１で前述の変数ディレクトリ２の再構築を行う。このときに同時にアプリケーションプログラムによって変数のバックアップ条件の情報がステップ３１において登録される。このときに登録される変数の変数ＩＤが、変数ディレクトリ２にすでにある場合には、その変数を登録し登録フラグをＯＮにするとともに、バックアップデータの値が変数ディレクトリ２内の変数アドレスが示すＲＡＭアドレスに書かれアプリケーションの変数データ１０として用いられる。また、変数ディレクトリ２に存在しない変数ＩＤの場合には変数ディレクトリ２に新たな変数ＩＤを持つデータとして登録される（ステップ２２）。
【００７２】
以降、内部処理が渡されると、ステップ２３のバックアップ処理を行う。内部処理の引渡しは、アプリケーションプログラムのサブルーチンの形式でもよく、スケジューラ等によって内部処理が引き渡されるバックグラウンド処理の形式でもよい。アプリケーションプログラムからのバックアップ処理の呼び出しは、通常は以上の起動と登録との手順のみであるが、登録された設定のバックアップ条件以外の条件でバックアップを行いたいときに用いるステップ３２のバックアップ指示と、ステップ３３のバックアップ設定の変更を行うための再設定とは、随意に呼び出すことができる。
【００７３】
このように、アプリケーションプログラムからの呼び出しは起動と登録のみでバックアップを実行する。
【００７４】
このような構成にすることで、アプリケーションの変更があった場合にも、消去したくないデータと変数ＩＤを残すことができる。アプリケーション起動時の変数ＩＤの登録以外、アプリケーションへの依存がないために、アプリケーションに何らかの変更が行われた場合において、新しい変数に対しては新しい変数ＩＤを登録させることで対応し、変更に対する冗長性を高くすることができる。
【００７５】
次に、終了処理以外での電源断が発生し、フラッシュデータの書き込みエラーが起こったとしても、エラーデータを読み込むことなく、代替となる過去のデータを自動的に読み込んで対応する例を示す。
【００７６】
バックアップモジュール２０１が起動している場合であって、何らかのデータが書き込まれている途中で電源断が発生した場合には、記述された変数ＩＤに対応するデータがエラーデータとなっている場合がある。再起動時にそのようなエラーデータを誤って変数ディレクトリ２に読み込んで再構築することを避け、エラーデータを読み込まずに、エラーデータ以前にバックアップ処理されたバックアップデータを読み込む。変数ディレクトリ２の再構築は、シーケンシャルな上書き処理により行われていたため、エラーデータの判別ができれば、それを変数ディレクトリ２に読み込まないことで自動的にエラーの起こっていない最新のバックアップデータからシステムを復旧することができる。
【００７７】
このために、エレメント４に通常のバックアップデータ１６と同時にデータサイズを記憶しておくサイズヘッダ３４および、属性フラグおよびチェックサムを記憶しておく属性フラグ・チェックサムヘッダ３５、を用意することで対応可能となる。バックアップデータの記述に際して、エレメント４内にデータサイズ、バックアップデータ、属性フラグおよびチェックサムの順番で記述する。このような順番で記述することにより、属性フラグおよびチェックサムを記述する前の電源断による書き込みエラーの発生に対しては、属性フラグおよびチェックサムが正しく書き込まれない。そのため、属性フラグおよびチェックサムが正しく書き込まれていないエレメント４には、書き込み途中でエラーが発生したことが検知でき、エラーデータを読みこまないようにすることができる。
【００７８】
また、複数の変数間に、常に同期が取られている必要がある場合、ある変数データ１０が正常にバックアップされても、同時に同期すべき別の変数のバックアップ処理前に電源断等でバックアップが中断された場合にはそれを検知し、同期が取れている過去の状態に設定しなおす必要がある。
【００７９】
この同期処理は、フラッシュメモリ１０１内に同期フラグエレメントと終端同期フラグエレメントを備えることで対応可能となる。同期フラグエレメントと終端同期フラグエレメントには、たとえば、固有の変数ＩＤを割り当てておき同期フラグエレメントであるということを判定可能にしておく。また、データとして同期させるグループのメンバの変数ＩＤを記述しておく。また、同期フラグエレメントと対になるエレメントとして、終端同期フラグエレメントもあわせて記述する。ここでこの同期すべき変数グループのメンバをバックアップ処理する場合には、必ず、同期フラグエレメントと終端同期フラグエレメントとで前記メンバをはさむように記述する。このように記述することで同期グループの記述途中の電源断に対して、同期フラグエレメントとデータとして記述されたメンバと終端同期フラグエレメントが記憶された順番に従って記述されていない場合には電源断が起こったことが検知できる。また、これらのエレメントの記述の際には、変数ディレクトリ２上にルートフラグフィールド４９とチェーンフィールド５０を配しておく。ルートフラグには、同期して記述しておくべき変数のエレメントのうち先頭に保存するエレメントかどうかを記述しておき、チェーンフィールド５０にはそのエレメントの次に保存するべき変数データ１０を示しておく。同期バックアップ処理は、まずルートフラグがＯＮになっている変数データ１０を検知すると、その変数ディレクトリ２のチェーンフィールド５０が示す別の変数ディレクトリ２を検索し、さらにそこからチェーンフィールド５０に記述された変数ディレクトリ２を次々と検索する。そして同期フラグエレメントのデータとしてそのチェーンを記述した後それぞれの変数ディレクトリ２が示す変数データ１０がバックアップされ最後に終端同期フラグエレメントを記述する。このようにして同期バックアップを実現することができる。
【００８０】
また、一般にフラッシュメモリ１０１のデータ消去には時間がかかり、その間の電源断がおこると消去作業中のセクタ全体が不定なビット列となってしまう。そのエラーデータを読み込むことがないようにするためには、常に連続して２以上のセクタ３が空き領域になっているように前記非書き込みセクタを設定すればよい。上述の書き込みを行う新しいセクタを検出する過程において、常に非書き込みセクタが２以上連続するように設定し、非書き込みセクタが連続していなければ、少なくともひとつ存在するはずの非書き込みセクタの次のセクタ３を消去する。このように処理することで、たとえ電源断により全体が不定なビットとなったセクタ３であっても常に消去の対象になるためにそこからデータが読み出されることはなくなる。また、消去予定のセクタ３に存在する有効なデータを移行した後でセクタ消去を行うために、データを移行する局面での電源断があったとしても、前述のデータ書き込みにおける電源断対策によってエラーデータの読み込みを防ぐことができる。
【００８１】
また、バックアップ処理はバックグラウンドで実行される定期的な処理であるが、情報処理装置への入力電圧が何らかの原因により低下してしまうパワーフェイルなどの特殊なタイミングで、バックアップ処理を実行したい場合がある。また、更新頻度が高い変数と、重要な変数とを区別して保存したい場合もある。
【００８２】
パワーフェイルや変数を区別して保存するには、セクタ群を多重化することで対応が可能である。たとえば変数ＩＤを０〜ＦＦＦまでをＡセクタ群として、１０００からＦＦＦＦまでをＢセクタ群として、それ以外をＣセクタ群と分けておき、それぞれのセクタ群に対応したバックアップモジュール２０１を並行して実行する。
【００８３】
パワーフェイル時に起動する割り込みプログラムにおいてバックアップしたい変数を登録しておき、割り込みプログラム中でバックアップモジュール２０１を呼び出し、パワーフェイル時にバックアップ対象の変数を多重化した別のセクタ３に記憶し、電源断に対応する。しかし、セクタ消去中のパワーフェイルの場合には、セクタ消去の処理に非常に時間がかかり、バックアップ処理を行う前に電源断がおこる事がある。このときは一般に割り込み処理でセーブ（書き込み）はできない。そのため、パワーフェイルデータが設定されている場合には、セクタ消去実行前に必ずパワーフェイルデータをバックアップセーブすることで、パワーフェイルに対しても確実にパワーフェイル対象の変数をバックアップ処理することができるようになる。たとえば、書き込みを行っていたセクタ３の空き領域のサイズが、一定のサイズより小さくなったときに、このバックアップを行い、バックアップが終了した後で消去対象のセクタ３を消去する。
【００８４】
以上のようにしてエラーデータを読み込むことなく正常なバックアップデータからアプリケーション変数を復旧することができ、頑健性の高いバックアップ処理を得ることができる。
【符号の説明】
【００８５】
１  変数データリスト
２  変数ディレクトリ
３  セクタ
４  エレメント
５  中央演算回路
６  入力デバイス
７  出力デバイス
９  配列テーブル
１０  ＲＡＭ上の変数のデータ
１４  配列インデックスフィールド
１５  配列要素フラッシュアドレスフィールド
１８  ＲＡＭ上の配列変数のデータ
１９  ＲＡＭ上の配列要素のデータ
２０  変数ディレクトリのフィールドの組
２１  変数ＩＤフィールド
２２  ＲＡＭアドレスフィールド
２３  フラッシュアドレスフィールド
２４  アクティブフラグフィールド
２５  配列数フィールド
２６  条件フィールド
２７  登録フラグフィールド
２８  パーマネントフラグフィールド
２９  カウンタフィールド
３０  エレメントのヘッダの組
３１  変数ＩＤヘッダ
３２  配列インデックスヘッダ
３４  サイズヘッダ
３５  属性フラグ・チェックサムヘッダ
４０  周期フィールド
４１  コマンドフィールド
４２  タイプフィールド
４３  サイズフィールド
４４  クリティカルフラグフィールド
４５  新セクタフィールド
４６  旧セクタフィールド
４７  旧フラッシュアドレスフィールド
４８  エラーフラグフィールド
４９  ルートフラグフィールド
５０  チェーンフィールド
１００  ＲＡＭ
１０１  フラッシュメモリ
２００  アプリケーションモジュール
２０１  バックアップモジュール
２０２  情報処理装置
【図１】
0005398795.tif 000002
【図２】
0005398795.tif 000003
【図３】
0005398795.tif 000004
【図４】
0005398795.tif 000005
【図５】
0005398795.tif 000006