【问题标题】:Tracking address when writing to flash写入闪存时的跟踪地址
【发布时间】:2016-02-25 18:08:00
【问题描述】:

我的系统需要将数据存储在 EEPROM 闪存中。字节串将一次一个地写入 EEPROM,而不是一次连续写入。字符串的长度可能会有所不同。我希望从最后一个写入地址继续按顺序保存字符串,而不会浪费任何空间。例如,如果第一个字节串写入地址 0x00~0x08,那么我希望第二个字节串从地址 0x09 开始写入。

如何实现?我发现某些 EEPROM 的写入命令不需要指定地址,只需从最后写入的点继续。但我使用的 EEPROM 不支持。 (我使用的是 Spansion 的 S25FL1-K)。我考虑过分配部分内存来跟踪地址并在每次写入时存储地址,但这可能会更快地磨损闪存。处理这种情况的常用方法是什么?

谢谢。

编辑: 我要问的是如何以非易失性方式跟踪/保存地址,以便下次写入时,我知道要从哪个地址开始。

【问题讨论】:

  • 您阅读数据表了吗?命令以地址开头,然后您可以有 1 到 256 个字节。所以你知道你从哪个地址开始,你知道字符串有多长,所以当你开始另一个命令时,你知道你在页面中的位置,你知道要使用哪个地址。不确定你的问题是什么。无论如何,您必须预先检查字符串长度,以确保您不超过任何限制,无论是部件/页面的限制,还是您使用的 spi 控制器可能对您可以发送的每个命令的字节数有限制等。所以你总是知道起始地址和长度。
  • 您命名的设备不是 EEPROM。它是一个串行 NOR 闪存。
  • @dwelch 数据没有被一个接一个地写入。系统通过蓝牙收集数据,并在空闲时写入闪存,并确认它收集的数据可以安全写入。这可能是在上一次写入之后的一段时间。就像你说的,是的,我知道在写发生的那一刻我在页面上的位置。我要问的是如何记住该地址,以便在下次写入时可以将其用作起始地址。如果我的解释足够清楚,我不是......
  • @BrianMcFarland 两者有什么区别?在 C 中实现时,串行 NOR 闪存是否与 EEPROM 不同?
  • 在字符串之后写入某种文件结束标记。写入下一个字符串时,擦除令牌并在新字符串之后重写它。复位后,在启动过程中,从头开始读取缓冲区,直到找到令牌以确定继续写入的位置。如果字符串是 ASCII,则使用 E​​OF 字符作为标记。如果数据是二进制的,那么设计某种转义序列来识别文件结束标记。

标签: memory embedded flash-memory eeprom


【解决方案1】:

我从未使用过这种特殊的闪存,但我已经实现了类似的东西。不幸的是,如果不知道您的限制/优先级(内存或 CPU 效率、写入发生的频率等),就不可能给出明确的答案。以下是您可能需要考虑的一些技术。我不知道它们是否被广泛使用。

选项 1:在字符串之前写入包含字符串长度的 X 个字节。然后在初始化时你可以解析你的闪存:读取长度 n,向前跳转 n 个字节;读取下一个字节。如果它是空的(根据数据表,所有的都是你的闪存),那么你得到了你的第一个空位。否则你只是读取了下一个字符串的长度,所以再重复一遍。

  • 此方法允许您快速搜索最后使用的扇区,因为已使用扇区的第一个字节保证有值。这里的另一面是每次写入字符串时额外的 n 个字节(取决于最大字符串长度)的开销,并且必须对其进行解析以获取值(尽管这只能在启动时完成一次)。

选项 2:不附加大小,而是附加唯一的“字符串结尾”序列,然后在启动时解析代表空闪存的最后一个序列。

  • 这里的缺点是解析时间较长,但您可能只需为每个字符串节省 1 字节长的开销。

选项 3 正是您已经想到的:分配一个包含您需要的值的单独扇区。为了减少闪存磨损,您还可以背靠背写入这些值,并在每次启动时搜索最后一个值。此外,您可能会考虑您编程的设备的预期寿命与您的闪存可以维持的 100,000 次擦除(再次根据数据表) - 磨损甚至有问题吗?这当然取决于数据的保存频率。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多