FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示)。
废话不多说,开始!
打开rt-thread setting 文件,左上角添加软件包,搜索fal,可以找到fal组件,版本号v1.0.0:
保持原始配置即可:
点击退出即可完成自动安装,编译,结果如下:
分区路径packages\fal-v1.0.0\samples\porting\fal_cfg.h。
代码如下(示例):
#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_PART_MAGIC_WORD, “app”, “stm32_onchip”, 641024, 7041024, 0}这一行数据为例:
FAL_PART_MAGIC_WORD :是默认的数据,不用理它;
“app” :是我们建立的分区名称;
“stm32_onchip” :是指片内FLASH还是片外FLASH,这里是片内
641024 : 代表所分配空间的起始地址;也就是前64k空间分配给了"bl",“app” 所用空间大小由641024开始,共计704*1024 大小;
最后的 0 :Flash 的操作函数,如果没有 init 初始化过程,第一个操作函数位置可以置空。
当然,这些是程序默认配置,我们需要根据不同的需要去修改占用空间的大小,若是想增加删除分区,按照程序中相同的格式去更改就可以了,修改时注意各分区的大小及起始地址不要发生冲突。
修改后正常输出如下:
fal数据处理即为对flash进行相应操作,包含数据擦除、读取及写入。
int fal_partition_write(const struct fal_partition *part, uint32_t addr, const uint8_t *buf, size_t size)
参数 | 描述 |
---|---|
part | 分区对象 |
addr | 相对分区的偏移地址 |
buf | 存放待写入数据的缓冲区 |
size | 待写入数据的大小 |
return | 返回实际写入的数据大小 |
int fal_partition_read(const struct fal_partition *part, uint32_t addr, uint8_t *buf, size_t size)
参数 | 描述 |
---|---|
part | 分区对象 |
addr | 相对分区的偏移地址 |
buf | 存放待读取数据的缓冲区 |
size | 待读取数据的大小 |
return | 返回实际读取的数据大小 |
int fal_partition_erase(const struct fal_partition *part, uint32_t addr, size_t size)
参数 | 描述 |
---|---|
part | 分区对象 |
addr | 相对分区的偏移地址 |
size | 擦除区域的大小 |
return | 返回实际擦除的区域大小 |
int fal_partition_erase_all(const struct fal_partition *part)
参数 | 描述 |
---|---|
part | 分区对象 |
return | 返回实际擦除的区域大小 |
const struct fal_partition *fal_partition_find(const char *name)
参数 | 描述 |
---|---|
name | Flash 分区名称 |
return | 如果查找成功,将返回 Flash 分区对象,查找失败返回 NULL |
本文介绍fal分区的创建及相关api函数的介绍,后面会着重讲述fal组件的应用。