Flash中的循环缓冲区

2023-11-24

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

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

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

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

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


一、区块管理:

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

At start-up, your code reads the headers of each block in turn, and locates the first and last blocks in the sequence that is ni+1 = (ni + 1) MODULO k. Take care not to get confused by erased blocks (block number is e.g. 0xFFFF) or data that is somehow corrupted (e.g. incomplete erase).

每个区块内

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

如果您想要具有可变大小的记录,但避免线性扫描,那么您可以在每个记录上有一个明确定义的标题。例如。使用 0 作为记录分隔符,并且COBS-编码(或COBS/R-编码)每条记录。或者使用您选择的字节作为分隔符,如果该字节出现在每个记录中,则“转义”该字节(类似于点对点协议).

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

擦除调度

对于某些闪存芯片,擦除一个块可能会花费大量时间 - 例如5秒。考虑将擦除安排为稍微“提前”的后台任务。例如。当当前块已满 x% 时,则开始擦除下一个块。

记录编号

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

校验和或 CRC

如果您想检测损坏的数据(例如,由于意外电源故障而导致的不完整写入或擦除),那么您可以向每个记录(也许还有块头)添加校验和或 CRC。请注意,块头 CRC 仅覆盖头本身,而不覆盖记录,因为写入每个新记录时无法重写它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flash中的循环缓冲区 的相关文章

  • 原子地从 ConcurrentQueue 中获取所有内容

    我有多个线程生成项目并将它们粘贴在一个公共的ConcurrentQueue private ConcurrentQueue
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 如何获取队列中的第 n 个项目?

    我的应用程序中有许多队列和优先级队列 我想轻松访问这些队列中的第 n 个项目 但没有看到使用 API 实现此目的的简单方法 我想我可以创建一个Iterator并迭代到第 n 个元素或使用toArray index 但似乎应该有一个更简单的方
  • CC2538 的 Contiki UDP 数据包传输持续时间

    有人可以解释一下 Contiki OS 传输 UDP 数据包时发生了什么吗 以下是我的设备使用 CC2538 芯片运行时的详细电流消耗 我的问题是 既然理论上在 250kbps 下 408 位长度的数据包应该在大约 2ms 内传输 为什么要
  • 在嵌入式 Jetty 上使用 DefaultServlet 提供静态 html 文件

    我正在开发一个需要独立的项目 因此我决定将 Jetty 嵌入到我的应用程序中 我将提供静态 HTML 页面 一些 JSP 页面 并且还将使用一些自定义 servlet 我找到了一个完美的示例 说明如何设置嵌入式 Jetty 来完成所有这一切
  • 从队列更新活动的最佳方法

    我有一个LinkedBlockingQueue在我的 生产者 调解者 消费者 模型中的调解者中 Producer 首先更新将 Mediator 添加到 ActivityQueue 中 接下来 消费者 活动在队列中等待 侦听并获取下一个项目
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 用于嵌入式系统的简约人类可读序列化格式解析器

    By 人类可读的序列化格式 I mean YAML JSON INI或喜欢 请注意 XML对于我的目的来说太冗长而且太不方便 所以让我们把它作为最后的手段 格式应将数据存储为 命名键 值 配对并允许嵌套和数组 不过 缺少数组并不重要 此外
  • C#:将对象添加到队列时触发事件

    每当一个对象被添加到一个对象时 我需要能够触发一个事件Queue
  • ARM Cortex-M3 启动代码

    我试图了解 STM32 微控制器的 Keil realview v4 附带的初始化代码是如何工作的 具体来说 我试图了解堆栈是如何初始化的 In the 文档 http infocenter arm com help index jsp t
  • ArrayDeque 和 LinkedBlockingDeque

    只是想知道为什么他们做了一个LinkedBlockingDeque而同一个非并发对应物是ArrayDeque它基于可调整大小的数组 LinkedBlockingQueue使用一组节点 例如LinkedList 尽管没有实施List 我知道可
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • NAND 闪存编程:写入粒度?

    有人了解当今大型 NAND 闪存芯片的写访问吗 写入的最小粒度是多少 我这里有一个微控制器闪存 需要输入至少 1 个 最多 4 个字 即 16 位字 立即写入状态机 我认为大 gt 1 Gbit 闪存 由于写入性能原因 此处的行为有所不同
  • 嵌入式开发系统中JTAG的一般工作流程?

    在我的嵌入式项目中 我使用 JTAG 接口下载代码并调试下载的应用程序 但我不知道 JTAG 设置内部发生了什么 任何人都可以给我 JTAG 设置的基本想法 流程 高级视图 这将真正帮助我更好地理解我的开发系统 为了添加克利福德的答案 这里
  • Jenkins - 如何暂停排队作业的运行并让新构建优先

    詹金斯任何版本 我有两个版本 1 642 3 或 2 32 3 我有一份詹金斯工作jobA 我们假设此作业将工件部署到目标部署服务器 它需要 2 个参数 工件名称和目标部署服务器 执行并发构建当前已禁用 即未选中 假设我手动启动了此作业的多
  • 如何将张量推送到 TensorFlow 队列并从另一个进程中提取它们?

    我有一个 TensorFlow 集群已启动并正在运行 我正在尝试使用一个客户端进程将数据入队 并将其从另一进程中出队 我无法让它工作 我做错了什么 这是我的推送数据的程序 queue push py import tensorflow as
  • 在 C/C++ 中除了使用 % (模数)之外还有其他选择吗?

    我曾经在某处读到 模数运算符在小型嵌入式设备 例如没有整数除法指令的 8 位微控制器 上效率低下 也许有人可以证实这一点 但我认为差异比整数除法运算慢 5 10 倍 除了保留计数器变量并在 mod 点手动溢出到 0 之外 还有其他方法可以做
  • 从 SQS FIFO 队列中删除消息:接收句柄已过期

    我切换到 FIFO 队列 当我尝试从队列中删除消息时收到此错误消息 Value VALUE for parameter ReceiptHandle is invalid Reason The receipt handle has expir

随机推荐