停電時の「部分書き込み」データ破損を防ぐにはどうすればよいですか?

StackOverflow https://stackoverflow.com//questions/21051614

質問

組み込み環境 (MSP430 を使用) では、不揮発性メモリへの部分的な書き込みによって引き起こされるデータ破損を確認しました。これは、(FRAM または情報セグメントへの) 書き込み中の電力損失が原因であると考えられます。

これらの場所に保存されているデータを CRC で検証しています。

私の質問は、この「部分書き込み」の破損を防ぐ正しい方法は何ですか?現在、2 つの別々の FRAM 位置に書き込むようにコードを変更しました。したがって、1 つの書き込みが中断されて無効な CRC が発生した場合でも、他の場所は有効なままでなければなりません。これは一般的な慣行ですか?不揮発性メモリに対してこの二重書き込み動作を実装する必要がありますか?

役に立ちましたか?

解決

簡単な解決策は、メンテナンスすることです データのバージョン (フラッシュ メモリの場合は別のページ)、現在のバージョンと以前のバージョン。各バージョンには、シーケンス番号と、シーケンス番号を検証するワードで構成されるヘッダーがあります。たとえば、単にシーケンス番号の 1 の補数です。

---------
|  seq  |
---------
| ~seq  |
---------
|       |
| data  |
|       |
---------

重要なことは、データが書き込まれるときに、 seq そして ~seq 言葉が書かれている 最後.

起動時にあなたは 読む を含むデータ 最も高い有効なシーケンス 数値 (おそらくラップアラウンドを考慮したもの - 特に短いシーケンスの単語の場合)。データを書き込むときは、データを上書きして検証します。 最古の ブロック。

すでに使用しているソリューションは、CRC が最後に書き込まれる限り有効ですが、単純さに欠けており、必要または望ましくない CRC 計算のオーバーヘッドが発生します。

FRAM では耐久性について心配する必要はありませんが、フラッシュ メモリと EEPROM ではこれが問題になります。この場合、ライトバック キャッシュ方式を使用します。データは RAM に保持され、変更されるとタイマーが開始されるか、すでに実行されている場合は再起動されます。タイマーが期限切れになると、データが書き込まれます。これにより、バースト書き込みが防止されます。メモリのスラッシングを防ぎ、データ書き込みのソフトウェア オーバーヘッドを最小限に抑えるため、FRAM 上でも役立ちます。

他のヒント

私たちの工学チームはこれらの問題に2つの断続的なアプローチを取ります:ハードウェアとソフトウェアでそれを解決しましょう!

第1は、ブラウンアウト中に数ミリ秒の電力を供給するためのダイオードおよびコンデンサの構成である。外部電源を紛失したことに気付いた場合は、コードが違反していない書き込みの入力を妨げます。

2番目のデータは、操作に特に重要です。そして各レコードをCRCコードで保護します。起動時に、最新の有効な書き込みを見つけてから、消去/書き込みサイクルを開始します。

私たちの率直な妄想システムを実装してからのデータ破壊を見たことがない。

更新:

私たちのフラッシュは私たちのCPUの外部にあることに注意する必要があるので、CRCはCPUとフラッシュチップの間に通信グリッチがある場合にデータを検証するのに役立ちます。さらに、複数のグリッチを行に経験した場合、複数の書き込みはデータ損失に対して保護します。

クリフォードの答えに似たものを使いましたが、1回の書き込み操作で書かれました。データのコピーとそれらの間に交互に2コピーが必要です。インクリメントシーケンス番号を使用して、1つの場所がシーケンス番号でさえも奇数を持っているように、増分シーケンス番号を使用します。

このようなデータを書き込みます(1つの書き込みコマンドで、できる場合)。

---------
|  seq  |
---------
|       |
| data  |
|       |
---------
| seq   |
---------
.

読み戻すときは、両方のシーケンス番号が同じであることを確認してください - データは無効です。起動時に両方の場所を読んで、どちらが最近である(シーケンス番号のローリングを考慮に入れる)。

start_byte、書き込みの合計バイト、データ、終了バイトなど、ある種のプロトコルで常にデータを格納します。 外部/内蔵メモリに書き込む前に、常にPower Monter Registers / ADCを確認してください。 いずれかのデータが破損した場合、終了バイトも破損します。そのため、プロトコル全体の検証後にエントリがvaildではありません。 チェックサムは良い考えではありません。プロトコルにCRCを含める場合は、CRC16を選択できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top