RT-Thread FAL组件(Flash abstraction layer)
分区表一般在 fal_cfg.h
中定义(默认开启配置宏)
FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:
支持静态可配置的分区表,并可关联多个Flash设备;
支持分区表的自动装载,可以避免多固件项目中,分区表被多次定义的问题;
代码精简,不依赖操作系统;
提供统一的操作接口,保证文件系统等对Flash有一定依赖型的组件对底层Flash驱动可重用性。
· 使用 fal package 需要在 RT-Thread 的包管理器中选择它
使用FAL的基本步骤:
-
打开FAL:从Env中打开fal软件包并下载到工程
-
FAL移植:定义flash设备、定义flash设备表、定义flash分区表
定义flash设备表之前需要flash设备
flash设备可以有片内flash、片外flash
/* ===================== Flash device Configuration ========================= */ extern const struct fal_flash_dev stm32f2_onchip_flash; extern struct fal_flash_dev nor_flash0; /* flash device table */ #define FAL_FLASH_DEV_TABLE \ { \ &stm32f2_onchip_flash, \ &nor_flash0, \ }
然后定义flash分区表
#define NOR_FLASH_DEV_NAME "norflash0" /* ====================== Partition Configuration ========================== */ #ifdef FAL_PART_HAS_TABLE_CFG /* partition table */ #define FAL_PART_TABLE \ { \ {FAL_PART_MAGIC_WORD, "bl", "stm32_onchip", 0, 64*1024, 0}, \ {FAL_PART_MAGIC_WORD, "app", "stm32_onchip", 64*1024, 704*1024, 0}, \ {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME, 0, 1024*1024, 0}, \ {FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \ } #endif /* FAL_PART_HAS_TABLE_CFG */
-
调用fal_init初始化该库,移植完成后在应用层调用。
· FAL API
· 源码实现细节
FAL目录 | |
---|---|
名称 | 说明 |
inc | 头文件目录 |
src | 源文件目录 |
samples | 例程目录 |
- /inc/fal_def.h 对象的结构体定义
- /inc/fal.h
该头文件下声明了与fal相关的初始化函数,操作分区的相关函数声明、不同类型的设备创建函数声明。
/src/fal.c
该源文件实现了fal_init()的函数定义,该函数完成所有的flash设备和flash分区的初始化。函数内部调用在其他源文件中定义的初始化函数。
fal_flash_init();
flash_partition_init()
- /fal_rtt.c
创建了相关结构体抽象,字符设备、块设备、mtd设备
/* ========================== block device ======================== */
struct fal_blk_device
{
struct rt_device parent;
struct rt_device_blk_geometry geometry;
const struct fal_partition *fal_part;
};
struct fal_mtd_nor_device
{
struct rt_mtd_nor_device parent;
const struct fal_partition *fal_part;
};
/* ========================== char device ======================== */
struct fal_char_device
{
struct rt_device parent;
const struct fal_partition *fal_part;
};
然后是对应的相应的ops实现,fal_rtt.c的函数框架如下:
最后有一个重要的函数
该函数实现了相关能够在控制台进行调试的相关函数实现,最后使用
MSH_CMD_EXPORT(fal, FAL (Flash Abstraction Layer) operate.);
将函数进行命令宏导出。
挂载Littlefs文件系统
ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有以下优点:
- 自带擦写均衡
- 支持掉电保护
- 占用的 RAM/ROM 少
在 RT-Thread 上运行的层级关系图:
应用littlefs文件系统的主要移植流程
- 使能DFS框架
- 配置littlefs
- 使能MTD设备
- 配置fal
- 使能外置FLASH
- 检查分区表
- 创建MTD设备并挂载文件系统