Embedded Flash中的循环缓冲区

Embedded Flash中的循环缓冲区,embedded,queue,circular-buffer,flash-memory,Embedded,Queue,Circular Buffer,Flash Memory,我需要在闪存芯片中以循环队列存储不同长度的项目。每个项目都有它的封装,所以我可以计算出它有多大以及下一个项目从哪里开始。当缓冲区中有足够的项时,它将换行到开头 在闪存芯片中存储循环队列的好方法是什么? 我可能会储存数万件物品。因此,从缓冲区的开头开始并读取到结尾并不理想,因为搜索到结尾需要时间 另外,因为它是循环的,所以我需要能够区分第一项和最后一项 最后一个问题是,这是存储在闪存中的,因此擦除每个块既耗时又只能对每个块执行设定次数。我想我现在明白了。似乎你最大的问题是,在填满可用的录音空间后,

我需要在闪存芯片中以循环队列存储不同长度的项目。每个项目都有它的封装,所以我可以计算出它有多大以及下一个项目从哪里开始。当缓冲区中有足够的项时,它将换行到开头

在闪存芯片中存储循环队列的好方法是什么?

我可能会储存数万件物品。因此,从缓冲区的开头开始并读取到结尾并不理想,因为搜索到结尾需要时间

另外,因为它是循环的,所以我需要能够区分第一项和最后一项


最后一个问题是,这是存储在闪存中的,因此擦除每个块既耗时又只能对每个块执行设定次数。

我想我现在明白了。似乎你最大的问题是,在填满可用的录音空间后,接下来会发生什么?新数据应该覆盖最旧的数据,我相信这就是你所说的循环缓冲区。但由于数据不是固定长度的,您可能会覆盖多条记录

我假设长度的变化量足够大,以至于不能将所有内容填充到固定长度

写入段需要跟踪表示下一条记录开始写入的地址。如果您提前知道要写入的块的大小,则可以判断是否将在逻辑缓冲区的末尾结束,并在“0”处重新开始。我不会把一张唱片分成结尾和开头两部分

一个单独的寄存器可以跟踪开始;这是尚未被覆盖的最旧数据。如果你去读取数据,这就是你要开始的地方

然后,给定写入开始地址和要提交的数据长度,数据写入器将检查是否应该撞击读寄存器,读寄存器将检查第一个块并查看长度,并前进到下一个记录,直到有足够的空间写入任何数据。在写入数据的末尾和最旧数据的开头之间,可能存在垃圾数据的间隙。但通过这种方式,您可以只编写一两个地址作为开销,而不是重新排列块

至少,我可能会这么做。HTH

我看到三个选项:

选项1:将所有内容填充到相同的大小,这很简单,存储一个指向缓冲区头部和尾部的指针,以便您知道从何处写入和从何处开始读取,使用每个对象的大小获得到下一个对象的偏移量,这意味着您需要像链接列表一样横切缓冲区,如果你需要5000号物品,速度会很慢

选项2:只在循环缓冲区中存储指向真实数据的指针,这样当您循环时就不必处理大小不匹配的问题。如果将真实数据存储在循环缓冲区中,而不将其填充,则可能会遇到这样的情况,即使用一个新数据对象过度编写多个项,我认为这是不正确的

将实际数据存储在闪存中的其他位置,大多数闪存都内置了某种磨损均衡功能,如果这样,您就不必担心多次覆盖同一位置,IC将找出实际存储在芯片上的位置,只需写入下一个可用的可用空间即可

这意味着您需要为循环缓冲区选择一个最大大小,具体操作方式取决于数据的可变性。如果数据的大小变化很大,比如说只有几个字节,那么您应该将其填充并使用选项1。如果大小变化剧烈且不可预测,请选择最大的大小,并计算出闪存中适合该大小的对象的数量,将其用作缓冲区中的最大条目数。这意味着你浪费了很多空间


选项3:如果对象真的可以是任意大小,那么在您应该只使用文件系统的时候,请按顺序命名文件,并在您完全记住时返回。如果您的新条目很大,则可能需要删除多个旧条目以适应它。这实际上只是选项2的扩展,因为选项2在许多方面都是一个简单的文件系统。

保留一个单独的块,其中包含指向第一条记录开始和最后一条记录结束的指针。您还可以保留更多信息,如记录总数等

在最初耗尽空间之前,添加记录非常简单,只需将它们写入缓冲区的末尾并更新尾部指针即可

当您需要回收空间时,请删除足够的记录,以便适合当前记录。删除记录时更新头指针

您需要跟踪释放了多少额外空间。如果保留指向最后一条记录末尾的指针,下次需要添加记录时,可以将其与指向第一条记录的指针进行比较,以确定是否需要删除更多记录


此外,如果这是NAND,您或闪存控制器将需要执行解块和磨损均衡,但这都应该位于比为循环缓冲区分配空间更低的层。

首先,块管理:

在每个块的开头放一个较小的标题。跟踪“最旧”和“最新”的主要内容是块编号,它只是增加模kk必须大于块的总数。理想情况下,使k小于最大值(例如0xFFFF),这样您就可以很容易地判断什么是已擦除的块

在启动时,您的代码依次读取每个块的头,并按ni+1=(ni+1)模k的顺序定位第一个和最后一个块。注意不要被擦除的块(块编号为0xFFFF)或以某种方式损坏的数据(如不完全擦除)弄糊涂

在每个块内