質問

い店舗が異なる長さの円形のキューにフラッシュチップです。各項目において、その封止んできたなかで、クラスタ間のレプリケーションを開始します。が十分な品目のバッファーでラップする。

何よりもすることができ店舗円形のキューにフラッシュチップ?

可能性があるのに数万人の項目たいと思います。だから、読書の末尾にバッファーに最適でには時間がかかる検索やくこれで終了となりました。

ものでは円形ながらプレーする必要があります識別できる最初の項目からします。

最後の問題であることを保存flash、消去各ブロックは時間とコストがかかることができることとしますセット回数は各ブロックです。

役に立ちましたか?

解決

まず、ブロック管理

け小さめのヘッダのブロックです。主なものに必要なもの"古い"と"新"は、ブロック番号は、単に単位modulo k. k より大きくなければなりません総数ブロックとなります。理想的には、 k 以下のご最大値(例えば0xFFFF)で簡単に言うのは消去されます。

起動時にコードを読み込みヘッダのブロック、に位置するこの最初と最後のブロックのシーケンスni+1 =(ni +1)MODULOます。などにはくれぐれも留意して混乱により消しブロック(ブロック番号など0xFFFF)またはデータがどことなく壊れたなど不完全消去).

各ブロック

各ブロック開始当初は空です(各バイトは0xFF).各レコードで書いで行われるようになりました。合固定サイズの記録、その後からアクセスできる簡単な指数です。だって可変サイズ記録、そして読んでいスキャンからのブロック、リンク先の一覧です。

したい場合において可変サイズの記録な直線スキャン、そして定義ヘッダーなどがあります。E.g.利用0の記録として区切り文字、 COBS-エンコード(または COBS/R-エンコード)などがあります。使用バイトご希望の区切り文字として、"escape"のbyteの場合発生しますの各記録と同様の PPPプロトコル).

起動時、一度お知ら最新のブロックでの直線スキャンのための新します。き固定サイズの記録又は記録のデリミタを付与すいバイナリを検索する

消ケジューリング

一部のフラッシュメモリチップの消去ブロックできる時間--例5秒になっています。検討ケジューリング、消去などを背景にタスクト"の時間"E.g.現在のブロックをx%、その後消去、次のブロックです。

記録番号

また番号の記録です。のんので、過去には、ヘッダのブロックのレコード番号の最初のです。その後、ソフトウェアを保持カウント数にそれぞれのブロックです。

チェックサムはCRC

したい場合は検出が破損データなど不完全な書き込みや消去は行わない電源の故障)を追加することができますチェックサムはCRCをそれぞれに、そのブロックヘッダを表します。注意ブロックのヘッダCRCうカバー、ヘッダ自体ではなく記録できなデータの再書込みが行われそれぞれの新しいレコードが書かれています。

他のヒント

最初のレコードの先頭と最後のレコードの末尾へのポインタが含まれている別のブロックにしてください。あなたはまた、などのレコードの合計数、などのようなより多くの情報を維持することができます。

あなたが最初にスペースを使い果たすまで、

、レコードを追加すると、バッファの末尾に書き込むとテールポインタを更新するのと同じくらい簡単です。

あなたがあなたの現在のレコードに合うことができるように、スペースを再利用するに十分なレコードを削除する必要があります。あなたがレコードを削除するようヘッドポインタを更新します。

あなたは解放されているどのくらいの余分なスペースを追跡する必要があります。あなたが最後のレコードの最後にポインタを保持する場合は、レコードを追加する必要があります次回は、あなたが任意の複数のレコードを削除する必要があるかどうかを判断するための最初のレコードへのポインタとそれを比較することができます。

これはNANDの場合は、

また、あなたやフラッシュコントローラは、デブロッキングを行うと、ウェアレベリングをする必要がありますが、それはすべての循環バッファのためのスペースを割り当てるよりも下位層である必要があります。

私は今それを得ると思います。あなたの最大の問題は、記録のために利用可能なスペースを埋めたことになるようです、次に何が起こるようですか?新しいデータは、私はあなたが循環バッファで何を意味するかと信じている最も古いデータを上書きする必要があります。データは、長さが固定されていないので、しかし、あなたは複数のレコードを上書きする可能性があります。

私は長さの変動量が一定の長さにすべてをパディングすることは選択肢ではないことを十分な大きさであることを仮定しています。

あなたの書き込みセグメントは、書き込む次のレコードの始まりを表しアドレスを追跡する必要があります。あなたがブロックのサイズは、事前に書き込むことがわかっている場合、あなたは論理バッファの最後で終わると「0」でやり直すしようとしている場合伝えることができます。私は初めに最後のいくつかといくつかでレコードを分割しないでしょう。

別のレジスタは、先頭を追跡することができます。これは、まだ上書きされていない最も古いデータです。あなたがデータを読み出すために行った場合は、開始する場所です。

