2009-11-18 134 views
5

我试图开发一个报警历史结构存储在非易失性闪存中。闪存的写周期数量有限,所以我需要一种方法来向结构添加记录,而不必每次都重写结构中的所有闪存页面,或者写出更新的指向队列头部/尾部的指针。报警历史堆栈或队列?

此外,一旦可用闪存空间已被使用,我想要开始覆盖以前存储在闪存中的记录,并以先入先出的先记录开始。这使我认为循环缓冲区对于添加项目最有效。但是,在查看记录时,我希望结构像堆栈一样工作。例如。记录将按逆时间顺序显示后进先出。

结构大小,头部,尾部索引不能存储,除非它们存储在记录本身中,因为如果它们每次写出到固定位置,它将超过它们存储在页面上的最大写周期。

所以我应该使用堆栈,队列还是一些混合结构?我应该如何将头部,尾部,尺寸信息存储在闪存中,以便在加电后可以重新初始化?

+0

您是直接在闪存上工作还是在闪存上使用文件系统? – stefaanv 2009-11-18 19:44:05

+0

没有文件系统。直接写入闪存。 – mjh2007 2009-11-18 19:48:21

回答

4

查找ring-buffer

假设你可以工作,这是最后一个条目(从时间标记等等这样就不需要写标记),这也具有最好的损耗均衡的性能。

2

编辑:不适用于OP的闪存控制器:您不必担心代码中的wear leveling。闪存控制器应该在幕后处理这个问题。

但是,如果您仍想继续操作,只需使用常规循环缓冲区和keep pointers to the head and tail的堆栈。

您也可以考虑使用Least Recently Used cache来管理闪存的存储位置。

+0

这不完全是磨损平衡。他需要尽可能少地专注于写作。 – 2009-11-18 19:47:07

+0

我很确定闪存控制器不提供损耗均衡。我正在使用AT45DB642D。 – mjh2007 2009-11-18 19:47:18

+0

@ mjh2007:你说得对,控制器在其规格手册中似乎没有任何特殊的管理。 – 2009-11-18 19:52:39

0

你绝对需要一个环形缓冲区。但是你是对的,元信息有点...有趣。

0

将您的输入映射到多个部分。当部分已满时,从第一部分开始覆盖。添加序列号(nbr序列号> 2 *条目),因此在重新启动时,您知道第一个条目是什么。

0

你可以做一个环形缓冲区的版本,其中存储在页面中的第一个元素是该页面被写入的次数。通过查找数字低于上一页的第一页,您可以确定下一个应该写的位置。如果他们都是一样的,你从下一个数字开始。