Memory 写入闪存时跟踪地址

Memory 写入闪存时跟踪地址,memory,embedded,flash-memory,eeprom,Memory,Embedded,Flash Memory,Eeprom,我的系统需要将数据存储在EEPROM闪存中。字节串将一次写入一个EEPROM,而不是一次连续写入。弦的长度可能不同。我希望通过从最后一个写入地址继续,在不浪费任何空间的情况下按顺序保存字符串。例如,如果第一个字节串写入地址0x00~0x08,那么我希望第二个字节串从地址0x09开始写入 如何实现这一目标?我发现一些EEPROM的写入命令不需要指定地址,只是从最后一个写入点继续。但我使用的EEPROM不支持这一点。(我使用的是Spansion的S25FL1-K)。我考虑分配部分内存来跟踪地址,并在

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

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

谢谢

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

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

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

  • 此方法允许您快速搜索最后使用的扇区,因为已使用扇区的第一个字节保证有一个值。另一方面,每次写入字符串时都会额外增加n字节的开销(取决于最大字符串长度),并且必须对其进行解析才能获得值(尽管这只能在引导时执行一次)
选项2:不要预先设置大小,而是附加唯一的“字符串结束”序列,然后在引导时解析表示空闪存的序列之前的最后一个序列

  • 这里的缺点是较长的解析时间,但每个字符串可能只需要1字节的开销
选项3正是您已经想到的:分配一个包含您所需价值的单独部门。为了减少闪存磨损,您还可以背靠背写入这些值,并在每次启动时搜索最后一个值。此外,您可能会考虑设备的预期寿命,您的程序与100000擦除您的闪存可以维持(再次根据数据表)-甚至是一个问题?这当然取决于数据保存的频率


希望能有所帮助。

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