まず、ブロック管理:
各ブロックの先頭に小さいヘッダーを配置します。「最も古い」と「最も新しい」を追跡する必要がある主なものは、kを法として単純にインクリメントするブロック番号です。kは、ブロックの総数よりも大きくする必要があります。理想的には、kをMAX値(たとえば0xFFFF)より小さくして、消去されたブロックが何であるかを簡単に見分けられるようにします。
起動時に、コードは各ブロックのヘッダーを順番に読み取り、n i + 1 =(n i + 1)MODULOkであるシーケンスの最初と最後のブロックを見つけます。消去されたブロック(ブロック番号は0xFFFFなど)または何らかの理由で破損したデータ(不完全な消去など)によって混乱しないように注意してください。
各ブロック内
各ブロックは最初は空で始まります(各バイトは0xFFです)。各レコードは、単純に次々に書き込まれます。固定サイズのレコードがある場合は、単純なインデックスを使用してアクセスできます。可変サイズのレコードがある場合、それを読み取るには、ブロックの先頭からリンクリストスタイルでスキャンする必要があります。
可変サイズのレコードが必要であるが、線形スキャンを避けたい場合は、各レコードに明確に定義されたヘッダーを設定できます。たとえば、レコード区切り文字として0を使用し、各レコードをCOBSエンコード(またはCOBS / Rエンコード)します。または、選択したバイトを区切り文字として使用し、各レコードで発生する場合はそのバイトを「エスケープ」します(PPPプロトコルと同様)。
起動時に、最新のブロックがわかったら、最新のレコードの線形スキャンを実行できます。または、固定サイズのレコードまたはレコード区切り文字がある場合は、バイナリ検索を実行できます。
スケジュールを消去する
一部のフラッシュメモリチップでは、ブロックの消去にかなりの時間がかかる場合があります(例:5秒)。少し「前もって」バックグラウンドタスクとして消去をスケジュールすることを検討してください。たとえば、現在のブロックがx%いっぱいになったら、次のブロックの消去を開始します。
レコード番号
レコードに番号を付けることをお勧めします。私が過去に行った方法は、各ブロックのヘッダーに最初のレコードのレコード番号を入れることです。次に、ソフトウェアはブロック内の各レコードの数をカウントし続ける必要があります。
チェックサムまたはCRC
破損したデータ(予期しない電源障害による不完全な書き込みまたは消去など)を検出する場合は、各レコードに、場合によってはブロックヘッダーにチェックサムまたはCRCを追加できます。ブロックヘッダーCRCは、新しいレコードが書き込まれるたびに再書き込みできないため、レコードではなくヘッダー自体のみをカバーすることに注意してください。