c - 将小块数据写入闪存页面

标签 c memory esp32 flash-memory

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

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

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

我的问题:

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

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

  • 使用某些 asci 字符来表示 block 的结束是正常做法吗? 例如,使用十进制 13(回车符)作为分隔符:
  • 页面

    [ block 1] 13 [ block 2] 13 [ block 3] ........

    页尾

    感谢所有帮助。

    最佳答案

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

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

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

    关于c - 将小块数据写入闪存页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69835156/

    相关文章:

    c - 如何清理C中分配的内存?

    Chrome 应用程序的内存报告

    c - 连接蓝牙时 ESP32 模拟引脚不读取

    i2c - MPU-6050 : Correctly reading data from the FIFO register

    在 Espressif ESP32-LYRATD-MSC 开发板上配置音频编解码器

    c - 在 c unix 中使用 flock(),尝试在另一个进程中打开文件时收到哪种错误?

    php - 在 Linux 环境中从 PHP 脚本运行应用程序时出现问题

    c - 为什么第一次显示777

    linux - Linux 上的 mlock() vs shmctl(SHM_LOCK)?

    Python - GAE - 脚本循环消耗大量内存