不揮発性メモリへの頻繁な書き込み


10

私は、温度が変化すると物理的な位置を自動的に調整するデバイスを設計しています。デバイスがシャットダウンするか、電源が切断された場合、デバイスは最後の温度と位置を記憶する必要があります。私はこれらの値をEEPROMに保存することができますが、問題は位置と温度が非常に急速に変化する可能性があることです。tempとposを変更するたびにEEPROMに書き込むと、(1)ファームウェアが少し遅くなり、(2)1〜2年後にEEPROMが終了する可能性があります。だから私が見るように私のオプションは次のとおりです...

1)コンデンサ/バッテリーを使用して、電力が失われた後、デバイスに電力を供給し続けるため、その時点でのみ値をEEPROMに書き込むことができます。ボードはちょっとパワーが空いていて、これには大きなキャップが必要になるので、私はこれが好きではありません。そして、私にはたくさんの空き容量がありません。そして、私はバッテリーとバッテリーホルダー/または大きなキャップの追加コストを望んでいません。

2)EEPROMの代わりにF-RAMを使用して、消耗することなく何兆回も書き込むことができるようにします。FRAMはEEPROMよりもかなり高価であり、これはプロダクション製品(1つだけではない)用であるため、このオプションは好きではありません。

3)位置と温度は5分程度ごとに記入してください。このようにして、常にかなり最近の位置/温度を記録していますが、毎秒書き込みを行っているわけではないので、プログラムの速度が低下せず、EEPROMの速度が低下しません。これは私の最良の選択肢のようです。

他の誰かが私が考えていない提案をしていますか?


5
ただの質問です。デバイスが物理的な位置を自動的に調整する場合、最後の温度を記憶する必要があるのはなぜですか?デバイスの電源を再びオンにしても、温度が更新されず、位置が調整されませんか?
ダニエル・グリロ

1
私はダニエルに同意します。電源を切り、周囲温度が大幅に変化した場合はどうなりますか?電源投入時に、最後に保存された一時/位置を使用した場合、とにかく間違った場所になり、デバイスは関係なく移動することになります。質問に記載されていない別の要件はありますか?
Dave

EEPROM仕様とは何ですか-書き込みサイクル数は?
Jason S

回答:


10

必要なのは、ウェアレベリングと呼ばれる手法です。EEPROMの同じ場所に毎回データを書き込むわけではありませんが、アルゴリズムを使用して別の場所を使用します。複雑なウェアレベリングアルゴリズムについて読みましたが、次の単純な方法が機能しない理由はわかりません。

データに24ビットカウンターを追加して、データブロックがたとえば8バイト長になるようにします。24AA64のページは32バイト長なので、64kb EEPROMは256ページを保持します。データシートから:

「32バイト未満の書き込みを行うと、ページの残りの部分のデータが書き込まれるデータバイトと共に更新されます。これにより、ページ全体が書き込みサイクルに耐えるようになります。このため、耐久性はページごとに指定されています。」

そのため、32バイトページよりも小さいデータブロックを使用しても意味がありません。

最初のページのカウンターを見てください。ゼロの場合は、そのページの書き込みサイクルの最大数を使用したため、次のページに移動して、そのカウンターを確認します。カウンターがゼロになるまで繰り返します。それが現在使用しているページです。マイクロチップ社のEEPROMは100万サイクルの耐久性を備えており、64kb EEPROMのブロックあたり最大32バイトの例では、2億5600万まで増加できます。それはあなたの製品を長持ちさせるのに十分でなければなりません:あなたが5秒ごとに一度書くと40年(!)。

初回使用時にEEPROMを初期化する必要があります。それがいつなのか、どうやって知るのですか。初期化時に最後のページを使用して一意の署名を書き込みます。署名があるかどうか、電源投入ごとに確認してください。そうでない場合は、デバイスを初期化する必要があります。各ページのカウンターを0xF4240(100万分)でプリセットするか、すべてを0xFFにクリアして、ページを初めて使用するときに0xF4240を書き込むことができます。
製造/テストプロセスで特定のパターンが書き込まれることがあるため、EEPROMの初期化が必要です。

編集
ウェアレベリングは問題を解決するはずですが、コンデンサーのソリューションについてはまだコメントしたいと思います。ボードの消費電力はかなり多いとおっしゃっていますが、マイクロコントローラー/ EEPROMの電源をボードの他の部分からダイオードで分離することができます。したがって、主電源がなくなったときに、おそらく数mAしか必要ありません。24AA64は5ms未満でページを書き込み、次に10mAで100mVの許容電圧降下が必要になります

C=tΔV=10メートル5メートルs100メートルV=500μF

小さなスーパーキャップで簡単。


データシート24AA64 EEPROM耐久性チュートリアルをさらに読む


EEPROMの耐久性はページごとに示されています(少なくとも24AA64と、私が使用した他のEEPROMの場合)。24AA64は32バイトのページを指定するため、カウントはブロックごとではなく、ページごとにする必要があります。
サアド

@Saad-正解。私の答えで修正されました。
stevenvh

4

