c++ 把文件的信息全部取出重新存入新信息_第13章 基于SD卡的FatFs文件系统

第13章 基于SD卡的FatFs文件系统

文件作为信息的集合被存储在硬盘,SD卡、Flash等存储设备上,为了读写更加高效方便,通常使用文件系统来管理文件,常见的文件系统有FAT,NTFS,EXT,UFS,HFS+等等。FatFs作为一款小型嵌入式的通用文件系统,被广泛用于微型微控制器中。它符合ANSI C格式,并与磁盘I / O层完全分离,使得它既独立于平台,又可以集成到资源有限的小型微控制器中。

113.1 什么是文件系统

这里所讲的文件相对于计算机系统而言,如图片、文本文档、程序等都可称之为文件。文件,简而言之就是信息的集合,以特定的结构存储在存储设备中。

文件系统是操作系统用于明确存储设备上的文件的方法和数据结果,即在存储设备上组织文件的方法。从系统角度来看,文件系统是对文件存储设备的地址进行组织和分配,负责文件存储并读存入的文件进行保护和检索的系统。具体的说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。

213.2 FatFs文件系统

13.2.1 FatFs运行原理

FatFs(FAT Filesystem)是用于小型嵌入式系统的通用FAT / exFAT文件系统模块,其中FAT(File Allocation Table)是“文件分配表”的意思,简称FAT表,它是微软在FAT文件系统中用于文件索引和定位的一种链式结构,实际就是通过表格记录文件信息和存储位置。

其特点如下:

1、Windows兼容FAT文件系统

2、不依赖平台,易于移植

3、代码和工作区占用空间小

4、支持裁剪、多卷(无论驱动器和分区)连接,RTOS(实时操作系统)等多项配置

FAT文件系统将磁盘以一定数目扇区为单位进行划分,该单位称为簇,而FAT表是记录磁盘数据索引的一种簇链结构。通常情况下,簇的大小是 2n (n为整数)个扇区的大小,一般为512B,1K,2K,4K,8K,16K,32K,64K,通常不超过32K。以FAT16为例,FAT表中的每个记录项占16bit,如果以扇区而不是簇为单位而不是进行磁盘的分配,会大量增加FAT表中的记录项,增加对大文件存取消耗,降低了文件的执行系统效率。

下面通过模拟一个磁盘存储数据的过程简单介绍FAT文件系统的存储原理。假如现在有一个大小为100KB的磁盘,为了存储方便,将其划分为100份,每份1KB(假设为1个簇)。现在使用磁盘顺序存储下面几个文件:A.txt(10KB),B.mp3(56.9KB),C.jpg(23.1KB),其存储结构如图13- 1所示。

19650c5725ab8d7b7b07015fdbe12750.png 

图13-1 顺序存储文件示意图

其中目录用于存储文件的文件的名称、起始簇号和偏移地址、存储时间等信息,方便读写文件。为了管理方便将目录又分为10等份,目录内容如表13-1所示。

                 表13-1 目录存储格式

71f5bbde3b0126434c01c4aac21f511d.png

   这种存储方式能够方便的存储文件,不用担心忘记文件的存储位置,但是该方式也存在不足之处。比如向A.txt增加内容,发现后面近跟着B文件,无法继续增加。另外,如果把B文件删除掉,其空间随之释放,但是B文件释放的空间只能存储不超过57簇的文件。如何才能更合理的存储和管理文件呢?


根据以上问题,设计一种新的存储机制:1、允许文件不连续存储;2、增加一个文件分配表,采用簇号映射文件机制。不连续存储指的是以簇为单位映射文件,即一个簇存储文件的一部分,多个簇存储的内容连接起来就构成一个完整的文件。在这种机制下A文件增加的内容可以存储在C文件后的剩余空间中,如图13-2所示。

f75aa1954e2338ac774f3a66710c7cb8.png 

图13-2 改进型存储结构示意图

如何读取分散存储的A.txt文件中的内容呢?答案在于文件分配表。文件分配表采用链式结构来表示文件占有簇的关系,具体如表13-2所示。文件分配表内每个记录项占若干比特(Bit),所记录的索引是当前数据所在文件的下一簇数据的簇号。

首先目录位于第1簇,并且仅占一簇,因此第一个索引项内容为FF,表示此文件记录到此结束。从目录中可得知A.txt所存储的数据从第2簇开始,而分配表中第2个记录项索引为3,表示A.txt的数据继第2簇后存储在磁盘的第3簇,同理依次往下查,一直到11簇的索引为FF,表示A.txt文件结束,其他文件同理。当分配表中的索引项为00时,表示对应磁盘中的存储空间未被占用。

表13-2文件分配表(1)

b1492c4b69dfd09d09f0a3ded85f5a4f.png 

当文件重新添加或删减内容后,对应文件分配表中的记录项也随之改变。比如A.txt增加内容存储在磁盘的第93~95簇中,则文件分配表中第11项记录的索引由FF变为93,93表示增添内容的所在簇号;找到第93记录项,其索引号为94......直至第95项记录,登记的索引为FF,表示A.txt文件至此结束,其结构如表13-3所示。

