新闻中心

EEPW首页>嵌入式系统>设计应用> 嵌入式系统Flash存储管理策略研究

嵌入式系统Flash存储管理策略研究

作者: 时间:2012-11-20 来源:网络 收藏

3) Block_Erase_Counter( 32bit ) : 该字段用来动态记录每个分块的擦除次数, 从而方便应用程序对分块的使用次数进行均衡。

4) Next_Off set ( 16bit ) : 该字段为将来扩展之用, 用来将64K 的分块空间进一步细化, 使得将来1 个64K 空间内可以不同类型的数据。

4 NOR分块状态切换与使用均衡

的使用过程中, 必然存在着多次的数据更新, 当前中数据更新的一般做法是先将新数据写入Flash, 然后将旧的数据置为无效状态[ 6] 。如果每次数据更新都马上将原先数据擦除,则将造成Flash 的擦除次数急剧增加。随着数据更新次数的增多, 也就导致Flash中的可用资源不断减少, 因此在某个时刻就必须对中的垃圾资源进行回收。通过巧妙设置Flash 分块的状态,并在资源回收过程中对源、目标两个分块进行适当的状态切换, 可以确保在资源回收过程中不会因掉电原因而产生数据的丢失。令回收源分块为A, 新目标分块为B, 资源回收流程如图2 所示。

图2 资源回收流程图

对于每次系统上电后, 应用程序将读取每个Flash 数据分块的头部信息, 在内存中建立相应的分块信息表, 同时根据头部信息和空闲地址搜索算法去初始化每种数据类型的起始地址与空闲区域首地址, 同时必须对异常状态进行检测恢复。其中对每个分块的初始化主要是根据分块头部的状态信息进行判断, 检测是否之前有掉电过, 然后做出相应处理, 主要有以下几种可能:

1) 状态为BF _NOT _INIT, 则将其初始化为BF_FREE 状态。

2) 状态为BF_FREE 或BF_INUSE, 则在内存中建立分块信息, 无需其它操作。

3) 状态为BF _ COPYIN G _ DAT A 或BF _ERASING, 则将其擦除后置为BF_FREE 状态。

4) 分块A 状态为BF_SRC_DATA, 如果有另一个分块B 为BF_COPY _FINISHED, 则根据流程图继续完成资源回收操作。如果有另一个分块B 为BF_COPYING_DAT A, 则擦除B 后置为BF_FREE 状态, 然后对A 重新进行资源回收操作。
5) 状态为BF_INVA LID, 则该块为坏块, 不在内存中建立分块信息。为了均衡每一个分块的使用次数, 延长整块Flash 的使用寿命, 在每次进行分块擦除之后, 必须先将之前记录下来的Block_Erase_Counter 加1, 然后组成新的头部信息重新写回分块头部, 从而达到动态记录每个分块擦除次数的功能。在进行空闲分块申请的时候, 必须遍历所有状态为BF_FREE 分块, 选取Block_Erase_Counter 数值最小的作为新分块分配, 从而使得每个分块的使用次数趋于一致。

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