FATFS

来源:互联网 发布:sass软件是什么意思 编辑:程序博客网 时间:2024/05/16 14:44

FATFS是一个完全免费开源的FAT 文件系统模块,专门为小型的嵌入式系统而设计。它完
全用
标准C 语言编写,所以具有良好的硬件平台独立性,可以移植到8051、PIC、AVR、SH、
Z80、H8、ARM 等系列单片机上而只需做简单的修改。它
支持FATl2、FATl6 和FAT32,支持
多个存储媒介;有独立的缓冲区,可以对多个文件进行读/写,并特别对8 位单片机和16 位
单片机做了优化。 
FATFS的特点有: 
  Windows兼容的FAT文件系统(支持FAT12/FAT16/FAT32) 
  
与平台无关,移植简单 
  代码量少、效率高 
  多种配置选项 
  支持多卷(物理驱动器或分区,最多10个卷) 
  多个ANSI/OEM代码页包括DBCS 
  支持长文件名、ANSI/OEM或Unicode 
  支持RTOS 
  支持多种扇区大小 
  只读、最小化的API和I/O 缓冲区等 
FATFS的这些特点,加上免费、开源的原则,使得FATFS应用非常广泛。FATFS模块的层
次结构如图45.1.1 所示: 



最顶层是应用层,使用者无需理会FATFS 的内部结构和复杂的FAT 协议,只需要调用
FATFS模块提供给用户的一
系列应用接口函数,如f_open,f_read,f_write 和f_close等,就可
以像在PC 上读/写文件那样简单。 
中间层FATFS模块
,实现了FAT 文件读/写协议。FATFS模块提供的是ff.c和ff.h。除非
有必要,使用者一般不用修改,使用时将头文件直接包含进去即可。 
需要我们编写移植代码的是FATFS模块提供的底层接口
,它包括存储媒介读/写接口(disk 
I/O)和供给文件创建修改时间的实时时钟。 
FATFS的源码,大家可以在:http://elm-chan.org/fsw/ff/00index_e.html  这个网站下载到,目
前最新版本为R0.09a。本章我们就使用最新版本的的FATFS作为介绍,下载最新版本的FATFS
软件包,解压后可以得到两个文件夹:doc和src。doc里面主要是对FATFS的介绍,而src里面才是我们需要的源码。 
其中,与平台无关的是: 
ffconf.h      FATFS模块配置文件 
ff.h        FATFS和应用模块公用的包含文件 
ff.c        FATFS模块 
diskio.h      FATFS和disk I/O模块公用的包含文件 
interger.h     数据类型定义 
option      可选的外部功能(比如支持中文等) 
与平台相关的代码(需要用户提供)是: 
diskio.c      FATFS和disk I/O模块接口层文件 

FATFS模块在移植的时候,我们一般只需要修改2个文件,即ffconf.h和diskio.c。FATFS
模块的所有配置项都是存放在ffconf.h 里面,我们可以通过配置里面的一些选项,来满足自己
的需求。接下来我们介绍几个重要的配置选项。 

1)_FS_TINY。这个选项在R0.07版本中开始出现,之前的版本都是以独立的C文件出现
(FATFS和Tiny  FATFS),有了这个选项之后,两者整合在一起了,使用起来更方便。我们使
用FATFS,所以把这个选项定义为0即可。 
2)_FS_READONLY。这个用来配置是不是只读,本章我们需要读写都用,所以这里设置
为0即可。 
3)_USE_STRFUNC。这个用来设置是否支持字符串类操作,比如f_putc,f_puts等,本章
我们需要用到,故设置这里为1。 
4)_USE_MKFS。这个用来定时是否使能格式化,本章需要用到,所以设置这里为1。 
5)_USE_FASTSEEK。这个用来使能快速定位,我们设置为1,使能快速定位。 
6)_CODE_PAGE。这个用于设置语言类型,包括很多选项(见FATFS 官网说明),我们
这里设置为936,即简体中文(GBK码,需要c936.c文件支持,该文件在option文件夹)。 
7)_USE_LFN。该选项用于设置是否支持长文件名(还需要_CODE_PAGE支持),取值范
围为0~3。0,表示不支持长文件名,1~3是支持长文件名,但是存储地方不一样,我们选择使
用3,通过ff_memalloc函数来动态分配长文件名的存储区域。 
8)_VOLUMES。用于设置FATFS支持的逻辑设备数目,我们设置为2,即支持2个设备。 
9)_MAX_SS。扇区缓冲的最大值,一般设置为512。 
其他配置项,我们这里就不一一介绍了,FATFS的说明文档里面有很详细的介绍,大家自
己阅读即可。下面我们来讲讲FATFS的移植,FATFS的移植主要分为3步: 
①  数据类型:在integer.h 里面去定义好数据的类型。这里需要了解你用的编译器的数 
据类型,并根据编译器定义好数据类型。 
②  配置:通过ffconf.h配置FATFS的相关功能,以满足你的需要。 
③  函数编写:
打开diskio.c,进行底层驱动编写,一般需要编写6 个接口函数,如


通过以上三步,我们即可完成对FATFS的移植。 
  第一步,我们使用的是MDK3.80a编译器,器数据类型和integer.h 里面定义的一致,所以
此步,我们不需要做任何改动。 
  第二步,关于ffconf.h里面的相关配置,我们在前面已经有介绍(之前介绍的9个配置),
我们将对应配置修改为我们介绍时候的值即可,其他的配置用默认配置。 
第三步,因为FATFS模块完全与磁盘I/O 层分开,因此需要下面的函数来实现底层物理磁
盘的读写与获取当前时间。底层磁盘I/O 模块并不是FATFS的一部分,并且必须由用户提供。
这些函数一般有6个,在diskio.c里面。 
首先是disk_initialize函数,

第二个函数是disk_status函数,

第三个函数是disk_read函数,

第四个函数是disk_write函数,

第五个函数是disk_ioctl函数,

最后一个函数是get_fattime函数.

以上六个函数,我们将在软件设计部分一一实现。通过以上3 个步骤,我们就完成了对
FATFS的移植,就可以在我们的代码里面使用FATFS了。 
  FATFS提供了很多API函数,这些函数FATFS的自带介绍文件里面都有详细的介绍(包括
参考代码),我们这里就不多说了。这里需要注意的是,在使用FATFS的时候,必须先通过f_mount
函数注册一个工作区,才能开始后续API的使用,关于FATFS的介绍,我们就介绍到这里。大
家可以通过FATFS自带的介绍文件进一步了解和熟悉FATFS的使用.



原创粉丝点击