2014-01-16 22 views
1

我正在处理一个问题,其中三个内存页面可用,并且数据应该写入其中一个页面。算法找到最新的n值

要保留历史记录,数据首先写入第一页,如果数据已满,则应使用下一页。最后,最后一页也已满,所以我们必须删除第一页中的数据并使用第一页。等等...

我怎么知道哪个网页是'最古老的'?我如何确定要擦除的内容?

我认为需要一个计数器,并且每次使用新页面时该计数器都会递增。在开始时读取计数器值以查找哪个页面是最新的,然后下一个页面是最老的(自圆形方法)。但是,最终计数器将溢出,计数器重新启动,并且无法确定哪个值最高(因为新值为0)。

实施例:

  • 0 0 0(从开始)(使用页0)
  • 1 2 0(使用第1页)
  • 1 2 3(第2页是使用使用)
  • 4 2 3(页0)用于
  • 4 5 3(第1页)
  • ...
  • 255 0 254(我不知道...)

问题是否清楚?否则,我可以尝试重新解释。

+2

为什么不简单地更新值与旧值+ 1模3? – Thijser

回答

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?

+0

嗨,谢谢你的回答。我正在尝试此算法,并且我的测试在此处停止: 255 0 1(0!= 255 + 1)=> TRUE。但是应该使用'1'。 你有什么想法? – perz

+0

@ user3201357我不认为你可以拥有255,0,1。它应该是255,0,254。你可以使计数器的类型变成8位(比如char)。这样,如果你加1到255,它应该自动回滚到0。否则你总是有模运算符。 –

+0

我错了。我忘了(无符号字符)类型的演员。对不起我的错误。 – perz

0

您使用循环缓冲区的想法是一个好主意。除此之外,你所需要的只是索引,一个指向最旧的页面,一个指向最新的页面。无论何时添加或替换页面,都需要更新这些索引。

您需要的原因是,在开始时 - 直到缓冲区已满 - 只有其中一个将前进,而另一个将保持静止。

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; 
  • 这样,你知道百达哪些页面是
  • PA GE 0八方通最早的数据
  • 第1页八方通旧数据
  • 第2个八方通实际数据
  • 它很容易扩展到任意数量的,而不是ADRESS你可以存储页码
  • 网页...使用什么更适合您的任务