在一个嵌入式项目的设计阶段,不但要选择硬件存储方案,也要对软件的存储方案进行选择,硬件选择方案参考之前的一篇文章。
https://blog.csdn.net/lzs940320/article/details/111353349
软件上方案也有很多的讲究。
同时向大家推荐大神的博客参考:
https://blog.csdn.net/sinat_31039061/article/details/104145805
https://blog.csdn.net/sinat_31039061/article/details/109763830
一.文件系统基本概念
在早期的嵌入式系统中,需要存储的数据比较少,数据类型也比较单一,往往使用直接在存储设备中的指定地址写入数据的方法来存储数据。然而随着嵌入式设备功能的发展,需要存储的数据越来越多,也越来越复杂,这时仍使用旧方法来存储并管理数据就变得非常繁琐困难。因此我们需要新的数据管理方式来简化存储数据的组织形式,这种方式就是文件系统。
RT-thread中为我们提供了文件系统的架构。
虚拟文件系统:为了统一众多不同类型的文件系统,虚拟文件系统对实际文件系统进行抽象,采用统一的文件系统向用户提供相应的一组统一的标准的文件操作接口(open,read,close,select,poll等)。
RomFS文件系统: RomFS是在嵌入式设备上常用的一种文件系统,具备体积小,可靠性高,读取速度快等优点,常用来作为系统初始文件系统。但也具有其局限性,RomFS是一种只读文件系统。
把RomFS当作初始文件系统挂载在根目录,在RomFS里创建几个目录,用于elm-FAT文件系统和littlefs文件系统的挂载点。(作为根文件系统)
elm-FAT文件系统: FatFs 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。(sd卡,spi flash要用,后期直接将模拟成优盘进行文件导出)
littlefs文件系统: littlefs 是 ARM 官方推出的,专为嵌入式系统设计的文件系统,相比传统的文件系统,littlefs 具有自带擦写均衡、支持掉电保护、占用的 RAM/ROM 少的优点。
(提高spi flash利用率,提高设备存储稳定性)
通过图也可以看出,文件系统和硬件设备是对应的,
- 如果你是spi flash(w25qxx)等,设备经常需要数据保存,推荐使用littlefs
- 但如果有sd卡等文件导出的需求,那就推荐使用fatfs,如果也需要不断保存数据,可以增加循环队列缓存机制,来提高稳定性。
- 当然我们还会用到NAND FLASH,毕竟便宜,但是一般用于存储图片的比较多,Yaffs2内存占用较大,在目前还不是很稳定,采用fatfs+fal方式,需要参考别人写的FAL层代码。
除了上面几种文件系统,还有大神的Easyflash,之前使用这个进行系统参数的保存,操作是非常方便的,同时还有日志输出的功能。
下面我们看一下ART-PI的官方的分区表:
stm32H7的内部flash比较小,所以内部flash空间就暂时没有用。
ART-Pi 除了配备一颗 W25Q64 用于存放程序外,同时配备了另一颗 W25Q128 用于存放 WIFI 固件,蓝牙固件,等其它数据.官方建议这颗 W25Q128 的空间划分如下:
分区名 | 起始地址 | 分区大小 | 用途说明 |
wifi_image | 0 | 512KB | 保存 wifi 固件 |
bt_image | 512 * 1024 | 512KB | 保存 bt 固件 |
download | 1 * 1024 * 1024 | 2048KB | 固件下载分区 |
easyflash | 3 * 1024 * 1024 | 1024KB | easyflash 参数保存区 |
filesystem | 4 * 1024 * 1024 | 12MB | 文件系统分区 |
easyflash用于一些系统关键参数的保存。
然后在文件系统分区中,我们将ROMFS作为根文件系统,挂接fatfs和littlefs
fatfs下驱动sd卡,littlefs驱动flash
2. 在ART-pi上添加文件系统:
- 打开我们上节的modbus工程
- 使能虚拟文件系统
3.点击保存后,可以看到配置的变化:
4.进行虚拟文件系统的配置:
5.将扇区大小改大一点,其他的暂时默认就可以了。
littlefs,使用默认配置就可以了。
编译一下:
没有问题,studio给我们带来了极大的便利,能够快速的开发项目,但是一些配置细节我们是一点也不清楚,可以通过对比工具进行对比查看,目前我们先知道怎么用,查看一下效果。
几分钟就将这么多复杂的文件系统集成好了。。。FAT!!!
6.添加我们的easyflash 组件:
这里分区开始地址为0,因为已经对他的地址进行指定。
出现了很多的报错:
打开我们的源码路径,\packages\EasyFlash-v4.1.0\ports
发现这个文件夹没有添加上。
重新查看一下配置:
这个不知道怎么打开了,去掉。
检查其他配置都正常。
然后手动添加下ef_fal_port.c文件到src目录下,注意不需要添加ef_sfud_port.c
编译通过。
到这里,我们项目需要的文件系统都添加好了,方便之后进行数据的存储。