0

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

  1. 将包含要删除的块的扇区读入临时数组。
  2. 擦除该扇区。
  3. 删除临时数组中需要的块
  4. 将临时数组写回 Flash。

我想问有没有更好的替代逻辑。

4

2 回答 2

7

没有办法擦除小于闪存中最小可擦除扇区大小。

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

简单的例子:

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

标题将0xffff在擦除后。将新数据写入结构时,将标头设置为0xa5a5. 当不再需要该数据时,将标头设置为0x0000.

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

于 2014-12-01T17:55:39.707 回答
3

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

其次,您无法避免“写前擦除”循环,您希望将位从 0 更改为 1。但是,您始终可以逐字节地将位从 1 更改为 0。

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

就像垃圾收集器的工作方式一样,您可以重新组织以移动任何已删除块的页面,以便创建空页面(充满已删除块)。确保在从原始页面中删除它们之前将好的块移动到空白页面!然后,您可以擦除充满已删除或重新组织块的空白页面。

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

于 2014-12-01T17:40:36.530 回答