levelx norFlash

9 篇文章 0 订阅
8 篇文章 0 订阅

levelx

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 OffsetContents
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
31Valid flag. When set and logical sector not all ones indicates mapping is valid 。//当前sector是否有效,1有效,0 无效
30Obsolete flag. When clear, this mapping is either obsolete or is in the process of becoming obsolete.//是否过时,1 未过时,0 过时,有新的逻辑分区取代这个分区了
29Mapping entry write is complete when this bit is 0;//完整性,0 当前分区完整即写完成, 1 写进行中
0-28Logical 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(过时的)的区域进行回收操作。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值