一連のログ エントリをフラッシュ メモリ デバイスの循環バッファに保存したいと考えています。
フラッシュ デバイスにはオンボード ウェア レベリングがないため、ロギング コードで処理する必要があります。循環バッファーは実装の一部としてこれを行いますが、整数オーバーフローの問題に悩まされています。
私がやろうとしているのは、フラッシュ領域を次のような領域に分割することです:
char index;
char checksum;
char logdata[512-(sizeof(char)*2))];
Index = 0xFF は「消去」を意味します。したがって、ID の範囲は 0x00 から 0xFE (ゼロから 254) です。つまり、インクリメント ルールは次のとおりです。
id = (last_id + 1) % 255
フラッシュが始まると、次のようになります (ID のみを表示)。
FF FF FF FF FF
最初の空のブロック (インデックス ゼロ) を選択し、最初のログ エントリに書き込みます。
00 FF FF FF FF
これは、エントリが消去されなくなるまで続きます。
00 01 02 03 04
番号が最も小さいブロックを選択したら、それを消去して新しいデータで上書きします。
05 01 02 03 04
しかし、8 ビット ID がオーバーフローすると、悪いことが起こります。
FA FB FC FD FE
00 FB FC FD FE (OK)
01 FB FC FD FE (Not OK - should have overwritten "FB"!)
02 FB FC FD FE (Stuck writing the first block over and over)
これは、最初のブロックがすべての書き込みに使用されていることを意味し、回避したい「不均一な書き込み」シナリオに戻ります。私がやりたいことは、この場合は「FB」である最も古いブロックを見つけることです。
これが私が現時点で持っているコードです(Pythonで):
buf = [0xFF]*5
for i in range(260):
note = ""
slot = None
# Find first erased slot
for x in range(len(buf)):
if buf[x] == 0xFF:
slot = x
break
if slot is None:
# No erased slots, find lowest numbered slot
n = 0xFF
for x in range(len(buf)):
if buf[x] < n:
n = buf[x]
slot = x
# Debug output
print ''.join(["%02X " % x for x in buf])
# Write new block
buf[slot] = i % 255
整数オーバーフローのケースを正しく処理するにはどうすればよいですか?