gpt4 book ai didi

embedded - Flash 中的循环缓冲区

转载 作者:行者123 更新时间:2023-12-04 10:13:10 26 4
gpt4 key购买 nike

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

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

我可能要存储数以万计的元素。所以从头开始读到缓冲区的结尾并不理想,因为搜索到结尾需要时间。

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

最后一个问题是它存储在闪存中,因此删除每个块既费时又只能为每个块执行一定次数。

最佳答案

一、区块管理:

在每个块的开头放置一个较小的标题。您需要跟踪“最旧”和“最新”的主要内容是块号,它只是模数 递增。 k . k 必须大于您的块总数。理想情况下,制作 k 小于您的 MAX 值(例如 0xFFFF),因此您可以轻松分辨什么是删除块。

在启动时,您的代码依次读取每个块的 header ,并在 ni+1 = (ni + 1) MODULO k 的序列中定位第一个和最后一个块。注意不要被删除的块(块号例如 0xFFFF)或以某种方式损坏的数据(例如不完全删除)混淆。

每个区块内

每个块最初都是空的(每个字节都是 0xFF)。每条记录只是一个接一个地写入。如果您有固定大小的记录,那么您可以使用一个简单的索引来访问它。如果您有可变大小的记录,那么要读取它,您必须从块的开头进行扫描,链接列表样式。

如果您想拥有可变大小的记录,但要避免线性扫描,那么您可以在每条记录上都有一个明确定义的 header 。例如。使用 0 作为记录分隔符,以及 COBS -encode(或 COBS/R -encode)每条记录。或者使用您选择的字节作为分隔符,如果它出现在每个记录中,则“转义”该字节(类似于 PPP protocol )。

在启动时,一旦您知道您的最新区块,您就可以对最新记录进行线性扫描。或者,如果您有固定大小的记录或记录分隔符,您可以进行二分查找。

删除调度

对于某些闪存芯片,删除一个块可能需要很长时间——例如5秒。考虑将删除安排为“提前”一点的后台任务。例如。当当前块已满 x% 时,则开始删除下一个块。

记录编号

您可能想要对记录进行编号。我过去的做法是在每个块的头部放置第一条记录的记录号。然后软件必须对块内每条记录的数量进行计数。

校验和或 CRC

如果您想检测损坏的数据(例如,由于意外断电而导致的不完整写入或删除),那么您可以向每条记录添加校验和或 CRC,或许还可以添加到块头。请注意,块头 CRC 只会覆盖头本身,而不是记录,因为在写入每个新记录时无法重新写入。

关于embedded - Flash 中的循环缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1669245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com