您可以简单地使用双冗余页面方案。给定两个这样组织的 4kb 页面:
Page A Page B
+------------+ +------------+
| Sequence A | | Sequence B |
!~Sequence A | !~Sequence B |
+------------+ +------------+
| | | |
| | | |
| Data A | | Data B |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
+------------+ +------------+
最初,您编写Data A
并将Sequence A
其 inverse 设置为零~Sequence A
。在启动时,您检查每个页面的序列号并将具有最高有效序列号(有效时sequence ^ ~sequnece == 0xff
)的页面设置为当前读取页面,并将另一个页面设置为当前写入页面。
更新数据时,先擦除当前写入页,写入数据区,然后将序号设置为读取页的序号加 1(模 256),并设置其倒数。然后交换当前的读/写页面。更新时,您可以将数据从一个页面复制到另一个页面,而无需缓冲整个页面,并且只修改您打算更改的部分。
如果在写入过程中发生掉电或复位,页序号将无效,因为它是最后写入的,并且顺序和逆序写入都必须完成,因此部分写入的数据将无效,并且之前的有效页将被启动时选择。
选择当前的活动页面时,您当然必须处理包裹环(即,当序列编号为255和零时,零是较新的)。
该方案适用于经常读取而很少写入的数据。NV 读/写周期的性质和频率将决定合适的机制,因为不同的解决方案适用于顺序记录或非易失性事件计数器。