1.FatFs(通用FAT文件系统模块)下载与介绍
2.FatFs移植——基于STM32 SD卡
3.FatFs学习(1)——枚举:返回值FRESULT
…
注:本文基于R0.14版本,给出的源码、翻译以及分析不保证与其他版本适合。
FatFs下载与介绍
- FatFs——通用FAT文件系统模块
-
- 1 . 特征
- 2. 层级结构
- 3. 源码下载地址
- 4. 源码文件结构
-
- 4.1 documents文件夹
-
- 4.1.1 documents/doc/
- 4.1.2 documents/res/
- 4.2 source文件夹
-
- 4.2.1 底层source/diskio.c、source/diskio.h
- 4.2.2 应用接口source/ff.c、source/ff.h
- 4.2.3 宏配置source/ffconf.h
- 4.2.4 操作系统相关source/ffsystem.c
- 4.2.5 unicode编码source/ffunicode.c
- 5. FatFs补丁
FatFs——通用FAT文件系统模块
??FatFs是用于小型嵌入式系统的通用FAT / exFAT文件系统模块。FatFs模块是按照ANSI C(C89)编写的,并且与磁盘I/O层完全分开。因此,它独立于平台。它可以并入资源有限的小型微控制器中,例如8051,PIC,AVR,ARM,Z80,RX等。
??“FatFs模块是为教育,研究和开发开放的免费软件。您可以在个人项目或商业产品中使用,修改和/或重新分发它,而不受您的责任限制。”
1 . 特征
- DOS / Windows兼容的FAT / exFAT文件系统。
- 平台无关。易于移植。
- 程序代码和工作区的占用空间非常小。
- 支持以下各种配置选项:
- ANSI / OEM或Unicode中的长文件名。
- exFAT文件系统,64位LBA和GPT可存储大量数据。
- RTOS的线程安全。
- 多个卷(物理驱动器和分区,最多10个卷)。
- 可变扇区大小。
- 多个代码页,包括DBCS。
- 只读,可选API,I / O缓冲区等…
2. 层级结构
FatFs层级结构如下:
??(1)应用层调用FatFs模块接口,FatFs调用底层接口,实现对USB、SD卡等存储设备的操作。
??(2)需提供RTC时钟给FatFs模块。
3. 源码下载地址
??FatFs官方下载地址:http://elm-chan.org/fsw/ff/archives.html
??在该页中有FatFs和Petit FatFs。
???Petit FatFs是用于小型8位微控制器的FatFs模块的子集。它是按照ANSI C编写的,并且与磁盘I/O层完全分开。即使RAM大小小于扇区大小,也可以将其合并到内存有限的微型微控制器中。
??简单来说,Petit FatFs属于FatFs的阉割版,功能比较简单,占用资源小。我们这里选择完整版的FatFs。
??页面中有至今为止已发布的版本及其发布时间,可以下载任一版本,目前最新版本为0.14(本文同样基于0.14),点击版本即可下载。
4. 源码文件结构
??压缩包下载后解压,有两个文件夹(/documents和/source)和一个txt文件(LICENSE.txt)。
??/documents是关于FatFs的一些资料,/source文件夹下是FatFs的源码,LICENSE.txt则是FatFs的许可证书。
4.1 documents文件夹
??00index_e.html相当于FatFs的主页。
??updates.txt记录了各个版本的更新。
4.1.1 documents/doc/
??doc文件夹存放了html格式的说明文档,里面有函数的解释。
4.1.2 documents/res/
??res文件夹提供一些应用示例(app1~6.c)、原理示意图以及格式化对照表(mkfs.xlsx)
4.2 source文件夹
??source文件夹是FatFs的源码。
??FatFs源码不多,只有4个C文件和3个H文件(0.14版本)。
4.2.1 底层source/diskio.c、source/diskio.h
??diskio是FatFs的IO层实现,官方提供了框架,移植时只需要完善其中的一些函数即可,十分友好。
函数 | 作用 |
---|---|
disk_initialize | 初始化驱动 |
disk_status | 获取驱动状态 |
disk_initialize | 初始化驱动 |
disk_read | 读扇区 |
disk_write | 写扇区 |
disk_ioctl | 用于实现各种各样的功能 |
4.2.2 应用接口source/ff.c、source/ff.h
??ff.c/ff.h是应用接口的实现,属于FatFs源码,移植无需修改。应用时只需要调用其中函数即可。
??常用的文件的开/关(f_open
/f_close
)、读/写(f_read
/f_write
) 以及目录的相关操作接口都在这里。由于函数较多,这里不深入研究。
4.2.3 宏配置source/ffconf.h
??ffconf.h内是关于FatFs的配置选项。这个文件增加了可移植性。我们可以通过配置相关选项使能/禁止某些功能,控制内存资源的消耗。这些宏的解释,后期通过其他文章说明。
4.2.4 操作系统相关source/ffsystem.c
??ffsystem.c是FatFs的OS相关函数示例代码。如果你移植在操作系统上,且配置FF_USE_LFN==3
或FF_FS_REENTRANT
为真,那么就需要将该文件添加到工程内。
??该文件内函数已预置了部分操作系统的样例,包括Win32、uITRON、uC/OS-II、FreeRTOS和CMSIS-RTOS,基本上在函数内只需要选择其中一种,友好到爆。下面是其中一个函数:
/*------------------------------------------------------------------------*/
/* Release Grant to Access the Volume */
/*------------------------------------------------------------------------*/
/* This function is called on leaving file functions to unlock the volume. */void ff_rel_grant (FF_SYNC_t sobj /* Sync object to be signaled */
)
{
/* Win32 */ReleaseMutex(sobj);/* uITRON */
// sig_sem(sobj);/* uC/OS-II */
// OSMutexPost(sobj);/* FreeRTOS */
// xSemaphoreGive(sobj);/* CMSIS-RTOS */
// osMutexRelease(sobj);
}
??FF_USE_LFN==3
:启用 LFN,且使用堆上的动态工作缓冲区。
??FF_FS_REENTRANT
为真:启用重写入。
4.2.5 unicode编码source/ffunicode.c
??ffsystem.c用于unicode编码,里面有大量的unicode相关数组。
??FF_USE_LFN
为真时必须包含此文件。
??当将FatFs用 DBCS 配置 LFN 时,这个模块将在.const部分占用大量内存。如果系统使用Unicode进行代码转换,则应该修改此模块以使用该函数,以避免无谓的内存消耗。
??DBCS包含:
????932 - Japanese (DBCS) 、
????936 - Simplified Chinese (DBCS)、
????949 - Korean (DBCS)、
????950 - Traditional Chinese (DBCS)
5. FatFs补丁
??FatFs补丁网址:http://elm-chan.org/fsw/ff/patches.html
??网址上会公布已发现并解决的BUG,以补丁形式发布。以R0.14版本为例,该版本有三个补丁。因此,下载FatFs R0.14源码后,使用前按日期顺序给源码打补丁。(从最早发布的开始)
??以上是本文的全部,很荣幸写的文章被阅读完。
??刚入门的小白,如果本文有错欢迎大家提醒,十分感谢。