Flash存储器磨损均衡原理及实现

1. 背景

现在嵌入式开发使用的存储器时逐渐都直接使用Flash,原因是Flash价格便宜,空间大,内置,直接使用不需要再加其他存储外设。但如果直接用操作EEPROM的方式来使用Flash会带来一些问题,主要分为两类:a.使用寿命,b.读写速度。EEPROM可以单字节读写,而FLASH只能按整个sector(page)擦除,同时最小读写单位不一定可以细化到单字节(比如有的是四字节),另外EEPROM一般有100万次的读写寿命,而FLASH只有10万次;对FLASH进行普通操作写入一个字节时,需要先读出整个sector到RAM,再将需要写入的字节写入RAM指定位置,再将整个sector回写,这种做法是大部分Flash读写驱动的做法。可以看出这种做法既效率低(擦写步骤多,浪费RAM),同时影响FLASH寿命。

2. FLASH寿命

FLASH的寿命是按照sector来分的,当对同一个bit位置擦写(0变1,或1变0都算一次)到达一定次数后(理论10万次),这个区域将不能再写入(1变0),一个bit坏了将影响整个sector(这里可能不同的设备有不同的结果)。

3.磨损均衡原理

假设我们需要使用FLASH存储内容,那么先将一个sector擦除(算一次),以后每次写入内容都换一个位置,这样直到整个sector写满都算一次(因为每次都操作不同的bit位置)。这样就可以达到延长FLASH寿命的目的。假设一个4K的FLASH sector,可以划分出100个存储单位,那么现在存储一个数据100次只算2次擦写,之前算200次 ,寿命延长100倍。

4.磨损均衡实现


如上图所示,对每个sector进行图中地址划分,例如一个4K的Flash,按照32字节一个item单位来划分,首先拿出32(各位自己算一下)字节当做bitmap来对每个item的状态记性标记,一个item对应bitmap中一个单位(占用两个Bit),内容如图所示。当一个sector擦除后,bitmap为全1,表示所有item可用,当一个item写入后对其对应的bitmap一个bit置0,当修改或删除这个item后,对两个bit置0,当修改这个item内容时不占用原来的位置而是重新找到一个位置来存放新内容并对以前的位置标记为可擦除。

当需要对FLASH进行操作前,先将bitmap读到ram进行分析。

(1)关于碎片整理

如下图所示:


使用一段时间后,多个sector会产生碎片,这时需要将碎片进行整理,碎片整理的策略可以是定时,也可以是开机启动进行整理一次,原理很简单。

(2)item变长内容

item的内容有一定的格式,来实现存储变长的内容,可以参照一下格式:

Type (1Byte)| Next(2Bytes) | Index(10Bytes) | Context(nBytes) | CRC(16/32Bits) 

Type:0表示这是一个单item内容,1表示是一个占用多个item位置的变长内容,此时Next内容表示下一个内容的地址,Next地址为0表示结束。

5. 代码

看了以上内容,相信代码实现起来是很容易的,代码后期写好了再传上来。

转载请说明来自CSDN Leeee,谢谢!

  • 11
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值