1、FatFs文件系统简介
FatFs是用于小型嵌入式系统的通用FAT/exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,与磁盘控制层完全分离。因此,它独立于平台和存储设备,具有良好的硬件平台独立性。它可以集成到资源有限的小型微控制器中,如8051、PIC、AVR、ARM、Z80、RX等,支持多种存储设备如 SD 卡、MMC、USB闪存、NAND/NOR 闪存等。FatFs支持 FAT12/16/32 文件系统格式,具有高效、简洁、易于移植的特点。
2、FatFs的主要结构组成
(1) 用户应用层
文件操作API接口函数:如 f_open、f_read、f_write、f_close 等。这些函数用于用户操作文件和目录,如打开、读取、写入和关闭文件等 。
(2) 文件系统层
•文件控制块(FIL):用于表示一个已打开的文件,包含文件的状态、文件的指针、当前位置等信息。
•目录控制块(DIR):用于表示一个已打开的目录,包含目录的结构、当前读取位置等。
•文件系统对象(FATFS):用于表示整个文件系统的状态,包括当前挂载的信息、文件系统类型、扇区大小等。
•文件分配表(FAT):FAT 文件系统核心的数据结构,用于管理文件的簇链,标识文件占用了哪些簇,以及这些簇是否已被分配、空闲或损坏。
(3) 缓存管理层
FatFs 会在 RAM 中保留一个扇区缓冲区,用于加速文件读写操作,将块设备的读写操作优化为扇区大小。
(4) 低级设备抽象层
FatFs 通过硬件抽象层与具体的存储设备交互,即磁盘接口。支持多种存储设备媒介(SD 卡、USB、NAND、NOR Flash)。
·disk_read():从存储设备中读取数据。
·disk_write():向存储设备写入数据。
3、FatFs的移植及使用
(1)FatFs源码下载,FatFs官方网站:http://elm-chan.org/fsw/ff/。
图1 FatFs源码下载网页
如图1所示,通过官网下载到最新的FatFs源码包,源码包解压后得到相关文件如图2所示,文件包含了:存放于documents文件夹的相关使用的帮助文档、存放于source文件夹中的FatFs源代码以及许可证信息,这里我们主要聚焦于源码部分。
(2)FatFs源码移植。
ffsystem.c 通常是一个可选文件,提供了操作系统依赖的函数,这些函数用于动态内存分配和多任务环境中的互斥锁管理(当启用 FF_FS_REENTRANT 配置时),这里我们不启用相关函数功能。因此我们对其余的6个程序模块进行移植,这里以华芯微特UI_Creator上位机swm34s工程为例,如图3所示,针对FAtfs移植来进行相关的讲解。
图3 UI_Creator上位机工程FatFs模块
FatFs主要通过对低级设备抽象层(即diskio.c模块)进行程序修改移植。
在 diskio.c 中,有以下5个函数实现:
•disk_status(): 获取磁盘状态。
•disk_initialize(): 初始化磁盘(通常是 SPI 或 SD 卡的初始化)。
•disk_read(): 从磁盘读取数据。
•disk_write(): 向磁盘写入数据。
•disk_ioctl(): 控制磁盘的操作,比如获取磁盘扇区、块大小、擦除等。
在上位机工程中,我们支持对SD卡及串行闪存盘进行文件系统移植,需添加硬件初始化及磁盘操作的相关头文件(SWM341.h、FlashDisk.h<闪存盘读写擦操作的头文件>),其次是添加设备定义编号,程序如图3编程界面红框所示。
在diskio.c的6个功能函数中,对对应设备部分进行编程或功能函数植入,其中包括:①在disk_status()中实现磁盘设备ID读取检测(闪存设备),实现状态信息返回,如图4所示;
图4
②在disk_initialize()中对相关存储设备硬件IO接口进行初始化,如图5所示;
图5
③在disk_read()、disk_write()中添加对硬件设备相关的读写操作函数接口,如图6所示;
图6
④在disk_ioctl()中可添加需要的磁盘操作功能,如图7所示;
图7
至此,我们基本完成了FatFs文件系统的移植。
(3)FatFs的使用。
移植完FatFs后,需要通过f_mount()函数实现对文件系统的挂载,而后ff.c所提供的标准文件操作接口来实现文件读写。以上位机工程为例,通过在lv_fs_fatfs.c中,将 FatFs 提供的文件系统接口与 LVGL 的文件 I/O 接口关联起来,如图8所示,实现了LVGL从文件系统中加载资源,比如图像、字体、数据文件等。
图8 LVGL(LittlevGL)中使用 FatFs 文件系统
值得一提的是,作为FatFs文件系统的配置文件,ffconf.h允许用户通过修改其程序源码中的宏定义来选择开启或关闭特定的功能、调整文件系统的行为、优化内存资源占用和性能,从而满足嵌入式系统的不同要求。
FatFs的相关移植使用也可参考华芯微特SWM341基础库中的SFC\SFC_FATFS例程,如图9所示。
图9 SWM341基础库SFC\SFC_FATFS例程