表13-3文件分配表(2)

c9e376f8937db59bab933f55a379ee70.png 

13.2.2 FatFs分区结构

当在分区上创建FAT文件系统时,文件系统便会将分区作为整块可分配的区域进行规划,以便于数据的存储。FAT文件系统主要将分区划分为引导区(包括主引导记录MBR和系统引导记录DBR)、FAT表、根目录区和数据区和保留区,其结构如图13-3所示。

b9d92f9df0edb471a108fe06b70e1437.png 图13-3 FatFs分区结构图

MBR:保存磁盘的分区信息(分区的起始地址、分区大小、分区结束地址)。

DBR:保存了当前分区的详细参数(比如FAT表的位置、FAT表的的大小、簇大小、扇区大小、根目录中最大目录项数等等)

FAT表:以簇为单位对数据区重新划分空间,在FAT表中建立了簇的使用情况。

目录:根目录中存在众多的目录项,目录项用于记录了文件名、大小、起始地址等等。

数据区:以簇为单位存储数据。

按FAT表记录簇号的位数,可以分为FAT12、FAT16、FAT32、exFAT等版本。以 FAT16 为例,簇号在FAT表中占据2字节(16位),FAT16可以表示的最大簇号为216=65535,以每簇最大32K计算,其管理的最大磁盘空间为:32KB×65535=2048MB,即FAT16最大支持2GB的磁盘。而FAT32中将FAT表中记录簇号的二进制位数扩展到了32位,故而这种文件系统称为FAT32。FAT32最大支持8TB,exFAT(扩展FAT表)最大支持16EB(理论值:16×1024×1024TB)。

13.2.3 FatFs组织结构及内存占用情况

通常软件架构设计中采用分层设计,即用户编写的应用程序位于上层,跨越应用模块的功能程序(FatFs模块,图形界面等)位于中层,而配置底层设备的驱动程序位于底层。通过分层设计,可以限制各部分间的依赖关系,使系统以更松散的方式耦合,从而提高应用程序的可维护性,并使其更容易扩展,有利于提升性能。

FatFs是独立于底层设备与用户程序之外的通用文件系统模块,也就是中间层插件。用户只需要将硬件驱动连接到FatFs的磁盘接口,即可通过调用FatFs的应用函数对设备进行操作,而不需要关心设备类型,数据如何存储等底层操作。一个完整的FatFs工程由四部分组成:用户程序、FatFs文件系统模块、底层驱动、物理设备,其组织结构如图13-4组成。使用时只需要将底层设备驱动与FatFs模块接口相连接即可。

64167083fe16d4d16dd32faa0c1cd30a.png

图13-4 FatFs系统组织结构

现在我们已经知道了什么是文件系统,FatFs存储机制和分区结构,在移植FatFs之前,需要评估一下FatFs的资源占用情况,即单片机是否能够运行FatFs模块。内存使用量大小取决于FatFs配置选项,表13-4列举了FatFS在特定配置下的ROM(内部Flash)和RAM使用情况。由于FatFs具有可裁剪配置,根据使用可以对API函数进行裁剪,以减少资源占用,在完全配置下FatFs占用6.3k占用RAM和2.8k ROM,最小占用4.3k RAM和2.3k ROM。已知STM32F103ZE拥有512k Flash和64K SRAM,因此完全可以运行FatFs模块。

表13-4 FatFs模块ROM和RAM消耗参考

8c02cda15cbf8a6377900c7ca35b62b5.png 

V表示宏_VOLUMES(卷的个数)定义的值;

F表示打开的文件数。

宏_FS_READONLY表示读写限制,0表示读/写(R/W),1表示只读(R/O);

宏_FS_MINIMIZE用于函数裁剪,0表示全功能版(Full),3为最小功能(Min);

宏_FS_TINY用于模式配置,0表示正常模式,1表示微型模式。

313.3 移植FAT32文件系统

13.3.1 新建FatFs工程

1、获取FAT32源码:打开“配套光盘资料\Kingst-32F1开发板资料\FatFs源码”目录,

找到ff13b版本FatFs源码,或者登陆FatFs官网,下拉找到Resources目录,点击图13-5所示红色方框标记处下载最新版本的FatFs源码,R0.13b为版本号,由于持续更新,版本略有变动。

7cd712d51b610c4f753fe448f4679b85.png 图13-5  FatFs官网源码下载

2、复制上一章的SD卡工程,修改一下工程名称,在工程目录下新建一个“FatFs”文件夹,并将下载的FatFs源码全部复制到该文件夹下,如图13-6所示。

其中documents文件夹为说明文档,source文件夹为FatFs源代码,具体相关文件作用如表13-5所示。

9852d9774f56d52fcfab997db5a9f6b1.png

  图13-6 复制FatFs源码

表13-5 FatFs源文件列表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值