ロープデータ構造
ロープのデータ構造に魅了されました。ほんの数バイトのRAMが巨大なフラッシュメモリにフックされているマイクロコントローラーに適用しようとしている趣味のプロジェクトがあるので、巨大なテキストファイルの可変長テキストを挿入および削除したり、その他の方法で任意に編集したりできます。テキストファイルが大きすぎてRAMに収まりません。マルチメガバイトのテキストファイルの途中で文字を挿入または削除するたびに、ファイルの後半を消去してフラッシュに再書き込みし、1バイトずつシフトするのは非常に遅くなりますが、データ構造はロープですこれをはるかに速く行うことができます。ロープデータ構造は、このような可変ランダムアクセス可変長ファイルを不変の固定長部分として表すことができるため、フラッシュメモリに適しているようです。すべての編集は、循環ログのような方法で書き込まれます。悲しいかな、すべてのバグが私のコードでまだ解決されていません。:-(
固定長の時系列ログ
開発を支援した製品について、私は同様の循環ログシステムを動作させました。
固定長のレコードを次々に書き込んで、フラッシュを循環配列として埋めていきました。
(完全に空白のフラッシュを使用して、配列の最後の約3ブロック前にレコードの書き込みを開始したため、データのレコードが数レコードだけ格納された後で循環ラップアラウンドをテストできました。私のラップアラウンドコードにバグがあることを知る前に書き込まれる1か月分のデータ。
少なくとも2つの消去済み「消去ブロック」が書き込まれる準備ができていることを確認しました。レコードを書き込んだ後、その後に空の「消去済みブロック」が2つしかなかった場合、無条件に最も古いデータブロックを消去しました。2つの「消去済みブロック」の後の最も古いデータの3番目のブロックです。(フラッシュメモリの終わり近くにある「後」とは、「フラッシュメモリの最初に戻る」ことを意味します。(おそらく、単一の消去済みブロックで十分だったでしょう。少なくとも2つ、時には3つ必要だと思った理由を忘れています) 。
各「消去ブロック」に記録したレコード数を正確に忘れてしまいましたが、2つの消去ブロックにまたがるレコードがないことを確認しました。フラッシュのすべての消去ブロックの最初の2バイトは、「消去済み」値0xFFFF、または各レコードのヘッダーにあるFletcher-16チェックサムの最初の2バイト(決して0xFFFFではない)。
これにより、次に電源を入れたときにすばやくスキャンして循環ログの先頭を見つけることができました。「消去済み」ブロックと「データ」ブロックを区別するために、各消去ブロックの最初の2バイトを調べるだけで済みました。(「ブロックの消去中の電源障害」が原因で最初の2バイトが0xFFFFに消去されるのを少し心配しましたが、消去されていないバイトをブロックの中央に残していたので、マイクロコントローラーがチェックするコードを書きましたこのため、「ブロックの消去」プロセスを再開します。
他のフラッシュ対応のデータ構造またはファイルシステムを見つけたら教えてください。