我正在使用 Spansion 的 16MB 闪存。扇区大小为 256KB。我正在使用闪存读取/写入/删除 30 字节块(结构)。我在 IC 的数据表中发现最小可擦除大小为 256KB。删除特定块的一种方法是
- 将包含要删除的块的扇区读入临时数组。
- 擦除该扇区。
- 删除临时数组中需要的块
- 将临时数组写回 Flash。
我想问有没有更好的替代逻辑。
我正在使用 Spansion 的 16MB 闪存。扇区大小为 256KB。我正在使用闪存读取/写入/删除 30 字节块(结构)。我在 IC 的数据表中发现最小可擦除大小为 256KB。删除特定块的一种方法是
我想问有没有更好的替代逻辑。
没有办法擦除小于闪存中最小可擦除扇区大小。
但是,有一种典型的方法来处理使大闪存扇区上的小结构无效。只需添加一个标题以指示该结构位置中的数据状态。
简单的例子:
0xffff
结构被擦除并可供使用。0xa5a5
结构包含有效的数据。0x0000
结构包含无效的数据。标题将0xffff
在擦除后。将新数据写入结构时,将标头设置为0xa5a5
. 当不再需要该数据时,将标头设置为0x0000
.
数据实际上不会被删除,但可以被检测为无效。这允许您等到扇区已满,然后清理无效记录并可能压缩有效记录。
首先,再次检查器件数据表。通常 Spansion 设备会让您拥有 64kB 的页面大小而不是 256kB。这可能会或可能不会帮助您,但通常增加粒度会对您有所帮助。
其次,您无法避免“写前擦除”循环,您希望将位从 0 更改为 1。但是,您始终可以逐字节地将位从 1 更改为 0。
您可以重新考虑您当前的 3 字节结构,看看这对您是否有用,或者转移到 32 字节大小的结构(这是 2 的幂,因此 IMO 稍微更理智一些)。然后,要删除,您可以简单地将第一个字节从 0xFF 设置为 0x00,正常擦除的字节将被设置为。这意味着您最终会得到空插槽。
就像垃圾收集器的工作方式一样,您可以重新组织以移动任何已删除块的页面,以便创建空页面(充满已删除块)。确保在从原始页面中删除它们之前将好的块移动到空白页面!然后,您可以擦除充满已删除或重新组织块的空白页面。
当您使用闪存时,您必须考虑您的读/擦除/写策略以使用您可用的闪存。在开始编码或锁定内存结构之前一定要解决它,因为通常您需要保留至少一个字节作为有效字节,并且通常您必须利用这样一个事实,即您总是可以更改设置为的位1 到 0 的任何字节在任何时候都没有擦除周期。