我正在解决一个问题,即有三个内存页面可用,而且数据应该写在其中一个页面中。
要保留历史记录,首先将数据写入第1页,当该数据已满时,应使用下一页。最后,最后一页也已满,所以我们必须删除第一页中的数据并使用第一页。等等...
我怎么知道哪个页面是'最老的'?如何确定要删除的内容?
我认为需要一个计数器,每次使用新页面时此计数器都会递增。在开始时读取计数器值以查找哪个页面是最新的,然后下一页是最旧的(从循环方法开始)。但是,最终计数器将溢出,计数器重新启动,并且无法确定哪个值最高(因为新值为0)。
示例:
问题是否清楚?否则我可以尝试重新解释。
答案 0 :(得分:0)
您使用循环缓冲区的想法很好。除此之外,您还需要索引,一个指向最旧的页面,一个指向最新的页面。无论何时添加或替换页面,都需要更新这些索引。
你需要的原因是在开始时 - 直到缓冲区已满 - 只有其中一个会前进而另一个将保持静止。
答案 1 :(得分:0)
这是 EEPROM耗损均衡中使用的技术。这个概念是因为EEPROM通常具有有限的写入/擦除周期,我们可以平衡存储器中的磨损,从而有效地延长寿命。由于EEPROM中的数据即使在断电时也会保留在控制器中,因此我们可能需要在EEPROM上定期存储某些变量的日志值以供进一步使用。
您可以遵循的一个简单方法是,根据评论中的建议,您可以通过保持计算来更新计数器(计数器模3)。
其他(更一般)方法是为计数器设置三个寄存器。每当您必须写入页面时,首先扫描这三个寄存器并检查(C[i] != C[i-1] + 1)
0 0 0
1 0 0 // 1 to 0
1 2 0 // 2 to 0
1 2 3 // 3 to 1
4 2 3 // 4 to 2
...
255 0 254 // 0 to 254.
此链接提供了有关此主题的更多信息:Is there a general algorithm for microcontroller EEPROM wear leveling?
答案 2 :(得分:0)
我这样做这样的周期:
// init
int page0=adress of page0; // oldest data
int page1=adress of page1; // old data
int page2=adress of page2; // actual data (page for write)
// after page 2 is full
int tmp;
tmp=page0;
page0=page1;
page1=page2;
page2=tmp;