FATFS 文件系统
一. 概念
1. 定义
负责 管理 和 存储 文件信息 的 软件机构 ,叫做文件管理系统。
2. 使用场景:
FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,并且与磁盘I / O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。此处还提供了适用于小型微控制器的Petit FatFs模块。
3. 特点:
DOS / Windows兼容的FAT / exFAT文件系统。
平台无关。易于移植。
程序代码和工作区的占用空间非常小。
支持以下各种配置选项:
ANSI / OEM或Unicode中的长文件名。
exFAT文件系统,64位LBA和GPT可存储大量数据。
RTOS的线程安全。
多个卷(物理驱动器和分区)。
可变扇区大小。
多个代码页,包括DBCS。
只读,可选API,I / O缓冲区等...
二. 分类:
-NTFS: 基于安全性的文件系统,是Windows NT所采用的独特的文件系统结构
-CDFS:CDFS是大部分的光盘的文件系统
三. FATFS 模块层次结构:
1. 底层接口
包括存储媒介读/写接口(disk I/O)和供给文件创建修改时间的实时时钟,需要我们根据平台和存储介质编写移植代码。
2. 中间层FATFS模块
实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。
3. 最顶层是应用层
使用者无需理会FATFS的内部结构和复杂的FAT 协议,只需要调用FATFS模块提供给用户的一系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可以像在PC 上读/写文件那样简单。
四. 下载地址:
http://elm-chan.org/fsw/ff/00index_e.html
此地址不仅仅包含资料包下载,还包括文件系统一些知 识,包括函数说明,函数调用实例等。
五. FATFS 文件系统文件介绍
1. FatFs 文件系统包结构
文件名 |
功能 |
说明 |
ffconf.h |
FatFs模块的配置文件 |
需要用户根据需求来配置 |
ff.h |
FatFs和应用程序模块的通用包含文件 |
不需要修改 |
ff.c |
FatFs模块源码 |
不需要修改 |
diskio.h |
FatFs和disk I / O模块的公共包含文件 |
不需要修改 |
diskio.c |
FatFs 和disk I / O 模块接口层文件 |
与平台相关的代码,需要用户根据存储介质来编写函数。 |
ffunicode.c |
可选的Unicode 相关的转换函数 |
|
ffsystem.c |
可选的与操作系统对接的各接口相关实现示例 |
2. 配置文件参数讲解
http://elm-chan.org/fsw/ff/doc/config.html#fs_readonly
六. 应用层函数说明
FatFs为应用程序提供各种文件系统功能,如下所示。
档案存取
f_open-打开/创建文件
f_close-关闭打开的文件
f_read-从文件读取数据
f_write-将数据写入文件
f_lseek-移动读/写指针,扩展大小
f_truncate-截断文件大小
f_sync-刷新缓存的数据
f_forward-将数据转发到流
f_expand-将连续块分配给文件
f_gets-读取字符串
f_putc-写一个字符
f_puts-写一个字符串
f_printf-编写格式化的字符串
f_tell-获取当前的读/写指针
f_eof-测试文件结尾
f_size-获取大小
f_error-测试错误
目录访问
f_opendir-打开目录
f_closedir-关闭打开的目录
f_readdir-读取目录项
f_findfirst-打开目录并读取匹配的第一项
f_findnext-阅读下一个匹配的项目
文件和目录管理
f_stat-检查文件或子目录是否存在
f_unlink-删除文件或子目录
f_rename-重命名/移动文件或子目录
f_chmod-更改文件或子目录的属性
f_utime-更改文件或子目录的时间戳
f_mkdir-创建一个子目录
f_chdir-更改当前目录
f_chdrive-更改当前驱动器
f_getcwd-检索当前目录和驱动器
卷管理和系统配置
f_mount-注册/注销卷的工作区
f_mkfs-在逻辑驱动器上创建FAT卷
f_fdisk-在物理驱动器上创建分区
f_getfree-获取卷上的可用空间
f_getlabel-获取卷标
f_setlabel-设置卷标
f_setcp-设置活动代码页
七. FATFS 移植步骤
1. 添加源码文件。
根据上面的介绍,其中,ff.c、ff.h、ffconf.h、diskio.c、diskio.h 这六个文件是最基本的,必须要包含在我们的项目中!除此之外,根据自己的配置:
如果需要 FatFs 支持可重入, 则 必须要包含 ffsystem.c, 且必须实现 ffsystem.c 中的 ff_req_grant(), ff_rel_grant(), ff_del_syncobj() 和 ff_cre_syncobj() 这四个函数!
如果需要 FatFs 支持长文件名,则必须要包含 ffunicode.c,如果配置长文件名模式为 3 (FF_USE_LFN == 3),则必须同时包含 ffsystem.c, 且必须实现 ffsystem.c 中的 ff_memalloc() 和 ff_memfree() 这两个函数。
2. 确定好数据类型
在ff.h 里面去定义好数据的类型。这里需要了解你用的编译器的数据类型,并根据编译器定义好数据类型。
3. 配置
通过ffconf.h配置FATFS的相关功能,以满足需要。
4. Disk驱动函数编写:
打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数
5. 实现 get_fattime
如果在 ffconf.h 中配置了 FF_FS_NORTC == 0,则必须自己实现函数 DWORD get_fattime (void); 该函数返回一个 4 字节的时间戳!
如果在 ffconf.h 中配置了 FF_FS_NORTC == 1,则可省略该函数的实现!
6. 应用层使用
经过以上步骤之后,就可以在项目中使用 FatFs了。可用的接口全部在于 ff.h 中,其与标准 C 语言中各函数用法基本一致!