2017-01-16 13 views
2

私のプロジェクトでは、さまざまなレコードをeepromに保存する必要がありますが、これらのレコードを(アドレスで)検索、削除、編集する必要があります。レコードは次のようになります。eepromでデータをorginizeする方法

[n bytes address1][data1][data2][data3] 
[n bytes address2][data1][data2] 
[n bytes address3][data1][data2][data3][data4][data5][data6] 

私は(すべてのレコードは、データのさまざまな長さを持っているので)、メモリが非常に断片化されるいくつかのレコードを削除した場合、私は怖いです。

このタスクに最適なソリューションは何ですか?

私はavr atxmegaと仕事しています。

+0

最大レコード長と最小レコード長はどれくらいですか?レコードはいくつですか? –

+0

約3000レコード、最小約40、最大80バイトです。私は外部メモリを使用していますが、私の問題は組織にあります。レコードを簡単に検索してアクセスする方法 – ZonderComand

+0

おそらく3000x80バイトが利用可能ですが、おそらくすべてのレコードを80またはおそらく128バイトにして潜在的なページ境界に合わせます。あなたがどのようにレコードを "検索"するかは、あなたが探しているものによって異なります。何らかの並べ替えが意味をなさないとは思っていませんが、何らかのインデックス/マーキング/グループ化が考えられます。 –

答えて

2

レコードの最大サイズを定義し、それを使用してデータを保存できます。 空のバイト数がいくつかありますが、メモリを管理するという面倒を克服します。

セクタにも注意してください。セクターは、消去する最小のグループです。データがセクタの境界線を超えると、データが破損する可能性があります。

+1

セクタ消去の問題については良い点がありますが、AVRデバイスではEEPROMはバイト消去/書き込み可能なので、問題ではありません。それ以外は、これは単純な単純なアプローチであることに同意しますが、レコードの長さはそれほど違いはありません。 –

0

"ファーストフィット"の代わりに "ホール"を(理想的には完全に)再使用するための "ベストフィット"アルゴリズムを実装すると、メモリの断片化が問題になりにくい傾向があります。効率、その時)。あなたのデータが一定の細かさを持っている場合(これはそうであるようです)、あなたはかなり効率的に作業することができます。

リンクフリーリストを使用してEEPROMの空き領域を整理し、保存するデータの一部が正確にはに収まる範囲、または一定の許容オーバーヘッド内でフリーリスト全体を検索するようにしてください。このような領域が見つからない場合は、最大の空き領域を使用します。これにより、断片化を大幅に軽減します(データに応じて避けなければなりません)。

0

いくつかのアプローチがありますが、選択はEEPROMのサイズ、レコードの最大数(Nと表記します)、レコードの最大サイズ(Sとしましょう)によって異なります。 最初のアプローチは、 S)< =フリーEEPROMサイズの場合、各レコードに最大サイズの等ブロックを割り当てることができます。たとえば、EEPROMのサイズが2048で、各レコードが最大31バイトで、レコード数が64を超えない場合は、レコードのサイズを示す最初のバイトを使用して、それぞれ32バイトの64レコードを割り当てることができます。

各レコードのサイズは、(あなたができるだけ多くのモミしたい)広い範囲で変えることができ、または合計数が定義されていない場合、2つの断片化があるアプローチ:

1)のデータを最適化。必要なサイズのブロックが連続してない場合は、必要なサイズの空きブロックがなくなるまですべてのデータを移動します。

たとえば、レコードサイズが127バイト以内に変更された場合、最初の1バイトを使用してブロックのタイプとサイズを指定できます。例えば。上位ビットはブロックが空いている場合は1、データが含まれている場合は0です。下位7ビットはブロックサイズを含む。 この方法は十分ですが、データが移動されるため、データへのすべての参照を適切な方法で更新する必要があります。

2)データを断片化して格納します。特定のサイズのブロック数を割り当てることができます(たとえば、それぞれ32バイト= 2048バイトのEEPROMに対して最大64レコード)。最初のものには、データが続くブロックのインデックスが含まれます。つまり、0xFEはチェーンの最後のブロックの値、0xFFは空のブロックを示す値です。データを格納するブロックのその他の31バイト。 読み取りプロセスがやや複雑になる可能性がありますが、各レコードのデータの場所は全期間にわたって変更されません。

+0

ワウありがとう!それは最初のバイトを使用する非常に良い解決策です! – ZonderComand

関連する問題