新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于MCF51QE128的SD卡文件系统设计

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

作者: 时间:2010-09-10 来源:网络 收藏

数据区主要存放文件数据,为了有效利用存储空间,一般以簇为单位,簇的大小通常是2的,n次幂个扇区。FAT格式化后,簇的大小就确定下来了,可通过读取分区引导记录获得。例如,读取图3中Ox000000E9扇区,由偏移量OxOD处1字节数据0x10=16可知,SD卡的1个簇占16个扇区。
如果将SD卡的存储空间想象成一本书,那么要阅读一篇文章,首先应该打开目录找到文章的页码,然后根据页码翻到文章所在的地方。类比到FATl6文件系统,FAT表和根目录就像书的目录,簇号类似于书的页码,而数据区存放的就是文章的具体内容。
以打开文件为例,文件的存储原则可以这样描述:首先在根目录中查找文件名,如有匹配,就找到了文件的开始簇号,好比知道了文章的页码。但文件的存储和书不同,书的内容一般是连续的,而文件在存储后是可以随意修改的(例如添加或删除),因而在存储空间上可能不连续,这样就无法仅通过开始簇号找到整个文件。那么怎样才能完整找到这些不连续的数据呢?答案就是FAT表。FAT表以“0xF8FF FFFF”作为开始标志,以2字节为单位存放文件簇号。FAT表实质是一个二维链表,如图4所示。

6c.jpg


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

2 FATl6文件系统设计
文件系统的基本功能包括:文件的创建、打开和读写。这里假定已经实现了MCF51QEl28微控制器和SD卡的硬件接口和底层通信,具体细节参考文献。
2.1 数据结构
为了便于对主引导记录、分区引导记录、FAT表、根目录和数据区中的相关信息进行记录和处理,定义了FATl6_t和FILE_t两个结构体类型。数据类型byte、word和dword分别对应于8位、16位和32位数据。
FATl6_t结构体类型用于记录主引导记录和第1分区引导扇区信息,部分定义如下:

6f.jpg

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

6h.jpg

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

6g.jpg


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

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


关键词: 嵌入式

评论


相关推荐

技术专区

关闭