-
前言
FEE,即Flash EEPROM Emulation,指使用MCU片上的Flash来模拟EEPROM功能,实现数据的可掉电存储。相比于传统的外挂存储器,使用模拟EEPROM具有更快的访问速度、更简单的PCB设计、更强的抗干扰能力以及对OEM/TireN来说很重要的一点:更低的成本控制,毕竟能用一块芯片解决的问题就不会用两片。
本文主要结合过往项目开发经验记录下自己用过的一种模拟EERPOM存储机制。该机制的核心思想为:将Flash划分为多个Sector,当剩余空间不足时,将最早写满的Sector内容拷贝到当前使用的Sector中,然后将最早的Sector擦除以释放空间。
这种方法只会擦除已写满的Sector并且每个Sector机会相同,使整个存储空间保持一个比较均匀的擦写频率,避免了对局部地址/空间反复擦写,过早耗尽Flash寿命。
-
Sector
-
Sector State
为了便于管理,Sector定义了五种工作状态UNDEF、ERASED、USED、FULL和REQUEST TO ERASE,各状态之间转换流程如下图所示:
UNDEF —— 未定义状态,比如MCU芯片首次使用Flash为空的时候,或者Flash被擦除的时候,准确来讲只要没有有效的sector header信息都认为是UNDEF;
ERASED —— Sector已经成功擦除,准备好被写入;
USED —— Sector已经写入了数据,并且后续可以正常写入;
FULL —— Sector已经写不下新数据;
REQUEST TO ERASE —— 请求擦除已满的Sector,如果擦除成功会变为ERASED状态,如果擦除异常,比如Sector只擦除一部分(头部)信息后被打断,就会进入UNDEF状态。
为了记录上述这些状态信息,Sector在头部预留了一段空间专门用来存放头部信息(Sector Header)。
-
Sector Header
Sector Header的定义如下:
Pattern —— 固定值0xCAFE;
Ident —— 存放Sector State:
0x00:UNDEF
0x01:ERASED
0x02:USED
0x03:FULL
0x04:REQUEST TO ERASE
0x05:START(可以当作USED,只是Content域存放内容不同)
Content —— Sector change counter,不同Sector取值不同(依次累加),可以表明Sector的使用次序,适用于ERASED、USED和FULL,REQUEST TO ERASE/START不适用,前者取值为0,后者存放地址信息(低三个字节),用来指明从Sector中何处开始可以写入数据块;