0

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

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

谢谢。

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

4

1 回答 1

0

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

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

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

选项 2:而不是预先设置大小,附加唯一的“字符串结尾”序列,然后在引导时解析最后一个序列,在表示空闪存的序列之前。

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

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

希望有帮助。

于 2016-02-29T04:31:20.117 回答