0

私のシステムでは、データを EEPROM フラッシュに保存する必要があります。バイト文字列は、一度に連続してではなく、一度に 1 つずつ EEPROM に書き込まれます。弦の長さは異なる場合があります。最後に書き込んだアドレスから続けて、スペースを無駄にせずに文字列を順番に保存したい。たとえば、最初のバイト文字列がアドレス 0x00 ~ 0x08 に書き込まれた場合、2 番目のバイト文字列をアドレス 0x09 から書き始める必要があります。

どうすれば達成できますか?一部の EEPROM の書き込みコマンドは、アドレスを指定する必要がなく、最後に書き込まれたポイントから続行するだけであることがわかりました。しかし、私が使用している EEPROM はそれをサポートしていません。(Spansion の S25FL1-K を使用しています)。アドレスを追跡するためにメモリの一部を割り当て、書き込むたびにアドレスを保存することを考えましたが、フラッシュの消耗が早くなる可能性があります。そのような場合を処理するために広く使用されている方法は何ですか?

ありがとう。

編集:私が求めているのは、次の書き込みが発生したときに開始するアドレスがわかるように、アドレスを不揮発性の方法で追跡/保存する方法です。

4

1 に答える 1

0

この特定のフラッシュを使用したことはありませんが、似たようなものを実装しました。残念ながら、制約や優先順位 (メモリや CPU の効率、書き込みの頻度など) を知らなければ、明確な答えを出すことはできません。ここでは、検討したいテクニックをいくつか紹介します。広く使われているかどうかはわかりませんが。

オプション 1: 文字列の長さを含む X バイトを文字列の前に書き込みます。次に、初期化時にフラッシュを解析できます。長さ n を読み取り、n バイト前方にジャンプします。次のバイトを読み取ります。空の場合 (データシートによるとフラッシュのすべてが 1)、最初の空のビットが得られます。それ以外の場合は、次の文字列の長さを読み取っただけなので、同じことを繰り返します。

  • この方法を使用すると、使用済みセクターの最初のバイトに値があることが保証されているため、最後に使用したセクターをすばやく検索できます。ここでの裏返しは、文字列を書き込むたびに (文字列の最大長に応じて) 余分な n バイトのオーバーヘッドが発生し、それを解析して値を取得する必要があることです (ただし、これは起動時に 1 回しか実行できません)。

オプション 2: サイズを先頭に追加する代わりに、一意の「文字列の終わり」シーケンスを追加し、起動時に、空のフラッシュを表すシーケンスの前の最後のシーケンスを解析します。

  • ここでの欠点は解析に時間がかかることですが、文字列ごとにわずか 1 バイトのオーバーヘッドで済む可能性があります。

オプション 3 は、あなたがすでに考えていたことです: 必要な値を含む別のセクターを割り当てることです。フラッシュの消耗を減らすために、これらの値を連続して書き込み、起動するたびに最後の値を検索することもできます。また、プログラムするデバイスの期待寿命と、フラッシュが維持できる 100,000 回の消去を考慮することもできます (データシートによると) - 着用に問題はありますか? もちろん、それはデータが保存される頻度によって異なります。

それが役立つことを願っています。

于 2016-02-29T04:31:20.117 に答える