データライターは、書き込み開始アドレスとデータの長さが与えられ、チェックしますそのそれは次への読み取り最初のブロックを調べて、長さを見ることがレジスタ、および事前バンプ必要がある場合は、コミットしよう記録、データが何であれ書き込むための十分なスペースがあるまで。おそらく、書き込まれたデータの終わりと最も古いデータの開始との間で住んでジャンクデータのギャップがあります。しかし、この方法は、あなただけのオーバーヘッドとしてアドレスまたは2を書き込み、ブロックを並べ替えるないことができます。

少なくとも、それは私がどうなるのか、おそらくです。 HTH

私は3つのオプションを参照してください。

オプション1:あなたはどこ書き方を知っているとどこから読み始めるには、各オブジェクトのサイズを使用するので、同じサイズに出パッドすべてにあり、これはシンプルで、バッファの先頭と末尾にポインタを格納次へのオフセットを取得、これはあなたが、リンクされたリストと同じように、あなたがアイテム5000が必要な場合は、その遅い別名、バッファを横断する必要があることを意味します。

オプション2:あなたの周りのあなたのループは、サイズミスmatchsに対処する必要はありません。そのように、循環バッファに実際のデータへのポインタのみを格納することです。あなたはそれを循環バッファ内の実際のデータを格納し、パッドをしない場合は、お使いのオーバーwitting状況に1つの新しいデータオブジェクトを使用して複数の項目を実行することができ、私はこれはOKではないと仮定します。

ほとんどのフラッシュを内蔵ウェアレベリングのいくつかの並べ替えを持っていますので、あなたが同じ場所を複数回上書きを心配する必要がない場合は、実際にそれを格納する場所を、ICが把握し、他の場所でフラッシュの実際のデータを保存しますチップ上で、ちょうど次の使用可能な空きスペースへに書き込みます。

これはあなたが、これはデータのばらつきに依存しませんどのように循環バッファの最大サイズを選択する必要があるということです。データのサイズがちょうど大きく変化した場合、数バイトだけで言って、あなただけのパッドそれを、使用するオプション1.乱暴と予測できないサイズの変更は、それができる最大サイズを選択し、どのように多くのオブジェクトを把握する必要がある場合そのサイズのバッファ内のエントリの最大数としてそれを使う、あなたのフラッシュに収まるでしょう。これはあなたがスペースの束を無駄に意味ます。

オプション3:オブジェクトは実際に任意のサイズにすることができた場合、あなたのあなただけのファイルシステムを使用する必要があります時点で、順序、ループ内のファイルに名前を付ける戻ったときに念頭に置いて、あなたの完全な維持、あなたの新しいエントリが大きい場合、あなたかもしれませんオプション2は、多くの方法で、単純なファイルシステムであるとして、これは本当にオプション2の拡張子だけです。で、それに合わせて、複数の古いエントリを削除する必要があります。

フラッシュで「円形」は、あなたがこのバッファに割り当てるどのくらいのフラッシュのブロックを宣言しなければならないことを意味し、ブロックサイズに基づいて行うことができます。

とNバッファの実際のサイズは、n-1の間の各特定の時間になります(nはブロックの数である)。

各ブロックは、他のより古いであるブロックを決定するために使用することができるシーケンス番号またはタイムスタンプを含むヘッダーで始まる必要があります。

各項目は、ヘッダーとフッターでカプセル化。デフォルトのヘッダーは、あなたが好きな含まれていますが、このヘッダに応じて、あなたは、アイテムの大きさを知っている必要があります。デフォルトのフッターが0xFFFFFFFFのです。この値はnull終了を示します。

あなたのRAMでは、最も古いブロックへのポインタと、最も古い項目に最新のブロックとポインタと最新のアイテムを保存する必要があります。電源投入時に、あなたはすべてのブロックが関連ブロックを見つけると、このメンバーをロード越えるます。

あなたは新しいアイテムを保存したい場合は、最新のブロックは、この項目のために十分なスペースが含まれている場合は、

、あなたは確認してください。それがない場合は、前の項目の最後にアイテムを保存し、変更が以前のフッターがこのアイテムを指すように。それは十分なスペースが含まれていない場合は、最も古いブロックを消去する必要があります。あなたは、このブロックを消去する前に、このブロックの最初の項目にポイントするために、次のブロックと最も古いアイテムを指すように最も古いブロック部材(RAM)を変更します。 そして、あなたはこのブロックで新しいアイテムを保存して、このアイテムを指すように、最新のアイテムのフッターを変更することができます。

私は説明が複雑に聞こえるかもしれませんが、プロセスは非常に簡単です、あなたはそれが正しい書く場合はそれもパワー(常に書き込みの順番を気にあなたに保つ)フェールセーフ作ることができることを。知っています

ご注意バッファの円形度は、フラッシュメモリに保存されますが、フラッシュは、あなただけは、ヘッダーやアイテムは、これらの項目の順序が何であるかをヘッダブロックに応じて決めることができるアイテムとブロックが含まれていないこと

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