在闪存中擦除比扇区大小(最小可擦除大小)更少的字节的最佳逻辑

时间:2014-12-01 17:14:53

标签: c embedded flash-memory

我正在使用Spansion的16MB闪存。扇区大小为256KB。我正在使用闪存来读/写/删除30个字节的块(结构)。我在IC的数据表中发现最小可擦除大小为256KB。删除特定块的一种方法是

  1. 将包含要删除的块的扇区读入临时数组。
  2. 删除该部门。
  3. 删除临时数组中的必需块
  4. 将临时数组写回Flash。
  5. 我想问一下,有没有更好的替代逻辑。

2 个答案:

答案 0 :(得分:7)

无法擦除闪存中的最小可擦除扇区大小。

但是,有一种典型的方法可以处理大型闪存扇区上的小型结构无效。只需添加标题即可指示该结构位置中的数据状态。

简单示例:

  • 0xffff结构已删除并可供使用。
  • 0xa5a5结构包含有效的数据。
  • 0x0000结构包含无效的数据。

删除后标题为0xffff。将新数据写入结构时,将标题设置为0xa5a5。如果不再需要该数据,请将标题设置为0x0000

数据实际上不会被删除,但可以检测为无效。这允许您等到扇区已满,然后清理无效记录并压缩有效记录。

答案 1 :(得分:3)

首先,再次检查设备数据表。通常,Spansion设备可以让您拥有64kB的页面大小而不是256kB。这可能会或可能不会对您有所帮助,但通常增加的粒度将对您有所帮助。

其次,在写入之前你无法避免"擦除"想要将位从0更改为1的循环。但是,您始终可以逐个字节地将位从1更改为0。

您可以重新考虑当前的3字节结构,看看这对您是否有用,或者转移到32字节大小的结构(这是2的幂,因此更加理智的IMO)。然后,要删除,您只需将第一个字节从0xFF设置为0x00,将正常擦除的字节设置为0x00。这意味着你最终会得到空位。

与垃圾收集器的工作原理类似,您可以重新组织以移动已删除块的任何页面,以便创建空页面(完整的已删除块)。在从原始页面删除好块之前,请务必将好块移动到空白页面!然后,您可以删除已经删除或重新组织的空白页面。

当您使用闪存时,您必须考虑您的读取/擦除/写入策略以使用您可用的闪存。在开始编码或锁定内存结构之前一定要解决它,因为通常你需要保留至少一个字节作为有效字节,通常你必须利用这样一个事实:你总是可以改变位是在没有擦除周期的情况下,任何字节都可以设置为1到0。