ZHCACJ1 april 2023 MSPM0G3507
在本文的解决方案中,闪存被划分为多个称为数据项 的区域。每个数据项为 8 字节,包含数据、写入结束标志和标识符。标识符用于标识和区分数据,类似于变量名或虚拟地址。闪存中的两个数据项可以具有相同的标识符,但只有最新的数据项有效。由于数据项是按顺序写入的,因此可以根据位置区分旧数据项和新数据项。
执行读取操作时,会根据标识符找到相应的数据项。如果有多个具有相同标识符的数据项,则只有最新的数据项有效。执行写入操作时,输入的数据和标识符将汇编为新的数据项。因此,当用户想要更新与标识符相对应的数据项时,写入操作不会修改之前的数据项,而是继续在未使用的区域中创建新的数据项。通常,如果扇区已满,则会将对应于每个标识符的最新数据项转移到下一个扇区,然后擦除该扇区。举个极端的例子,当用户只更新与某个标识符相对应的数据时,扇区已满后,所有数据项的标识符都相同,转移操作只会转移最后一个数据项。
应当注意的是,由于扇区大小是固定的,因此单个扇区可以容纳的数据项数量是有限和固定的。为了存储更多数据项,扇区被分组到组 中。同一组中的扇区将一起擦除。当一个组已满时,最新的数据项将转移到下一个组,然后将该组擦除。图 2-1 显示了 EEPROM 仿真的结构。
为了标记组的状态,组的前 8 个字节用作标头。组的其余部分(总组大小减去标头的 8 字节大小)用于存储数据项。一个扇区中的数据项数为(扇区大小 x 一个组中的扇区数/数据项大小 - 1)。例如,如果一个组有 1 个扇区,则可以存储 127 个数据项。如果一个组有 2 个扇区,则可以存储 255 个数据项。如果一个组有 3 个扇区,则可以存储 383 个数据项。
应该强调的是,尽管用户可以使用尽可能多的不同标识符(最多等于数据项的数量),但这可能会导致频繁的转移操作和擦除操作,因此可能会增加系统开销。建议的标识符数量是最大数据项数的三分之一到一半。
共有三个用户可配置的参数,可根据应用要求在 eeprom_emulation_type_b.h 中进行配置。这些参数会影响最大数据项数和耐写次数,稍后将对此进行分析。
此外,在数据项的结构中,写入结束标志用于确保数据项的写入完整性。在写入数据和标识符后,此标志设置为 0x0000。
EEPROM 仿真的基本行为如图 2-2 所示。在 A 中,虽然有两个 Var3,意味着它们具有相同的标识符,但只有后一个标识符有效,因为它较新。如果读取 Var3,则读取的将是 x6 而非 x3。从 A 到 B,执行了写入操作,组 1 已满,因此将执行转移操作。在 C 中,组 2 被标记为 Receiving,因此最新的数据项转移到组 2。在 D 中,转移后,组 2 更新为 Active。组 1 被标记为“Erasing”并等待擦除。擦除操作仅在用户调用相应函数时执行。
用户可以根据需要选择合适的擦除时间。应该注意的是,不及时擦除将导致试图向有残留数据的扇区写入数据。这可能会导致数据损坏。