一、驱动层: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 抽象层的使用相关推荐

  1. AutoSar之微控制器抽象层MCAL

    微控制器抽象层位于AUTOSAR BSW的最底层,包含内部驱动,可直接访问微控制器和外设芯片.从具体应用来看,MCAL主要包括微控制器驱动.存储器驱动.通信驱动和输入输出驱动四个部分,各部分又由具体的 ...

  2. 图解AUTOSAR(五)——微控制器抽象层(MCAL)

    微控制器抽象层位于AUTOSAR分层模型中BSW最底层,包含内部驱动,可以直接访问微控制器和片内外设.更进一步地,MCAL又可以分为微控制器驱动.存储器驱动.通信驱动和I/O驱动四个部分,各部分又由具 ...

  3. ZigBee学习之7——OSAL(操作系统抽象层)API解读

    根据Z-Stack1.4.3-1.2.0中OSAL API_F8W-2003-0002_.pdf文档翻译. Z-Stack1.4.3及以后的版本中引入了一个OS的概念,把应用层和堆栈层进行了分离,但是 ...

  4. Android网络编程系列 一 Socket抽象层

    在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象 ...

  5. 芯片设计抽象层及其设计风格

    文章目录 设计抽象层 设计风格 自顶向下 自下而上 参考资料 设计抽象层 在了解Verilog语言的更多细节之前,我们最好先了解一下芯片设计中的不同抽象层. 最上层是系统级的架构,它定义了各种子块,并 ...

  6. DPDK — EAL 环境抽象层

    目录 文章目录 目录 EAL 环境适配层 Linux 环境下的 EAL DPDK App 的初始化和运行 内存分配 Structure: malloc_heap Structure: malloc_e ...

  7. 12.PHP_PDO数据库抽象层

    PDO数据库抽象层 其实也就是说,为了方便PHP项目各种数据库切换的方便以及代码兼容性,再各种数据库上又封装了一层,做成了统一的接口,方便数据库使用和切换. PDO链接mysql数据库: <?p ...

  8. 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )

    文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...

  9. 数据库抽象层 PDO

    因为这段时间工作比较忙  所以很长时间没有更新技术博客了. 在这段时间学习到了很多以前没有接触过的东西.下面就来介绍一下数据库抽象层PDO的使用: PDO(PHP Data Objects)是一个轻量 ...

最新文章

  1. 嵌入式linux硬件成本,嵌入式Linux驱动和固件有何区别?供应商是如何用固件压缩成本的?...
  2. 计算机网络第4版潘爱民_学术活动 钱江会计实务精英讲坛预告(第84期)| 何继昌 : 战略视角下之财务分析应用实践 兼选股案例分享...
  3. MySQL带比较运算符的子查询
  4. webform(八)——LinQ简单增、删、改、查
  5. HDU 2476 String painter (区间DP)
  6. java使用POI jar包读写xls文件
  7. 设置公共请求参数_封装一个useFetch实现页面销毁取消请求
  8. ret2libc过地址随机化
  9. CISC, RISC 探究
  10. python和java学哪个好-学python还是java python和java哪个好入门
  11. Python压平嵌套列表的一种方法
  12. Atitit 提升开发效率 声明式编程范式 目录 1. 声明式编程体系树 1 1.1. 声明式(对比:指令式,,主要包括 函数式,逻辑式编程) 2 1.2. 声明式编程:表达与运行分离 3 1.3
  13. php环境安装Java_常用PHP运行环境一键安装包推荐
  14. DDR123信号完整性测试分析技术探析
  15. 社区角色(Kubernetes社区Maintainer是什么角色?)
  16. Composer中的ThingWorx模型定义—可视化
  17. mips中的li_MIPS学习笔记(一)
  18. Mac 配置 Terminal 代理
  19. 程序员能找到对象吗?|猿代码科技
  20. “啪”一炮就通!管道疏通神器终于诞生,马桶、下水道再也不怕堵!

热门文章

  1. selenium自动登录QQ空间(无头、规避)
  2. 一些值得细细品味的书籍
  3. php关联规则,如何理解关联规则apriori算法
  4. 银行信用评分卡建模原理
  5. 第一章 日常生活中的正念
  6. 银河麒麟操作系统(kylin os)学习
  7. 年度好莱坞大片《东京出逃》,藏身琴盒脱身后飞跃亚洲大陆
  8. 论文阅读笔记:(2021.06, cvpr) Monocular 3D Object Detection: An Extrinsic Parameter Free Approach
  9. 限时免费 | 学习成本超低的Python数据分析手册
  10. 使用telnet登陆smtp服务发邮件