【问题标题】:Best logic to erase fewer bytes than sector size(minimum erasable size) in flash在闪存中擦除比扇区大小(最小可擦除大小)更少的字节的最佳逻辑
【发布时间】:2015-01-29 18:26:27
【问题描述】:

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

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

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

【问题讨论】:

  • 不能直接将修改后的数据重写到扇区而不“擦除”吗?
  • 不,写入数据而不擦除位置是不可能的

标签: c embedded flash-memory


【解决方案1】:

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

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

简单示例:

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

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

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

【讨论】:

  • 发帖者的问题可能更复杂,比如他可能需要通过索引访问结构,或者结构本身相互引用,但是我想这个字段比可回答的要复杂得多在一个 SO 帖子上。然而,这个答案是重新思考整体问题的解决方案的良好开端。
  • 如果不再需要数据或需要擦除数据,您是说修改标头(在闪存中)。但是要这样做,我怎样才能修改驻留在闪存中的数据而不擦除它呢?
  • @DurgeshTanuku,您始终可以将位从 1 重新编程为 0,而无需擦除。但是为了将任何位从 0 更改为 1,您必须擦除整个扇区。 (擦除将扇区中的所有位设置为 1。)因此,无需擦除,您可以将标头重新编程为全 0,并将其用作记录不再有效的指示。
  • @Jubatian 如果发帖人希望使用闪存作为随机访问可修改内存,他的问题确实会超出单个 SO 问题的范围。由于他的问题集中在删除块上,我认为这是他的核心问题,但没有考虑到他可能会删除它们以便在那里写入新数据。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-02-12
    • 1970-01-01
    • 2016-10-17
    • 2022-01-03
    • 2018-03-30
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多