【问题标题】:Writing small chunks of data to flash memory page将小块数据写入闪存页面
【发布时间】:2021-12-18 10:35:03
【问题描述】:

我有一个应用程序,我必须将数据块保存到闪存中。使用的闪存: https://datasheet.datasheetarchive.com/originals/dk/DKDS-24/460477.pdf

在数据表中,提到我无法写入已经写入的页面(即使它是半空的)。我想要一些关于管理写入内存的最佳方法的建议?

  • 我正在写入 25 个字节的块。
  • 总页面大小为 256 字节
  • 总页数 16,384
  • 最小擦除扇区:4KB(16 页)

我的问题:

  1. 我能想到的管理内存的唯一方法是拥有一个 4KB 的缓冲区,每次我想写一些数据时,读取最后 16 页的数据并将其保存在缓冲区中。然后我可以擦除该扇区并重写以前的数据以及一个新块。这是最常见的做法吗?还有其他更好的方法吗?

我能想到的唯一其他方法是每页简单地写入 1 块数据,这听起来完全浪费内存。但考虑到我有 16384 个页面可用,保存 16384 个数据块对于我的应用程序来说可能绰绰有余。

  1. 使用一些 asci 字符来表示块的结束是正常的做法吗? 例如使用 Decimal 13(回车)作为分隔符:

页面

[CHUNK1] 13 [CHUNK2] 13 [CHUNK3] ........

页尾

感谢所有帮助。

【问题讨论】:

  • 根据第 8.2.13 章,您可以写入以前未写入的字节。是什么让你觉得自己“无法写入已经写入的页面”?
  • 你说得对。我一定在某处读过它。还是谢谢你..我想我会在每页写9块数据
  • 如果您写入已写入的位置,它将与已写入的值进行按位逻辑与。这些位只能被清除。所以限制只是“最小的擦除扇区”。擦除将所有位重置为 1。

标签: c memory esp32 flash-memory


【解决方案1】:

根据第 8.2.13 章,您可以写入以前未写入的字节。因此,您无需读取目标页面即可写入几个字节。只需使用正确的地址并写入块即可。

如果您有固定大小的块,则不需要分隔符,特别是如果每​​个块的内容是二进制的。 ASCII 分隔符是流式数据的解决方案。这将为您每页提供 10 个块。

以防万一您想使用所有空间,您可以编写一个知道如何拆分块以将其写入两个相邻页面的函数。想想某种 HAL,硬件抽象层。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2015-05-20
    相关资源
    最近更新 更多