APP下载

基于MCF51QE128的SD卡文件系统设计※

2010-06-25童静

单片机与嵌入式系统应用 2010年7期
关键词:偏移量扇区子程序

童静

(湖北工业大学,武汉 430068)

童静(讲师),主要研究方向为单片机与嵌入式开发。

引 言

MCF51QE128微控制器是Freescale公司生产的8位/32位兼容的低功耗微处理器。工作电压的典型值是3.6 V,与SD卡的工作电压兼容,可直接与SD卡连接而无需电平转换电路。SD卡因为其体积小、功耗低、容量大且成本低,目前被广泛应用于各类嵌入式数据采集系统中。本文针对此类应用,通过实测512 MB SD卡数据,以实例的形式深入解析了FAT16文件系统的存储原则,并给出了实现方案。

1 FAT16文件系统

SD卡格式化为FAT文件系统时,一般只采用1个分区,以便于存储空间的管理。FAT 16主要由图1所示的6个阴影部分组成。通常情况下,每扇区的大小为512字节。

图1 FAT16的组织形式

1.1 主引导记录

MBR(Master Boot Record,主引导记录)总是位于存储卡的起始位置,即扇区0。图2是主引导记录的详细信息。由于只有1个分区,所以由偏移量0x1BE可找到第1分区的入口,接着由偏移量0x08找到第1分区的相对起始扇区,即第1分区引导记录所在的扇区。以512 MB SD卡为例,读取图2中地址0x1C6~0x1C9处的4个字节数据(由高位向低位读取),即0x000000E9。可知,第1分区引导记录位于SD卡的第0xE9个扇区。

图2 主引导记录

1.2 分区引导记录

分区BR(Boot Record,引导记录)位于分区的第0扇区。它由跳转代码,OEM(Original Equipmen t Manufacturer,原始设备制造商),BPB(BIOS Parameter Block,BIOS参数块),扩展BPB,引导代码和结束标志(0x55 AA)组成。图3重点列出了分区引导记录中BPB的各项参数。读图3中0x000000E9扇区,由偏移量0x0B处2字节数据0x0200=512可知,SD卡每扇区的字节数为512。类似地,可得到其他相关参数。

图3 分区引导记录

1.3 FAT表和文件存储原则

FAT16文件系统主要通过 FAT表(FAT1和FAT2)、根目录和数据区实现对文件的存储管理。FAT表记录了数据文件的存储链表,对数据的读取极为重要,通常都会有一个或多个备份。这里,FAT2就是对FAT1的备份,必须随着FAT1即时同步更新。根目录一般以32字节为单位来存放文件记录,具体描述如表1所列。

表1 根目录文件记录项

数据区主要存放文件数据,为了有效利用存储空间,一般以簇为单位,簇的大小通常是2的n次幂个扇区。FAT格式化后,簇的大小就确定下来了,可通过读取分区引导记录获得。例如,读取图3中0x000000E9扇区,由偏移量0x0D处1字节数据0x10=16可知,SD卡的1个簇占16个扇区。

如果将SD卡的存储空间想象成一本书,那么要阅读一篇文章,首先应该打开目录找到文章的页码,然后根据页码翻到文章所在的地方。类比到FAT16文件系统,FAT表和根目录就像书的目录,簇号类似于书的页码,而数据区存放的就是文章的具体内容。

以打开文件为例,文件的存储原则可以这样描述:首先在根目录中查找文件名,如有匹配,就找到了文件的开始簇号,好比知道了文章的页码。但文件的存储和书不同,书的内容一般是连续的,而文件在存储后是可以随意修改的(例如添加或删除),因而在存储空间上可能不连续,这样就无法仅通过开始簇号找到整个文件。那么怎样才能完整找到这些不连续的数据呢?答案就是FAT表。FAT表以“0xF8FF FFFF”作为开始标志,以2字节为单位存放文件簇号。FAT表实质是一个二维链表,如图4所示。

FAT表上面的数字是这2个字节在表中的位置序号,同时也代表文件的簇号,与数据区的簇号对应,类似目录的页码。通常SD卡上第一个文件的开始簇号为2。若文件长度小于1簇,则其开始簇号所对应的2字节值为FFFF。若文件长度大于1簇,则其开始簇号所对应2字节中存放的是文件所在的下一个簇号,由所得簇号再查找其对应的2字节,可找到文件接下来的簇号。依此类推,直到最后所得簇号对应的2字节值为FFFF,即为文件的结束簇号。根据上述原则,由FAT表和根目录就可以确定文件在数据区的存储簇号,从而实现文件数据的管理。

