赞
踩
即使读者可能不了解文件系统,读者也一定对“文件”这个概念十分熟悉。数据在PC上是以文件的形式存储在磁盘中的,这些数据的形式一般为ASCII码或二进制形式。在上一章我们已经写好了SPI FLASH芯片的驱动函数,我们可以非常方便的在SPI FLASH芯片上读写数据。譬如我们需要记录一段文字,可以把这些文字转换成ASCII码,存储在数组中,然后调用SPI_FLASH_BufferWrite函数,把数组内容写入到SPI FLASH芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以ASCII,码的格式进行解读。
但是这样直接存储数据会带来极大的不便,譬如难以记录有效数据的位置,难以确定存储介质的剩余空间,以及应以何种格式来解读数据。就如同一个巨大的图书馆无人管理,杂乱无章地存放着各种书籍,难以查找所需的文档。想象一下图书馆的采购人员购书后,把书籍往馆内一扔,拍拍屁股走人,当有人来借阅某本书的时候,就不得不一本本的查找。这样直接存储数据的方式对于小容量的存储介质如EEPROM还可以接受,但是对于SPI FLASH芯片或者SD卡之类的大容量设备,我们需要一种高效的方式来管理它的存储内容。
这些管理方式即为文件系统,它是为了存储和管理数据,而在存储介质建立的一种组织结构,这些结构包括操作系统引导区、目录和文件。常见的Windows下的文件系统格式包括FAT32、NTFS、exFAT。在使用文件系统前,要先对存储介质进行格式化。格式化先擦除原来内容,在存储介质上新建一个文件分配表和目录。这样,文件系统就可以记录数据存放的物理地址,剩余空间。
使用文件系统时,数据都以文件的形式存储。写入新文件时,先在目录中创建一个文件索引,它指示了文件存放的物理地址,再把数据存储到该地址中。当需要读取数据时,可以从目录中找到该文件的索引,进而在相应的地址中读取出数据。具体还涉及到逻辑地址、簇大小、不连续存储等一系列辅助结构或处理过程。
文件系统的存在使我们在存取数据时,不再是简单地向某个物理地址直接读写,而是要遵循它的读写格式。如经过逻辑转换,一个完整的文件可能被分开成多段存储到不连续的物理地址,使用目录或链表的方式来获知下一段的位置。
上一章的SPI FLASH芯片驱动只完成了向物理地址写入数据的工作,而根据文件系统格式的逻辑转换部分则需要额外的代码来完成。实质上,这个逻辑转换部分可以理解为当我们需要写入一段数据时,由它来求解向什么物理地址写入数据、以什么格式写入及写入一些原始数据以外的信息(如目录)。这个逻辑转换部分代码我们也习惯称之为文件系统。
上面提到的逻辑转换部分代码(文件系统)即为本章的要点,文件系统庞大而复杂,它需要根据应用的文件系统格式而编写,而且一般与驱动层分离开来,很方便移植,所以工程应用中一般是移植现成的文件系统源码。
FatFs是面向小型嵌入式系统的一种通用的FAT文件系统。它完全是由AISI C语言编写并且完全独立于底层的IO介质。因此它可以很容易地不加修改的移植到其他的处理器当中,如8051、PIC、AVR、SH、Z80、H8、ARM等。FatFs支持FAT12、FAT16、FAT32等格式,所以我们利用前面写好的SPI FLASH芯片驱动,把FatFs文件系统代码移植到工程之中,就可以利用文件系统的各种函数,对SPI FLASH芯片以“文件”格式进行读写操作了。
FatFs文件系统的源码可以从fatfs官网下载:http://elm-chan.org/fsw/ff/00index_e.html
在移植FatFs文件系统到开发板之前,我们先要到FatFs的官网获取源码。官网有对FatFs做详细的介绍。解压后可以看到里面有doc和src两个文件夹。doc文件夹里面是一些使用帮助文档。src才是FatFs文件系统的源码。
doc帮助文档:
其中en和ja这两个文件夹里面是编译好的html文档,讲的是FATFA里面各个函数的使用方法,这些函数都是封装的非常好的函数,利用这些函数我们就可以操作SPI FLASH芯片。这两个文件夹的唯一区别就是en文件夹下的文档是英文的,ja文件夹下的是日文的。img文件夹包含en和ja文件夹下文件需要用到的图片,还有四个名为app.c文件,内容都是FatFs具体应用例程。00index_e.html和00index_j.html是一些关于FATFS的简介,至于另外两个文件可以不看。
src FATFS源码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。