3.2 Adapter 层

kFlashFile 的 Adapter 层是对 Driver 层做了一层封装,用于屏蔽硬件相关特性。该层与 MCU 以及板载 Flash 型号息息相关。下面的宏定义适用 i.MXRT1170 芯片以及连接在 FlexSPI1 上的 Octal Flash(MX25UM51345):

kFlashFile 的 Adapter 层接口函数如下,参数是硬件无关的,因此上层可以轻松基于这些接口函数做纯软件逻辑设计。

3.3 API 层

kFlashFile 的 API 功能设计思路前面介绍过了,这里介绍具体代码实现,先来看几个关键的宏定义:

3.3.1 init()

kflash_file_init() 函数处理流程如下:

如果是首次指定 Flash 空间,那么直接将全部空间擦除干净,并在第一个 Header Sector 中写入初始文件头(Magic + 文件数据位置值 0),即最新有效文件数据在 Flash 空间文件数据区的首地址。

这里有一个特殊的设计,文件数据区其实并不是直接存储用户写入的文件数据,而是将用户文件数据全部按位取反之后再存储进 Flash。这里假定用户数据初始应该是全 0,然后更改主要是将 0 值改为其他值,取反之后,正好对应 Flash 里的 bit1 编程为 bit0(Flash 擦除后是全 0xFF),这样可以充分利用 Flash 覆盖操作以减少擦除次数。

函数中比较关键的步骤是找寻当前 Flash 空间中是否存在有效文件数据,方法是遍历 Header Sector,发现存在 Magic 便继续寻找最新文件数据位置信息存放的区域(默认 2 字节),按照前面的设计,只需要按序读取区域内容,直到遇到 0xFFFF 为止。

3.3.2 read()

kflash_file_read() 函数最简单了,直接从缓存区 buffer 里获取数据即可,因为每次更新文件数据操作完成之后都会将最新文件数据放在 buffer 里。

3.3.3 save()

kflash_file_save() 函数是最核心的函数了,这里逻辑比较复杂,涉及文件数据区全部满了之后的动作,以及文件头区某个 Sector 满了的动作。其处理流程如下:

  • UC3846控制芯片工作原理控制图 逆变焊机原理与用途
  • 数字万用表电阻档测试二极管正反向没有阻值(使用万用表测量二极管的正向电阻,为什么各档)
  • 学单片机需要学数电模电吗(学单片机要先学数电模电吗)
  • 电工怎么选择适合自己用的万用表(电工初学者买什么样的万用表好)
  • 单片机需要同时运行多个任务怎么办(单片机怎么同时执行多个任务)
  • 电机保护的方案取决于负载的机械特性
  • 绝缘电阻表正负搭接不复零位是怎么回事
  • 短路怎么用万用表查