FATFS文件系统使用分析 -----东方青 一、FATFS文件系统概述 FatFS 是一个为小型嵌入式系统设计的通用FAT(File Allocation Table)文件系统模块。FatFs 的编写遵循ANSI C,并且完全与磁盘I/O层分开。因此,它独立(不依赖)于硬件架构。它可以被嵌入到低成本的微控制器中,如AVR, 8051, PIC, ARM, Z80, 68K 等等,而不需要做任何修改。其主要具有与Windows FAT系统兼、不依赖于任何平台、可移植性高、代码和工作区占用空间非常小等特点。
二、FATFS文件系统移植 1、获取FATFS代码资源 以上链接地址即为FATFS官网,其内容简洁易懂,并在最下方可以下载FATFS源码与应用实例。目前最新版本为0.13版。
2、源码列举 下载FATFS源码后,可得到如下图源文件:
其中ff.c为FATFS文件系统重量级的文件,FATFS文件系统的应用操作接口API均在此文件实现,对于移植而言,ff.c文件不需要做任何修改,ffsystem.c和ffunicode.c更不需要任何修改。实际上只有diskio.c和diskio.h文件与底层的硬件操作相关。期内部分别存在以下几个接口: (1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)
(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)
(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
以上所有均为FATFS文件系统自带的与底层交互的接口,可以看出,一个文件系统可以支持多个存储设备,当需要时只需在对应的接口实现底层函数即可,这使得移植变得很简单。 3、移植FATFS 实际上就是在diskio.c文件提供的接口中实现底层存储设备的操作功能,按照diskio.c文件提供的借款为上层提供应用接口,起到承上启下的作用。 宏定义:
本文所使用的板卡中的SD卡为SPI接口的SD卡,所以其标识宏定义为SDSPIDISK。至此标识SDSPIDISK就代表这个SPI接口的SD卡。 (1)物理设备状态获取函数:DSTATUS disk_status (BYTE pdrv)
(2)物理设备初始化函数:DSTATUS disk_initialize (BYTE pdrv)
(3)物理设备读一个扇区函数:DRESULT disk_read (BYTE pdrv,BYTE *buff,DWORD sector,UINT count)
(4)物理设备写一个扇区函数:DRESULT disk_write (BYTE pdrv,const BYTE *buff,DWORD sector,UINT count)
(5)物理磁盘控制函数:DRESULT disk_ioctl (BYTE pdrv,BYTE cmd,void *buff)
有以上实现可知,所以关于SDSPIDISK 设备的接口都是在SD卡驱动中进行实现了,然后就调用其驱动即可。这个可以去分析LPC54110 Board开发板的源代码。关于驱动在此不多说。 那么实际上到了这一步,我们基本上可以确认,对于FATFS文件系统的移植,只需要在底层的驱动中将对应的接口调用,就可以直接使用了。 三、FATFS文件系统的应用编程 1.挂载
其中参数g_fileSystem表示当前挂载的文件系统,driverNumberBuffer代表当前的物理设备,按照磁盘的表示格式,因为定义当前SPI接口的SD卡的标号为SDSPIDISK,宏定义为4,那么代表当前SD卡根分区的标识为”4:/”。其原型如下:
其第3个参数opt表示初始化选项,当opt=0时,表示现在不装载/安装根文件系统;当opt=1时,现在安装根文件系统。 2.实现在SD卡的根分区创建一个文件“hello.c”,并通过接口f_write在文件hello.c中写入字符串”Hello World!!rn”,然后通过接口f_read将数据读取并打印出来,最后关闭文件。
程序运行后,效果如下图:
如上图效果,成功的实现了在文件系统中操作文件当然,存在的一个问题就是时间不对,例如以上文件的创建时间为2015-1-1,这是因为在系统中还没有实现RTC时间内获取。 3.在SD卡根文件系统中创建一个目录,并在目录中创建一个文件,然后对文件写一段数据,最后再出去出来,打印在串口助手上显示。
程序运行完后,有如下效果:
如上图即为程序运行后的现象了。 4.关于FATFS应用接口的使用 实际上FATFS官网已经为我们提供了非常详细的应用教程和示例,只需要参看这些说明和示例,就完全可以使用FATFS文件系统了,非常简单。 |