这里写目录标题
- 前言
- 需求
- 结构
- 局限性
- 代码示例
前言
…最近工作上有用到EEPROM,在我的应用中需要一分钟一次的擦写频率,按照设备一天工作16h,十年的设备设计寿命来计算,大概要擦写300万次。超出了一般的EEPROM擦写循环次数100万。
…这个问题的解决办法有两种,一种是软件上加入磨损管理,不要对EEPROM同一位置频繁擦写。另一种是更换期间为铁电存储器,铁电存储器优点很多,寿命超长,写完数据之后没有延迟,但是价格会比EEPROM贵一点。对于成本不敏感的应用直接用铁电即可。
…我的应用中决定使用EEPROM,网上查阅了一些资料,并没有找到EEPROM上运行的磨损管理算法。只能自己造了。
需求
- 以页面为单位:EEPROM页面读写效率高一点
- 页面大小和数量可定义,以适配不同的EEPROM
- 算法简单,不需要太复杂
结构
…上图是FT24C16A的页面结构,FT24C16A页面大小为16bit,一共128个页面。
我们将第0页前两个字节作为goodpage指针。其总是保存没有磨损的页面位置。
因为数据有可能会因为磨损而更换页面位置,所以从第1页开始,页面内两个字节为单位作为数据指针data_p,保存目标数据的位置。上图是十个页面数据的情况。
data_p的页面结束之后,就来到了数据内容的页面。我们将数据内容页面的前四个字节设置为擦写计数,每次数据页面更新的时候前四个字节也会同步+1,当抵达磨损次数的时候,该数据页面会将自身”搬迁“到其他的位置。并更新data_p。
如上内容所示,EEPROM的页面结构被”格式化“了,某些固定的位置被存放特定功能的数据。在空白的EEPROM是无法运行我们的算法。所以我们还要在第一次运行之前做格式化处理,并设计一个标志位,以标志此EEPROM已经被格式化,我们将其设计在0页面第三字节。
局限性
…这是一个非常精简的处理,有一定的局限性。
…比如数据利用率并不完美,在页面内容中的计数,其低字节更新频率与页面同频,而高字节几乎不更新,我在最开始的设计中希望将这些不做磨损处理,后来发现编程过于复杂,遂放弃而采用这种简单直白的方式。当然,页面尺寸大的话计数占用的数据比例就会小到忽略。
…我并没有将这个算法成为磨损均衡算法的原因是,磨损均衡算法的设备容量是不变的。磨损均衡算法旨在让所有存储块同时达到最大寿命,我的处理中存储设备的容量只会越来越少。
代码示例
稍后上传到gitee