基于MCF51QE128的SD卡文件系統(tǒng)設(shè)計(jì)
數(shù)據(jù)區(qū)主要存放文件數(shù)據(jù),為了有效利用存儲(chǔ)空間,一般以簇為單位,簇的大小通常是2的,n次冪個(gè)扇區(qū)。FAT格式化后,簇的大小就確定下來了,可通過讀取分區(qū)引導(dǎo)記錄獲得。例如,讀取圖3中Ox000000E9扇區(qū),由偏移量OxOD處1字節(jié)數(shù)據(jù)0x10=16可知,SD卡的1個(gè)簇占16個(gè)扇區(qū)。
如果將SD卡的存儲(chǔ)空間想象成一本書,那么要閱讀一篇文章,首先應(yīng)該打開目錄找到文章的頁碼,然后根據(jù)頁碼翻到文章所在的地方。類比到FATl6文件系統(tǒng),F(xiàn)AT表和根目錄就像書的目錄,簇號(hào)類似于書的頁碼,而數(shù)據(jù)區(qū)存放的就是文章的具體內(nèi)容。
以打開文件為例,文件的存儲(chǔ)原則可以這樣描述:首先在根目錄中查找文件名,如有匹配,就找到了文件的開始簇號(hào),好比知道了文章的頁碼。但文件的存儲(chǔ)和書不同,書的內(nèi)容一般是連續(xù)的,而文件在存儲(chǔ)后是可以隨意修改的(例如添加或刪除),因而在存儲(chǔ)空間上可能不連續(xù),這樣就無法僅通過開始簇號(hào)找到整個(gè)文件。那么怎樣才能完整找到這些不連續(xù)的數(shù)據(jù)呢?答案就是FAT表。FAT表以“0xF8FF FFFF”作為開始標(biāo)志,以2字節(jié)為單位存放文件簇號(hào)。FAT表實(shí)質(zhì)是一個(gè)二維鏈表,如圖4所示。
FAT表上面的數(shù)字是這2個(gè)字節(jié)在表中的位置序號(hào),同時(shí)也代表文件的簇號(hào),與數(shù)據(jù)區(qū)的簇號(hào)對(duì)應(yīng),類似目錄的頁碼。通常SD卡上第一個(gè)文件的開始簇號(hào)為2。若文件長(zhǎng)度小于1簇,則其開始簇號(hào)所對(duì)應(yīng)的2字節(jié)值為FFFF。若文件長(zhǎng)度大于1簇,則其開始簇號(hào)所對(duì)應(yīng)2字節(jié)中存放的是文件所在的下一個(gè)簇號(hào),由所得簇號(hào)再查找其對(duì)應(yīng)的2字節(jié),可找到文件接下來的簇號(hào)。依此類推,直到最后所得簇號(hào)對(duì)應(yīng)的2字節(jié)值為FFFF,即為文件的結(jié)束簇號(hào)。根據(jù)上述原則,由FAT表和根目錄就可以確定文件在數(shù)據(jù)區(qū)的存儲(chǔ)簇號(hào),從而實(shí)現(xiàn)文件數(shù)據(jù)的管理。
2 FATl6文件系統(tǒng)設(shè)計(jì)
文件系統(tǒng)的基本功能包括:文件的創(chuàng)建、打開和讀寫。這里假定已經(jīng)實(shí)現(xiàn)了MCF51QEl28微控制器和SD卡的硬件接口和底層通信,具體細(xì)節(jié)參考文獻(xiàn)。
2.1 數(shù)據(jù)結(jié)構(gòu)
為了便于對(duì)主引導(dǎo)記錄、分區(qū)引導(dǎo)記錄、FAT表、根目錄和數(shù)據(jù)區(qū)中的相關(guān)信息進(jìn)行記錄和處理,定義了FATl6_t和FILE_t兩個(gè)結(jié)構(gòu)體類型。數(shù)據(jù)類型byte、word和dword分別對(duì)應(yīng)于8位、16位和32位數(shù)據(jù)。
FATl6_t結(jié)構(gòu)體類型用于記錄主引導(dǎo)記錄和第1分區(qū)引導(dǎo)扇區(qū)信息,部分定義如下:
FILE_t結(jié)構(gòu)體類型用于記錄每個(gè)文件項(xiàng)信息,部分定義如下:
2.2 FATl6初始化
FATl6的初始化主要是讀取主引導(dǎo)記錄和第1分區(qū)引導(dǎo)扇區(qū)信息,并保存到FATl6_t類型變量中。初始化流程如圖5所示。
FATl6初始化子程序中調(diào)用了底層SD卡讀數(shù)據(jù)塊函數(shù)SD_ReadBlock。其函數(shù)聲明為byte SD_ReadBlock(dword sector,byte*buffer),用于讀入地址為sector扇區(qū)中的數(shù)據(jù),暫存入buffer中。預(yù)編譯函數(shù)from_BE_32和from_BE_16分別實(shí)現(xiàn)由高位向低位讀取4字節(jié)和2字節(jié)數(shù)據(jù)。
評(píng)論