levelx
文章目录
- Overview
- Quote
- Brief
- Definition
- Theory 实现原理
- 1.初始化流程
- 2.写操作
- 3.读操作
- 4.回收函数
Overview
实现了flash的均衡摩擦,有针对nor 和 nand的接口
配合azure RTOS 以及xfile比较合适,单独使用不是很友好
Quote
https://learn.microsoft.com/en-us/azure/rtos/levelx/chapter5
Brief
支持均衡
支持读写
支持可移植(只需要移植driver即可),参考配置可以参考simulation.c
Definition
- Particular
软件上的定义名词和flash物理特性定义的名词是一个词,不要混淆
硬件物理上:
- Block 块/簇,由sector组成
- sector,扇区,一般指用于擦除的最小单位,
- page, 有些flash,将sector分成多个page,允许页操作(levelx 未引入此概念)
软件逻辑上
- Flash size flash的总空间大小
- Word ,实际是sizeof(LONG),4个字节
- Logical sector, 逻辑扇区,512个字节=128字
- block,块 ,由多个逻辑扇区组成
Theory 实现原理
先看下面的结构体,描述的是一个block,实际物理flash 被分为多个这样的block
block中有多个sector组成
方便描述这里假设有8个block,16个sector
block中第1个 sector用于描述当前block的信息如下表
Byte Offset | Contents |
---|---|
0 | [Block Erase Count] // 擦写计数 |
4 | [Minimum Mapped Sector] // 本block中对应逻辑分区的最小值,用于索引 |
8 | [Maximum Mapped Sector] // 同上 |
12 | [Free Sector Bit Map] // 用于记录当前block中逻辑分区中未用的bitmap 映射 |
m | [Sector 0 Mapping Entry] // 记录当前sector n和逻辑分区的关系,以及当前sector n 的状态(过时/空闲/写入中/写入完成) |
… | |
m+4*(n-1) | [Sector “n” Mapping Entry] |
… | |
s | [Sector 0 Contents] |
… | |
s+512*(n-1) | [Sector “n” Contents] // 实际写入的sector的内容,512字节对齐 |
1.初始化流程
根据配置的block、flash信息初始化config信息,实际就是计算有多少个block,多少个sector,每个block允许有多少个Mapping entry,有多少free bit map。最后化为数据结构就是上表的信息。
2.写操作
写操作是一次性写入512个字节,根据逻辑扇区来写的,不允许指定长度。
这也是这个库的缺陷,导致上层需要实现自己的管理逻辑,所以要配合文件系统用。
① 遍历8个block找到当前对应的block中的sector中是否有对应的逻辑扇区存在了,记为old_mapping_entry
② 遍历8个block找到当前对应的block中的sector中是否有对应空闲扇区,用于存储新写入的,记作new_mapping_entry
③ block的头部有一些min,max 信息用于index,具体index的逻辑没细看
写数据支持掉电保护
用 Mapping entry来实现如下表,bitmapping entry 4个字节全1 时表示free
结合下表和实际写操作顺序过程可以理解一下
Bit(s) | Meaning |
---|---|
31 | Valid flag. When set and logical sector not all ones indicates mapping is valid 。//当前sector是否有效,1有效,0 无效 |
30 | Obsolete flag. When clear, this mapping is either obsolete or is in the process of becoming obsolete.//是否过时,1 未过时,0 过时,有新的逻辑分区取代这个分区了 |
29 | Mapping entry write is complete when this bit is 0;//完整性,0 当前分区完整即写完成, 1 写进行中 |
0-28 | Logical sector mapped to this physical sector—when not all ones. //对应用户写操作时指定的逻辑分区值 |
- 写操作简略流程图
写之前若快满了,则进行回收reclaim
_lx_nor_flash_block_reclaim
其他还有几个地方会调用回收,过时的block数据
还有几个比较关键函数
find、allocate
Read
3.读操作
调用操作流程比较简单,找到logical sector直接读底层内容就行了
4.回收函数
_lx_nor_flash_block_reclaim
看代码吧,回收没细看,大概能猜到,就是对写时obsolete(过时的)的区域进行回收操作。