我正在尝试开发一个报警历史记录结构,以存储在非易失性闪存中。闪存的写周期数量有限,因此我需要一种方法来向结构添加记录,而无需每次都重写结构中的所有闪存页,或者写出更新指针到队列的头尾。
此外,一旦使用了可用的闪存空间,我想开始覆盖先前存储在闪存中的记录,首先添加先进先出的第一条记录。这让我觉得循环缓冲区最适合添加项目。但是,在查看记录时,我希望结构像堆栈一样工作。例如。记录将以倒数先后顺序反向显示。
结构大小,头部,尾部,索引除非存储在记录本身中,否则无法存储,因为如果每次将它们写入固定位置,它将超过存储它们的页面上的最大写入周期。
那么我应该使用堆栈,队列还是某种混合结构?如何在闪存中存储磁头,尾部和尺寸信息,以便在上电后重新初始化?
答案 0 :(得分:5)
查看相关问题Circular buffer in Flash。
答案 1 :(得分:4)
假设您可以计算出哪个是最后一个条目(从时间戳等,所以不需要写标记),这也具有最佳的磨损均衡性能。
答案 2 :(得分:2)
编辑:不适用于OP的闪存控制器:您不必担心代码中的wear leveling。闪存控制器应该在幕后处理。
但是,如果您仍想继续执行此操作,只需使用常规循环缓冲区和堆栈的keep pointers to the head and tail。
您还可以考虑使用Least Recently Used cache来管理闪存存储数据的位置。
答案 3 :(得分:0)
你肯定想要一个环形缓冲区。但你是对的,元信息有点......有趣。
答案 4 :(得分:0)
在几个部分中映射您的条目。当部分已满时,从第一部分开始覆盖。添加序列号(nbr序列号> 2 *条目),因此在重新启动时,您知道第一个条目是什么。
答案 5 :(得分:0)
您可以使用环形缓冲区的一个版本,其中存储在页面中的第一个元素是该页面已被写入的次数。这允许您通过查找数字低于上一页的第一页来确定下一步应该写入的位置。如果它们完全相同,则从头开始使用下一个数字。