我想将一系列日志条目存储在闪存设备的循环缓冲区中。
闪存设备没有板载磨损均衡,所以我需要在我的日志代码中处理它。循环缓冲区将作为实现的一部分执行此操作,但我遇到了整数溢出问题。
我打算做的是将闪存区域划分为如下区域:
char index;
char checksum;
char logdata[512-(sizeof(char)*2))];
Index = 0xFF 表示“已擦除”。因此 ID 的范围可以从 0x00 到 0xFE(零到 254)。这意味着增量规则是:
id = (last_id + 1) % 255
当 flash 启动时,它看起来像这样(仅显示 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
如何正确处理整数溢出情况?