FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:
支持静态可配置的分区表,并可关联多个 Flash 设备;
分区表支持 自动装载 。避免在多固件项目,分区表被多次定义的问题;
代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;
统一的操作接口。保证了文件系统、OTA、NVM(例如:EasyFlash) 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;
自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;
使用fal包需要在RT-Thread的包管理器中选择它,具体路径如下:
每个功能的配置说明如下:
启动调试日志输出(默认启动);
分区表是否在fal_cfg.h
中定义(默认开启)。如果关闭此选项,fal 将会自动去指定 Flash 的指定位置去检并加载分区表,装备下酢车载;
存储分区表的Flash设备;
分区表的 结束地址 位于 Flash 设备上的偏移。fal 将从此地址开始往回进行检索分区表,直接读取到 Flash 顶部。如果不确定分区表具体位置,这里也可以配置为 Flash 的结束地址,fal 将会检索整个 Flash,检索时间可能会增加。
启用 FAL 针对 SFUD 的移植文件(默认关闭);
应输入调用 rt_sfud_flash_probe
函数时传入的 FLASH 设备名称(也可以通过 list_device 命令查看 Block Device 的名字获取)。该名称与分区表中的 Flash 名称对应,只有正确设置设备名字,才能完成对 FLASH 的读写操作。
然后让 RT-Thread 的包管理器自动更新,或者使用 pkgs --update
命令更新包到 BSP 中。
FAL 相关的 API 如图所示
fal package 遵循 Apache-2.0 许可,详见 LICENSE
文件。
对 RT-Thread 无依赖,也可用于裸机。
测试命令功能需要依赖 RT-Thread FinSH/MSH
使用 FAL 的基本步骤如下所示:
打开 FAL:从 Env 中打开 fal 软件包并下载到工程。
FAL 移植:定义 flash 设备、定义 flash 设备表、定义 flash 分区表。以下主要对步骤 2 展开讲解。
调用 fal_init() 初始化该库:移植完成后,可在应用层调用,如在 main 函数中调用。
在定义Flash设备表前,需要先定义Flash设备。可以是片内flash,也可以是片外基于SFUD的spi flash:
定义片内闪光灯设备可以参考fal_flash_stm32f2_port.c
。
定义片外spi flash设备可以参考fal_flash_sfud_port.c
。
指定实体的Flash设备对应,用户需要根据自己的Flash情况分别实际现init
、read
、write
、erase
这些操做数:
static int init(void)
:可选的初始化操作。
static int read(long offset, uint8_t *buf, size_t size)
:读取操作。
static int write(long offset, const uint8_t *buf, size_t size)
:写入操作。
static int erase(long offset, size_t size)
:擦除操作。
用户需要根据自己的Flash情况分别实际发现这些操作函数。在文件最后部分确定了实体的Flash设备对应象,如下例确定了stm32f2_chipf2 flashon片
"stm32_onchip"
: Flash 设备的名称。
0x08000000
: 对 Flash 操作的起始地址。
1024*1024
:Flash 的总大小(1MB)。
128*1024
:Flash块/块大小(因为STM32F2各块大小不平均,所以擦除颗粒度为最大块的大小:128K)。
{init, read, write, erase}
:Flash 的操作函数数。 如果没有init 初始化过程,第一个操作函数数位置可以设置。
8
:设置写粒度,单位单位,0表示未默认值默认值为为为为为为为为为为为为为0)列举几种常见Flash 写粒度:
也不闪光:1位
stm32f2/f4:8位
stm32f1:32位
stm32l4:64 位
Flash flash设备表fal_cfg.h
文件中,定义定义定义需需 新建fal_cfg.h
文件 ,请新建新建新建新建新建新建新建新建新建新建新建新建该该该文件文件文件统一统一统一放对应对应对应对应对应对应对应对应对应的的的的的的的的的的的示例文件 fal/samples/porting/fal_cfg.h完成。
设备表示示例:
Flash设备表中,有两个Flash对象,一个为STM32F2的片内Flash,一个为片外的Nor Flash。
flash flash分区分区分区文件头头fal_cfg.h
文件文件文件。分区分区,flash个设备设备设备设备设备设备有有有有有有有有有有有有有有有有有有有有有,这些有个,这些这些这些这些这些这些这些这些,这些这些这些这些分区分区的的的的的集合就是是分区表 。 。fal_cfg.h可以参考示例文件fal/samples/porting/fal_cfg.h完成。
分区表示示例:
上面这个分区表详细描述信息如下:
用户需要修改的分区参数包例如:分区名称、关联的Flash设备名称、偏移地址(相对于Flash设备内部)、大小,需要注意以下几点:
分区名称保护 不能恢复 ;
关联的Flash 设备 必须经在Flash 设备表示中定义好 ,并称为 一致 ,否则会出现无法找到Flash 设备的错误;
分区的起点地址和大小 不能超过Flash设备的地址范围 ,否则会导致包初化错误;
注意:每个分区确定正义时,除了填写上面介绍的参数属性外,需要在前面增加
FAL_PART_MAGIC_WORD
属性,末尾增加0
(目前用于保护能力)
fal提供了测试命令命令命令,rt thread finsh/msh/msh功能功能功能可。。做基于基于基于基于基于基于基于基于基于基于的的的,调试调试时指定位置的起点Flash数据,快速的试验证明Flash驱动的完整性能,甚至可以对Flash进行性能测试。
具体功能如下:输入fal可以看到完整的命令列表
当第一次使用 fal 命令时,直接输入fal probe
将显示分区表信息。
分区或Flash被成功选中后,还会显示它的一些属性情况。大致效果如下:
先输入fal erase
,后面跟着等待擦除数据的起始地址以及长度。以下命令为:从0地址(相对Flash或分区)开始擦除 4096 字节数
注意:根据,flash特性,擦除动作将按进行。。,如果。,如果如果操作操作地址或或长度未按照按照按照按照的的的的的扇区扇区
先输入fal write
,后面跟着N个待写的数据,并以空格隔开。以下命令为:从地8的位置依次开始写入1、2、3、4、5 5
先输入fal read
,后面跟着等待读取数据的起始地址以及长度。以下命令为:从0开始读取取数据64字节数据
flash测试测试的的,写入速度速度速度速度速度速度速度速度速度速度读取及会会测试测试写入写入及及读取读取读取数据数据的的准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性准确性及及
先先先fal bench
,flash flash的的的(请查看对应的的的的的的的的,Spi nor flash一般4096)。。一般。。。。。。。。。由于由于由于性能会整个整个整个整个整个整个整个整个整个整个整个整个整个或者或者或者yes
或者
1、使用FAL时,无法找到fal_cfg.h
头文件
fal_cfg.h
fal fal软件配置文件,需要用户手动手动,并手动手动手动手动手动相关分区表分区表信息。
原作者:RT-线程包
更多回帖