FAL:Flash 抽象层的使用
一、驱动层:SFUD(Serial Flash Universal Driver) 是一款开源的串行 SPI Flash 通用驱动库
二、中间层:FAL(FLASH ABSTRACTION LAYER))FLASH 抽象层
三、应用层:FlashDB(FlashDB 是一款超轻量级的嵌入式数据库)
后记1:FlashDB嵌入式数据库之TSDB数据存储解析
FAL:Flash 抽象层
- FAL:Flash 抽象层的使用
- 移植
- 总结
FAL:Flash 抽象层的使用
- 首先拉一段官网的简介先认识一下
官方链接: http://packages.rt-thread.org/detail.html?package=fal.
FAL (Flash Abstraction Layer) Flash 抽象层,是对 Flash 及基于 Flash 的分区进行管理、操作的抽象层,对上层统一了 Flash 及 分区操作的 API (框架图如下所示),并具有以下特性:
支持静态可配置的分区表,并可关联多个 Flash 设备;
分区表支持 自动装载 。避免在多固件项目,分区表被多次定义的问题;
代码精简,对操作系统 无依赖 ,可运行于裸机平台,比如对资源有一定要求的 Bootloader;
统一的操作接口。保证了文件系统、OTA、NVM(例如:EasyFlash) 等对 Flash 有一定依赖的组件,底层 Flash 驱动的可重用性;
自带基于 Finsh/MSH 的测试命令,可以通过 Shell 按字节寻址的方式操作(读写擦) Flash 或分区,方便开发者进行调试、测试;
FAL framework
还是很好理解的,就是一个中间层,把Flash硬件设备理想化未可操作的对象,这样就不需要管理下层的操作对象是SPI-FLASH还是EEPROM或者片内FLASH了
移植
fal的移植是建立在SFUD的底层驱动上的,所以如果没还没移植好SFUD,看上一篇文章
一样先下源码。Gitee仓库:https://gitee.com/RT-Thread-Mirror/fal/blob/master/docs/fal_api.md.
导入工程之后是这样样子的
注意一下,因为我使用的是SPI-FLASH所以使用fal_flash_sfud_port.c这个.C文件,如果是片内flash请选其他啊,不过一般这个用的多吧
跟着套路先改fal_cfg.h文件
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_#define FAL_DEBUG 1 //启动打印
#define FAL_PART_HAS_TABLE_CFG //启动设备表
#define FAL_USING_SFUD_PORT //使用sfud通用串行flash/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \&nor_flash0, \
}/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \{FAL_PART_MAGIC_WORD, "fdb_tsdb1", "norflash0", 0, 1024*1024, 0}, \{FAL_PART_MAGIC_WORD, "fdb_kvdb1", "norflash0", 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */#endif /* _FAL_CFG_H_ */
- 中间层的主要作用就是把,底层的物理接口抽象化,这里就是把W25Q64抽象成了2个对象,这里称位分区表
- FAL_PART_TABLE就是我们定义的分区表了,后期的擦,读,写都是针对分区表来操作的
- 自己搞了一个demo试了下
/*** fal demo for the first flash device test.**/
#define FAL_DEMO_TEST_BUFFER_SIZE 128
static uint8_t fal_demo_test_buf[FAL_DEMO_TEST_BUFFER_SIZE];
static void fal_demo(char* partition_name, uint8_t *data,size_t size)
{int i,result;const struct fal_partition *demo_partition;//获取分区表指针demo_partition = fal_partition_find(partition_name);//擦除测试result = fal_partition_erase( demo_partition, //分区表名称,所以分区表一定不能重复了0, //擦除的起始地址size //擦除的字节长度); //返回接收的实际数量if ( result >= 0 ) {printf("Fal Erase The partition \"fdb_tsdb1\" is success...\n");} else {printf("Fal Erase The partition \"fdb_tsdb1\" is false!!!\n");}//写入前赋下初始值for(i=0;i<size;i++)data[i] = i;//写入测试result = fal_partition_write(demo_partition, //分区表名称,所以分区表一定不能重复了0, //在分区表中的地址便宜,注意是分区表data, //接收地址size //接收长度); //返回接收的实际数量if ( result >= 0 ) {printf("Fal write The partition \"fdb_tsdb1\" is success...\n");} else {printf("Fal write The partition \"fdb_tsdb1\" is false!!!\n");}//读取测试result = fal_partition_read(demo_partition, //分区表名称,所以分区表一定不能重复了0, //在分区表中的地址便宜,注意是分区表data, //接收地址size //接收长度); //返回接收的实际数量if ( result >= 0 ) {printf("Fal Read The partition \"fdb_tsdb1\" is success...\n");} else {printf("Fal Read The partition \"fdb_tsdb1\" is false!!!\n");}
- 这里偷懒了,日志打印的不是很全啊
总结
1.关键就是分区表,只要搞清楚了分区表,其他的就都清楚了
2.我们是单独使用的fal中间层,没有和Rt-Thread一起使用,没问题可以的
3.介绍了三部曲之二的中间层,接着是上层应用了FlashDB嵌入式数据库.
FAL:Flash 抽象层的使用相关推荐
- AutoSar之微控制器抽象层MCAL
微控制器抽象层位于AUTOSAR BSW的最底层,包含内部驱动,可直接访问微控制器和外设芯片.从具体应用来看,MCAL主要包括微控制器驱动.存储器驱动.通信驱动和输入输出驱动四个部分,各部分又由具体的 ...
- 图解AUTOSAR(五)——微控制器抽象层(MCAL)
微控制器抽象层位于AUTOSAR分层模型中BSW最底层,包含内部驱动,可以直接访问微控制器和片内外设.更进一步地,MCAL又可以分为微控制器驱动.存储器驱动.通信驱动和I/O驱动四个部分,各部分又由具 ...
- ZigBee学习之7——OSAL(操作系统抽象层)API解读
根据Z-Stack1.4.3-1.2.0中OSAL API_F8W-2003-0002_.pdf文档翻译. Z-Stack1.4.3及以后的版本中引入了一个OS的概念,把应用层和堆栈层进行了分离,但是 ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...
- 芯片设计抽象层及其设计风格
文章目录 设计抽象层 设计风格 自顶向下 自下而上 参考资料 设计抽象层 在了解Verilog语言的更多细节之前,我们最好先了解一下芯片设计中的不同抽象层. 最上层是系统级的架构,它定义了各种子块,并 ...
- DPDK — EAL 环境抽象层
目录 文章目录 目录 EAL 环境适配层 Linux 环境下的 EAL DPDK App 的初始化和运行 内存分配 Structure: malloc_heap Structure: malloc_e ...
- 12.PHP_PDO数据库抽象层
PDO数据库抽象层 其实也就是说,为了方便PHP项目各种数据库切换的方便以及代码兼容性,再各种数据库上又封装了一层,做成了统一的接口,方便数据库使用和切换. PDO链接mysql数据库: <?p ...
- 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )
文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...
- 数据库抽象层 PDO
因为这段时间工作比较忙 所以很长时间没有更新技术博客了. 在这段时间学习到了很多以前没有接触过的东西.下面就来介绍一下数据库抽象层PDO的使用: PDO(PHP Data Objects)是一个轻量 ...
最新文章
- 嵌入式linux硬件成本,嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?...
- 计算机网络第4版潘爱民_学术活动 钱江会计实务精英讲坛预告(第84期)| 何继昌 : 战略视角下之财务分析应用实践 兼选股案例分享...
- MySQL带比较运算符的子查询
- webform(八)——LinQ简单增、删、改、查
- HDU 2476 String painter (区间DP)
- java使用POI jar包读写xls文件
- 设置公共请求参数_封装一个useFetch实现页面销毁取消请求
- ret2libc过地址随机化
- CISC, RISC 探究
- python和java学哪个好-学python还是java python和java哪个好入门
- Python压平嵌套列表的一种方法
- Atitit 提升开发效率 声明式编程范式 目录 1. 声明式编程体系树	1 1.1. 声明式(对比:指令式,,主要包括 函数式,逻辑式编程)	2 1.2. 声明式编程:表达与运行分离	3 1.3
- php环境安装Java_常用PHP运行环境一键安装包推荐
- DDR123信号完整性测试分析技术探析
- 社区角色(Kubernetes社区Maintainer是什么角色?)
- Composer中的ThingWorx模型定义—可视化
- mips中的li_MIPS学习笔记(一)
- Mac 配置 Terminal 代理
- 程序员能找到对象吗?|猿代码科技
- “啪”一炮就通!管道疏通神器终于诞生,马桶、下水道再也不怕堵!
热门文章
- selenium自动登录QQ空间(无头、规避)
- 一些值得细细品味的书籍
- php关联规则,如何理解关联规则apriori算法
- 银行信用评分卡建模原理
- 第一章 日常生活中的正念
- 银河麒麟操作系统(kylin os)学习
- 年度好莱坞大片《东京出逃》,藏身琴盒脱身后飞跃亚洲大陆
- 论文阅读笔记:(2021.06, cvpr) Monocular 3D Object Detection: An Extrinsic Parameter Free Approach
- 限时免费 | 学习成本超低的Python数据分析手册
- 使用telnet登陆smtp服务发邮件