第24章
基于FLASH的FatFs文件系统移植
24.1
文件系统
即使读者可能不了解文件系统,读者也一定对“文件”这个概念十分熟悉。数据在PC上是以文件的形式储存在磁盘中的,这些数据的形式一般为ASCII 码或二进制形式。在上一章我们已经写好了串行 Flash芯片的驱动函数,我们可以非常方便的在串行Flash芯片上读写数据。如需要记录文字,可以把这些文字转化成相应编码的字符串,存储在数组中,然后调用串行FLASH的写函数,把数组内容写入到串行Flash芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以相应编码的格式进行解读。
但是,这样直接存储数据会带来极大的不便,如难以记录有效数据的位置,难以确定存储介质的剩余空间,以及应以何种格式来解读数据。就如同一个巨大的图书馆无人管理,杂乱无章地存放着各种书籍,难以查找所需的文档。想象一下图书馆的采购人员购书后,把书籍往馆内一扔,拍拍屁股走人,当有人来借阅某本书的时候,就不得不一本本地查找。这样直接存储数据的方式对于小容量的存储介质如EEPROM还可以接受,但对于大容量Flash芯片或者SD卡之类的大容量设备,我们需要一种高效的方式来管理它的存储内容。
这些管理方式即为文件系统,它是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。常见的windows下的文件系统格式包括FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址、剩余空间。
使用文件系统时,数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据。具体还涉及到逻辑地址、簇大小、不连续存储等一系列辅助结构或处理过程。
文件系统的存在使我们在存取数据时,不再是简单地向某物理地址直接读写,而是要遵循它的读写格式。如经过逻辑转换,一个完整的文件可能被分开成多段存储到不连续的物理地址,使用目录或链表的方式来获知下一段的位置。
上一章的串行Flash芯片驱动只完成了向物理地址写入数据的工作,而根据文件系统格式的逻辑转换部分则需要额外的代码来完成。实质上,这个逻辑转换部分可以理解为当我们需要写入一段数据时,由它来求解向什么物理地址写入数据、以什么格式写入及写入一些原始数据以外的信息(如目录)。这个逻辑转换部分代码我们也习惯称之为文件系统。
24.2
FatFs文件系统介绍
上面提到的逻辑转换部分代码(文件系统)即为本章的要点,文件系统庞大而复杂,它需要根据应用的文件系统格式而编写,而且一般与驱动层分离开来,很方便移植,所以工程应用中一般是移植现成的文件系统源码。
FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由ANSI C语言编写并且完全独立于底层的I/O介质。因此它可以很容易地不加修改地移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式,所以我们利用前面写好的串行Flash芯片驱动,把FatFs文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对串行Flash芯片以“文件”格式进行读写操作了。
FatFs文件系统的源码可以从FatFs官网下载:
FatFs官网
http://elm-chan.org/fsw/ff/00index_e.html
FatFs源码下载连接
http://elm-chan.org/fsw/ff/archives.html
24.2.1
FatFs特性
DOS/Windows兼容的FAT/exFAT文件系统。
与平台无关,易于移植。
程序代码和工作区的占用空间非常小。
支持以下各种配置选项:
ANSI/OEM或Unicode中的长文件名。
exFAT文件系统,64位LBA和GPT可存储大量数据。
RTOS的线程。
多个卷(物理驱动器和分区,最多10个卷)。
可变扇区大小。
多个代码页,包括DBCS。
只读,可选API,I/O缓冲区等…
24.2.2
FatFs层级结构
FatFs层级结构如下:

应用层调用FatFs模块接口,FatFs调用底层接口,实现对USB、SD卡等存储设备的操作(需提供RTC时钟给FatFs模块)。
24.3
源码下载

FatFs和Petit FatFs:
PetitFatFs是用于小型8位微控制器的FatFs模块的子集。它是按照ANSI C编写的,并且与磁盘I/O层完全分开。即使RAM大小小于扇区大小,也可以将其合并到内存有限的微型微控制器中。我们这里选择完整版的FatFs。
24.3.1
源码结构
在移植FatFs文件系统到开发板之前,我们先要到 FatFs的官网获取源码,官网有对FatFs做详细的介绍,有兴趣可以了解。解压之后可看到里面有 documents和source这两个文件夹和LICENSE.txt文件,见图FatFs文件目录。documents文件夹里面是一些使用帮助文档;source才是FatFs文件系统的源码。而LICENSE.txt则是使用FatFs所需遵循的许可证。
FatFs 0.15版本的源码结构如下:


24.3.1.1
FatFs帮助文档
打开documents文件夹,可看到如图documents文件夹的文件目录:

documents这个文件夹下面存放的是FatFs模块文档:
• 其中doc文件夹里面是编译好的html文档,讲的是FatFs里面各个函数的使用方法,这些函数都是封装好的函数,利用这些函数我们就可以操作串行Flash芯片。
• res文件夹包含doc文件夹下文件需要用到的图片,还有四个名为app.c文件,内容都是FatFs具体应用例程。
• 00index_e.html相当于FatFs的主页。
• updates.txt记录了各个版本的更新。
24.3.1.2
FatFs源码
打开src文件夹,可看到如图source文件夹的文件目录:

source这个文件夹下面存放的是FatFs源码:
• diskio.c/.h:IO层的实现。
• ff.c/.h:FatFs核心文件,文件管理的实现方法。该文件独立于底层介质操作文件的函数,利用这些函数实现文件的读写。
• ffconf.h:这个头文件包含了对FatFs功能配置的宏定义,通过修改这些宏定义就可以裁剪FatFs的功能。
• ffsystem.c:操作系统相关。
• ffunicode.c:unicode编码相关。FF_USE_LFN !=0时必须包含此文件。
• 00history.txt:介绍了FatFs的版本更新情况。
• 00readme.txt:说明了当前目录下各个文件的功能。
24.3.2
长文件名
FatFs模块支持FAT文件系统的长文件名(LFN)扩展名。默认情况下,禁用LFN。如果要启用LFN,要将FF_USE_LFN设置为1、2或3,并将ffunicode.c文件添加到项目中。LFN功能需要一定的工作缓冲区。缓冲区大小可由FF_MAX_LFN根据可用内存配置。LFN的长度最多可以为255个字符,因此FF_MAX_LFN也应设置为255。

24.3.3
FatFs限制
文件系统类型:FAT、FAT32(rev0.0)和exFAT(rev1.0)。
打开的文件数量:无限制。(取决于可用内存)
卷数:最多10个。
扇区大小:512、1024、2048和4096字节。
最小卷大小:128个扇区。
最大卷大小:32位LBA中的2^32-1扇区,在带有exFAT的64位LBA中几乎不受限制。
最大文件大小:FAT卷上为2^32-1字节,exFAT卷上几乎不受限制。
群集大小:FAT卷上最多128个扇区,exFAT 卷上最多16MB。
24.3.4
FatFs的已知问题
扫描下方二维码或复制链接到浏览器查看:记录着有关Fatfs最新版本的已知问题以及问题的解决方法或补丁。
下载链接
http://elm-chan.org/fsw/ff/patches.html

网址上会公布已发现并解决的BUG,以补丁形式发布。以R0.14b版本为例,目前该版本有2个补丁。
有需要的话可以按照官方提供的方法对源码进行修改,由于我们这里使用的都是一些比较基础的功能,这些功能是没有问题的,所以就不进行修改了。
全部0条评论
快来发表一下你的评论吧 !