将小块数据写入闪存页面

Posted

技术标签:

【中文标题】将小块数据写入闪存页面【英文标题】: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 页)

我的问题:

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

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

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

页面

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

页尾

感谢所有帮助。

【问题讨论】:

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

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

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

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

【讨论】:

以上是关于将小块数据写入闪存页面的主要内容,如果未能解决你的问题,请参考以下文章

通过调用SPIFFS闪存文件系统建立网络服务器页面

您如何在内存非常有限的嵌入式系统上处理大数据传输?

stm32L476 - 擦除闪存

什么是现代 SSD 的原子写入单元?

将小 PySpark DataFrame 写入镶木地板时出现内存错误

如何在 STM32F4、Cortex M4 上写入/读取 FLASH