目录
1. FatFs文件系统简介
简而言之,文件系统即为,在存储设备上组织文件的方法。常见的windows下的文件系统格式包括FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。
FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式。
官方文档及源码可以从FatFs官网获取:
http://elm-chan.org/fsw/ff/00index_e.html
以下皆以最新的R0.13c版本移植。
1.1 FatFs的目录结构
FatFs的官网获取源码,最新版本为R0.13c,解压之后可看到里面有 documents和 source 这两个文件夹。
1.2 FatFs帮助文档
打开 documents文件夹
其中,doc 这两个文件夹里面是编译好的html文档,讲的是FATFS里面各个函数的使用方法; res 需要用到的图片。
00index_e.html 直接打开,可以看到系统简介,及相关API的介绍,具体链接doc的相关函数介绍文档。
1.3 FatFs源码
打开 source 文件夹
- 00readme.txt This file.
- 00history.txt 版本历史
- ff.c FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
- ffconf.h FatFs功能配置的宏定义,可以根据需要裁剪其功能
- ff.h FatFs和应用程序模块的通用包含文件。
- diskio.h FatFs和磁盘I / O模块的公共包含文件。
- diskio.c 包含底层存储介质的操作函数,这些函数需要用户自己实现,主要添加底层驱动函数。
- ffunicode.c 可选的Unicode实用程序功能
- ffsystem.c 可选的O / S相关功能的。
文件阅读顺序 diskio.c --> ff.c,阅读文件系统源码ff.c文件需要一定的功底,建议读者先阅读FAT32的文件格式,再去分析ff.c文件。
2. FatFs 文件系统的移植
2.1 FatFs 分层体系
用户应用程序需要由用户编写,一般我们只用到f_mount()、f_open()、f_write()、f_read()就可以实现文件的读写操作.
FatFs组件是FatFs的主体,文件都在源码src文件夹中,其中ff.c、ff.h、ffunicode.c.以及diskio.h四个文件我们不需要改动,只需要修改ffconf.h和diskio.c两个文件,根据是否有操作系统修改ffsystem.c。
2.1 FatFs 移植步骤
在此以秉火429 SPI Flash芯片作为物理存储设备,驱动具体驱动不做赘述,具体见链接
https://blog.csdn.net/XieWinter/article/details/95077050
2.1.1 添加 FatFs 源码到工程
源码直接解压拷贝,添加到工程,并包含相关的H文件。因为未使用到操作系统,所以屏蔽掉了ffsystem.c,如下图:
如果直接编译会发现会出错,因此需要修改diskio.c,系统默认使用日语,需要支持中文的话需要修改ffconf.h,当然,相关的裁剪根据需要,配置ffconf.h相关的宏。
配置ffconf.h,宏定义对应的功能,代码中都有说明,具体的配置范围可以见官方配置说明
http://elm-chan.org/fsw/ff/doc/config.html
具体配置,可以通过对比软件来查看与官方源码的差异点,这样有助于理解。
/*---------------------------------------------------------------------------/
/ FatFs Functional Configurations
/---------------------------------------------------------------------------*/
#define FFCONF_DEF 86604 /* Revision ID */
/*---------------------------------------------------------------------------/
/ Function Configurations
/---------------------------------------------------------------------------*/
#define FF_FS_READONLY 0
/* 此选项可切换只读配置,默认为可读写(0). (0:Read/Write or 1:Read-only)
/ Read-only configuration removes writing API functions, f_write(), f_sync(),
/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()
/ and optional writing functions as well. */
#define FF_FS_MINIMIZE 0
/* 此选项定义最小化级别以删除一些基本API函数。
/
/ 0: Basic functions are fully enabled.
/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()
/ are removed.
/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.
/ 3: f_lseek() function is removed in addition to 2. */
#define FF_USE_STRFUNC 0
/* 此选项切换字符串函数, f_gets(), f_putc(), f_puts() and f_printf(