5

我正在尝试开发一种警报历史结构以存储在非易失性闪存中。闪存的写入周期数有限,因此我需要一种方法来将记录添加到结构中,而无需每次都重写结构中的所有闪存页面或写出指向队列头/尾的更新指针。

此外,一旦使用了可用的闪存空间,我想开始覆盖以前存储在闪存中的记录,从添加的第一条记录开始,先进先出。这让我认为循环缓冲区最适合添加项目。但是,在查看记录时,我希望结构像堆栈一样工作。例如,记录将按时间倒序显示,后进先出。

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

那么我应该使用堆栈、队列还是某种混合结构?我应该如何将头部,尾部,大小信息存储在闪存中,以便在上电后可以重新初始化?

4

6 回答 6

5

请参阅相关问题Circular buffer in Flash

于 2009-11-18T19:46:46.113 回答
4

查找环形缓冲区

假设您可以计算出哪个是最后一个条目(来自时间戳等,因此不需要写标记),这也具有最佳的磨损均衡性能。

于 2009-11-18T19:41:48.060 回答
2

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

但是,如果您仍想继续执行此操作,只需使用常规循环缓冲区,并保留指向堆栈头部和尾部的指针。

您还可以考虑使用最近最少使用的缓存来管理闪存上存储数据的位置。

于 2009-11-18T19:43:57.550 回答
0

你肯定想要一个环形缓冲区。但你是对的,元信息有点……有趣。

于 2009-11-18T19:49:22.437 回答
0

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

于 2009-11-18T19:59:26.480 回答
0

你可以做一个环形缓冲区的版本,其中存储在页面中的第一个元素是该页面被写入的次数。这使您可以通过查找数字低于前一页的第一页来确定接下来应该在哪里写。如果它们都相同,则从下一个数字开始。

于 2009-11-18T20:00:43.840 回答