一、文件系统概念
文件系统:在存储介质中建立一种组织架构,以更好地储存和管理数据
文件系统一般包含:操作系统引导区、目录、文件等
文件系统中数据以文件的形式存储
文件系统中数据的存取需要遵循特定的格式
与直接操作存储介质相比(stm32中的flash存取函数),在文件系统中,一个完整的文件可以被分开为多个片段,存储到不连续的物理地址中;这些不连续的地址之间通过目录或链表的方式建立联系
二、FatFs概念
常用的文件系统有多种:FAT/FATFS、NTFS、CDFS、exFAT
其中,FatFs具有一些特点:免费开源;代码量小,裁剪方便,适合小型嵌入式系统;支持FAT12、FAT16、FAT32;支持多种存储媒介;基于ANSI C,独立于底层,平台兼容性好,可移植性强
源码下载地址:官网FatFs - Generic FAT Filesystem ModuleOpen source FAT filesystem for embedded projectshttp://elm-chan.org/fsw/ff/00index_e.html
系统包结构:
文件名 | 功能 | 说明 |
ffconf.h | FATFS模块配置文件 | 需要根据需求来配置参数 |
ff.h | FATFS和应用模块公用的包含文件 | 不需要修改 |
ff.c | FATFS模块源码 | 不需要修改 |
diskio.h | FATFS和disk I/O模块公用的包含文件 | 不需要修改 |
diskio.c | FATFS和disk I/O模块接口层文件 | 与平台相关的代码,需要用户根据存储介质编写函数 |
interger.h | 数据类型定义 | 与编译器有关 |
option文件夹 | 可选的外部功能(比如支持中文等) | 汉字实验把字库放到SPI FLASH需要修改 |
diskio.c和diskio.h是硬件层,需要根据存储介质修改;尤其是diskio.c,所谓文件系统移植,相当一部分工作量在于对这个文件的修改
ff.c和ff.h是FATFS的文件系统层和文件系统的API层,一般情况下开发者直接调用即可
ffconf.h文件包含相关配置宏,所谓文件系统裁剪,主要是对其中的宏定义进行修改
系统组织架构:
其中,FatFs module一般不需要开发者修改,只需要对Low Level disk I/O layer进行适当的开发和调整,根据硬件的具体情况
大体上可以将FatFs划分为两个层级:Application Interface(应用接口)和Media Access Interface(MAI,媒体访问接口)
Application Interface(应用接口)——FatFs与应用层之间的接口函数
- File Access(文件访问)
- f_open - 打开/创建一个文件
- f_close - 关闭一个打开的文件
- f_read - 从文件中读取数据
- f_write - 向文件写入数据
- f_1seek - 移动读/写指针,扩展大小
- f_truncate - 截断文件大小
- f_sync - 刷新缓存数据
- f_forward - 将数据转发到流
- f_expand - 为文件分配一个连续块
- f_gets - 读取一个字符串
- f_putc - 写一个字符
- f_puts - 写一个字符串
- f_printf - 编写格式化字符串
- f_tell - 取当前读/写指针
- f_eof - 文件结尾测试
- f_size - 获取文件大小
- f_error - 测试错误
- Directory Access(目录访问)
- f_opendir - 打开一个目录
- f_closedir - 关闭一个打开的目录
- f_readdir - 读取目录项
- f_findfirst - 打开目录并读取匹配的第一项
- f_findnext - 读取匹配的下一项
- File and Directory Management(文件和目录管理)
- f_stat - 检查文件或子目录是否存在
- f_unlink - 移除文件或子目录
- f_rename - 重命名/移动文件或子目录
- f_chmod - 更改文件或子目录属性
- f_utime - 更改文件或子目录的时间戳
- f_mkdir - 创建子目录
- f_chdir - 更改当前目录
- f_chdrive - 更改当前驱动器
- f_getcwd - 检索当前目录和驱动器
- Volume Management and System Configuration(卷管理和系统配置)
- f_mount - 注册/注销卷的工作区
- f_mkfs - 在逻辑驱动器上创建FAT卷
- f_fdisk - 在物理驱动器上创建分区
- f_getfree - 获取卷上的可用空间
- f_getlabel - 获取卷标
- f_setlabel - 设置卷标
- f_setcp - 设置活动代码页
Media Access Interface(MAI,媒体访问接口)——FatFs与存储介质之间的接口函数
由于FatFs模块是独立于平台和存储介质的文件系统层,因此它与物理设备(如存储卡、硬盘和任何类型的存储设备)完全分离。因此存储设备控制模块不包含在FatFs中,FatFs通过MAI函数访问存储设备控制模块。
- Storage Device Controls
- disk_status - 获取设备状态
- disk_initialize - 初始化设备
- disk_read - 读数据
- disk_write - 写数据
- disk_ioct1 - 控制设备相关功能
- Real Time Clock
- get_fattime - 获取当前时间
三、小结
FatFs文件系统适合stm32f103这种中小型嵌入式平台,开发者需要进行的工作主要集中在ffconf.h和diskio.c这两个文件中,并在实际中能够熟练调用ff.c中的API函数,但前提是对FatFs的整个架构有清晰的认识。