文件系统是为了存储和管理数据,而在存储设备上建立的一种组织结构。
Windows常用的文件系统:
1、FAT12 2、FAT16 3、FAT32 4、exFAT 5、NTFS
FAT:File Alloction Table 文件分配表
在小型的嵌入式存储设备大多使用的是FAT32和exFAT,使用文件系统前,需先对存储设备进行格式化,擦除原来的数据,在存储设备上建立一个文件分配表和目录。
为什么需要文件系统?
① 直接面对存储设备的底层硬件操作,非专业人士不能适用,普通人无从下手。
② 假如扇区数据中包含多个音频片段,传输后比较难定位对应音频片段位置。
如果有文件系统,我们可以把数据数组组织成文件,给这些数据起一个名字(文件名),通过这个名字访问到这些数据。文件系统会根据文件名为我们找到数据在磁盘中的位置。
FAT文件系统简介
系统引导扇区:引导程序,以及文件系统信息(扇区字节数/每簇扇区数/保留扇区数等)
文件分配表:记录文件存储中簇与簇之间连接的信息
根目录:存在所有文件和子目录信息(文件名/文件夹名/创建时间/文件大小)
数据区:文件等数据存放地方,占用大部分的磁盘空间
FAT文件系统用“簇” 作为数据单元,一个“簇”由一组连续的扇区组成,而一个扇区的大小为512字节。所有的簇从2开始进行编号,每个簇都有自己的地址编号,用户文件和数据都存储在簇中。
FATFS是专门用于小型嵌入式系统的通用FAT/exFAT文件系统模块。标准C语言编写,具有良好的硬件平台独立性,简单修改就可移植到单片机上。FATFS是可裁剪的文件系统
FATFS层次结构图
FATFS文件系统包结构
FATFS文件系统的移植需要修改2个文件,ffconf.h和diskio.c。
第三方库的移植,基本上需要用户编写底层驱动源码,然后提供上层配置文件供配置。
FATFS配置
ffconf.h:FATFS关键配置文件 完整介绍 http://elm-chan.org/fsw/ff/doc/config.html
ffconf.h
配置项 | 配置项说明 | 设定值 | |
系统配置 | FF_FS_TINY | 配置使用FATFS为正常模式还是Tiny模式 | 0 |
FF_FS_EXFAT | 使用或禁用exFAT文件系统(使能exFAT需使能长文件名) | 1 | |
功能函数配置 | FF_FS_READONLY | 使能或禁止与写相关函数,即配置只读 | 0 |
FF_USE_MKFS | 使能或禁用f_mkfs函数,即是否使能格式化 | 1 | |
FF_USE_FASTSEEK | 使能快速搜索功能,加快f_lseek/read/write函数执行 | 1 | |
FF_USE_LABEL | 使能或禁止支持磁盘盘符读取与设置函数 | 1 | |
FF_USE_STRFUNC | 设置是否支持字符串类操作 | 1 | |
FF_STRF_ENCODE | 设置字符串I/O函数读写文件字符编码 | 0 | |
命名空间和本地环境配置 | FF_CODE_PAGE | 设置语言类型,简体中文设置为963 | 963 |
FF_USE_LFN | 使能或禁止长文件名,取值范围(0~3),存储地方不同 | 3 | |
磁盘配置 | FF_VOLUMES | 设置FATFS支持的逻辑设备数目 | 3 |
FF_MAX_SS | 设置最大扇区大小 | 512 |
diskio.c
需要实现的函数
disk_initialize 初始化磁盘驱动器
disk_status 获取磁盘状态
disk_read 从磁盘驱动器读扇区
disk_write 从磁盘驱动器写扇区
disk_ioctl 控制设备实现指定功能,用于辅助FATFS中其他API
get_fattime 获取当前时间
disk_initialize函数
disk_status函数
disk_read函数
disk_write函数
disk_ioctl函数
get_fattime函数 ffconf.h文件中FF_FS_NORTC宏为0时需要实现
FATFS开放函数(常用)
文 件 操作
f_open 打开/创建一个文件
f_close 关闭一个打开的文件
f_read 从文件中读取数据
f_write 往文件中写数据
f_gets 读一个字符串
f_putc 写一个字符
f_puts 写一个字符串
f_printf 写一个格式化的字符串
f_lseek 移动文件读/写指针
f_tell 获取当前读/写指针
f_size 获取文件大小
目录操作
f_opendif 打开一个目录
f_closedir 关闭一个已经打开的目录
f_readdir 读取目录条目
f_mkdir 创建一个新目录
f_unlink 删除一个文件或目录
f_rename 重命名/移动一个文件或文件夹
卷管理
f_mount 注册/注销一个工作区
f_mkfs 格式化,创建一个文件系统
f_getfree 获取磁盘信息以及空闲簇数量
f_setlabel 设置盘符(磁盘名字)
f_getlabel 获取盘符
FATFS最简移植步骤
1、前期工作
准备好一个带有存储设备驱动的工程(SPI实验/SD卡实验) FATFS文件系统开源库
2、复制FATFS文件到工程文件夹下
具体路径在:Middlewares下
3、将移植文件添加到工程中
新建分组且添加diskio.c和ff.c,并添加头文件
4、修改ffconf.h的配置项
FF_FS_NORTC / FF_USE_STRFUNC / FF_CODE_PAGE / FF_VOLUMES
5、修改diskio.c文件5个函数
disk_initialize/status/read/write/ioctl
6、编写测试代码
最简读写:f_mount、f_open、f_write、f_read、f_close
FATFS代码解读(正点原子)
除了FATFS模块已有代码,我们另外在FATFS文件夹下新建了一个exfuns文件夹,用于存放针对FATFS做的扩展代码。
定义一些全局变量,方便FATFS的使用,实现磁盘容量获取等函数
重新封装ff.c文件中的操作文件函数,供给USMART调用
修改ffsystem.c和ff.c部分代码
总结:最后的使用比较少,可以直接查看正点原子的例程来做。做嵌入式则是有一些东西可以借鉴别人的来完目标。