1)書き込みプロセスを開始したら、MCU / EEPROMに電力を供給し、制御ラインに問題がないことを確認するだけで済みます。これには、SPIよりもI2Cの方が適しています。数ミリ秒の間数mAしか必要ないので、大きな上限にはならないはずです。書き込みが開始されると、MCUをスリープ状態にすることができます。3)ホールドオフなど、いくつかのインテリジェンスを適用できます-いったん書き込まれると、次の書き込みが発生するまでの時間は常に保持されます。または、値が安定するまでしばらく待ってから書き込みを行ってください。
また、データを複数の場所に分散させることにより、耐久性を向上させることもできます。Microchipには、eepromの耐久性を計算するためのツールとアプリケーションノートがいくつかあります。


4
耐久性に関するMicrochipアプリケーションノート: ww1.microchip.com/downloads/en/AppNotes/01019A.pdf Appnote から、動作電圧を5vから3.5vに下げることにより、耐久性を約2倍に増やすこともできます。
バンディー

1
最初の方法を使用する場合は、不揮発性メモリへの書き込みが、起動後のシステムで最高の優先順位であることを確認してください。この割り込みにより、書き込み中に値が変更されたり、microが他の処理を開始したりして時間切れになることはありません。電源を切るときに破損した値を書き込まないことが最も重要です。さらに、値のCRCは、破損が発生していないことを確認するのに役立ちますが、デフォルトを使用するなど、発生した場合の対処を決定する必要があります。
マーティン

3

ブロック指向のフラッシュデバイスを使用し、各ブロックの1バイトをモードフラグとして使用することをお勧めします。ほとんどすべてのモードフラグがプログラムされることを不変条件として維持します。モードフラグがプログラムされていないブロックは1つしかありませんが、前のブロック(必要に応じて折り返す)はプログラムされています。そのブロックは、最新のデータを持つブロックになります。そのブロックがいっぱいになると、次のブロックを消去します(消去されるブロックは、消去サイクル中にデータの任意の組み合わせを保持でき、不変条件は引き続き保持されることに注意してください)。消去が完了すると、以前に使用されていたものにモードフラグをプログラムします。最後のブロックになります。

フラッシュへの電源供給を十分に保護して、バイトをプログラムしようとする試みがすべて成功するか失敗するかを確認する必要がありますが、消去サイクルが中断されてブロックに任意のデータがいっぱいになっても問題はありません。データエントリを書き込む次の試みはそのブロックを再消去するためです。

データが16ビットの場合、64Kx8チップは32,000以上のエントリを保持します。1秒あたり1つのエントリを書き込むと、チップは約2.7倍になります。「のみ」の10K消去サイクルの耐久性を持つチップでさえ、10年以上持続します。より大きなチップ、または100Kの耐久性を持つチップを使用すると、それに比例して耐用年数が長くなります。


2

1)おそらく最も簡単なオプションですが、ハードウェアの変更が必要になる場合があります。以前は、デカップリングキャップを増やして電圧低下を中断するだけで、PBCを変更せずにこれを実現しました。

2)ご指摘のとおり、FRAMの問題は価格です!

3)温度と位置データのボラティリティに応じて、値が変更された場合のみ書き込むことで耐久性を向上させます。毎秒1回温度をサンプリングする場合がありますが、5分ごとにしか変化しない場合は、問題は解決しています。


1

これが私のプロジェクトでこの問題を解決した方法です:

フラッシュの1セクターを予約して、未使用スロットのビットマスクと値のスロット数を保持します。

私が使用したビットマスクは16バイトの長さだったので、値を入れるための128スロットがありました。

ビットマスクはすべて1に初期化されます。フラッシュに関しては、消去された状態です。

新しい値を書き込む場合は、ビットマスクを読み取り、1である最初のビットを見つけます。これは、値を書き込むスロット番号です。そのビットをゼロに変更して使用済みとしてマークし、ビットマスクを最初に消去せずにフラッシュに書き戻します。次に、フラッシュを消去せずに、ビットマスクの後のスロットに値を書き込みます。

このように、1から0への変更のみで新しいビットマスクを書き込むことにより、フラッシュの書き込みサイクルを128倍延長します。

ビットマスク全体が0の場合は、フラッシュセクターを消去して、新しく開始します。


3
がっかりするかもしれませんが、少しフラッシュするとセクター全体が上書きされます。あなたのソリューションは「ビットマスク」セクターを本当にすぐに死にます。
Andrejs Cainikovs、2011

1
フラッシュを消去しない場合、セクターの10K消去サイクルの1つを使い果たしません。値0x7Fがあり、値0x3Fを書き込んだ場合、結果は0x3Fになります。これにより、ビットマスクは最新の状態に保たれますが、フラッシュは消去されません。全体のビットマスクが0になると消去にのみ発生
ロバート・

私が間違っている場合は、議論しましょう。私はここで悪い答えを求めていませんし、プロジェクトで悪いデザインを望んでいません。
ロバート

ロバートは正しいと思います。私のマイクロコントローラーでは、一度に4バイトしか書き込むことができませんが、必要なビットはゼロに設定されています。それらを1に戻す唯一の方法は、1kブロックをブランクにすることです。フラッシュを着用するのはその消去サイクルのみ...
Tim

これは、メモリのタイプごとに異なる場合があり、メモリベンダーさえ異なる場合があります。EEPROMはページを消去してから、書き込みごとにページを再書き込みする必要があることを確認しました。ページを消去せずに、まだ1のビットを書き込むことができるフラッシュメモリを見たことがあります。
mjh2007年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.