图4 FAT16文件存储实例

2 FAT16文件系统设计

文件系统的基本功能包括:文件的创建、打开和读写。这里假定已经实现了MCF51QE128微控制器和SD卡的硬件接口和底层通信,具体细节参考文献[3]。

2.1 数据结构

为了便于对主引导记录、分区引导记录、FAT表、根目录和数据区中的相关信息进行记录和处理,定义了FAT16_t和 FILE_t两个结构体类型。数据类型byte、word和dw ord分别对应于8位、16位和32位数据。

FAT16_t结构体类型用于记录主引导记录和第1分区引导扇区信息,部分定义如下:

FILE_t结构体类型用于记录每个文件项信息,部分定义如下:

2.2 FAT16初始化

FAT16的初始化主要是读取主引导记录和第1分区引导扇区信息,并保存到FAT 16_t类型变量中。初始化流程如图5所示。

FAT16初始化子程序中调用了底层SD卡读数据块函数SD_ReadBlock。其函数声明为byte SD_ReadBlock(dw ord sector,byte*buffer),用于读入地址为sector扇区中的数据,暂存入buffer中。预编译函数from_BE_32和from_BE_16分别实现由高位向低位读取4字节和2字节数据。

图5 FAT16初始化流程

FAT 16初始化子程序声明为byte Init_FAT(FAT 16_t*FAT,by te*buffer),部分代码如下:

2.3 打开和创建文件

打开和创建文件采用一个函数来实现。首先根据读入的文件名查找根目录,若有匹配项则打开文件,否则创建一个新文件。流程如图6所示。

图6 打开和创建文件流程

打开和创建文件子程序声明为byte Open_File(FILE_t*FILE,FAT 16_t*FAT,by te*buffer,byte*name)。部分代码如下:

在根目录中查找是否有文件项匹配,从根目录的第1个扇区开始读扇区。

根据文件起始簇号和根目录的记录项号,计算文件FAT表、根目录和数据区的相关信息。对于根目录和数据区的信息,已有文件和新文件的计算一致。如果是新文件,还需修改FAT表和根目录记录项。

2.4 多扇区数据读写

多扇区数据的读写是在打开文件的基础上,以扇区为单位读写文件,可连续读写多个扇区数据,同时写入文件的属性、日期和时间。写数据的流程如图7所示,读数据与之类似。多扇区数据的写子程序声明为by te Write_File(FILE_t*FILE,FAT 16_t*FAT,byte attribute,word time,wo rd date,dword size_s,byte*buffer),根据写入扇区数size_s,设置文件的写入位置。首先将写入扇区数与文件剩余扇区数进行比较,若写入扇区数小于等于剩余扇区数,则新写入扇区数、簇数均为0,文件结束簇、写簇号不变,不需要修改 FAT表,仅修改根目录中的文件长度。否则,需要计算新写入扇区数和簇数。若有增加簇,则需修改FAT表,包括FAT 1和 FAT 2、根目录的文件记录项。最后,将数据写入文件数据区。

图7 写数据流程

结 语

本文基于Freescale公司MCF51QE128微控制器,深入探讨了SD卡上FAT16文件系统的存储原则,给出了实现方案。软件算法上,对单扇区数据读写进行改进,实现了连续多个扇区数据的读写,大大提高了文件的读写效率,特别适用于数据量较大的视频、音频数据采集系统的文件存储。随着SD卡的快速流行,在此类存储设备中引入文件系统将得到更加广泛的应用。

编者注:本文为期刊缩略版,全文见本刊网站www.mesnet.com.cn。

[1]Dobiash Jack.FAT16 Structure Information[OL].[2010-03].http://home.teleport.com/~brainy/fat16.htm.

[2]Evans Allan.Fat16 Interface for MSP430,2004.

[3]童静.基于MCF51QE128的 SD卡接口设计[J].单片机与嵌入式系统应用,2009.

猜你喜欢

偏移量扇区子程序
分阶段调整增加扇区通行能力策略
基于格网坐标转换法的矢量数据脱密方法研究
U盘故障排除经验谈
搅拌针不同偏移量对6082-T6铝合金接头劳性能的影响
基于最小二乘平差的全极化SAR配准偏移量估计方法
基于贝叶斯估计的短时空域扇区交通流量预测
重建分区表与FAT32_DBR研究与实现
浅谈子程序在数控车编程中的应用
子程序在数控车加工槽中的应用探索
西门子840D系统JOG模式下PLC调用并执行NC程序