新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于MCF51QE128的SD卡文件系統(tǒng)設(shè)計

基于MCF51QE128的SD卡文件系統(tǒng)設(shè)計

作者: 時間:2010-09-10 來源:網(wǎng)絡(luò) 收藏

數(shù)據(jù)區(qū)主要存放文件數(shù)據(jù),為了有效利用存儲空間,一般以簇為單位,簇的大小通常是2的,n次冪個扇區(qū)。FAT格式化后,簇的大小就確定下來了,可通過讀取分區(qū)引導(dǎo)記錄獲得。例如,讀取圖3中Ox000000E9扇區(qū),由偏移量OxOD處1字節(jié)數(shù)據(jù)0x10=16可知,SD卡的1個簇占16個扇區(qū)。
如果將SD卡的存儲空間想象成一本書,那么要閱讀一篇文章,首先應(yīng)該打開目錄找到文章的頁碼,然后根據(jù)頁碼翻到文章所在的地方。類比到FATl6文件系統(tǒng),F(xiàn)AT表和根目錄就像書的目錄,簇號類似于書的頁碼,而數(shù)據(jù)區(qū)存放的就是文章的具體內(nèi)容。
以打開文件為例,文件的存儲原則可以這樣描述:首先在根目錄中查找文件名,如有匹配,就找到了文件的開始簇號,好比知道了文章的頁碼。但文件的存儲和書不同,書的內(nèi)容一般是連續(xù)的,而文件在存儲后是可以隨意修改的(例如添加或刪除),因而在存儲空間上可能不連續(xù),這樣就無法僅通過開始簇號找到整個文件。那么怎樣才能完整找到這些不連續(xù)的數(shù)據(jù)呢?答案就是FAT表。FAT表以“0xF8FF FFFF”作為開始標(biāo)志,以2字節(jié)為單位存放文件簇號。FAT表實質(zhì)是一個二維鏈表,如圖4所示。

6c.jpg


FAT表上面的數(shù)字是這2個字節(jié)在表中的位置序號,同時也代表文件的簇號,與數(shù)據(jù)區(qū)的簇號對應(yīng),類似目錄的頁碼。通常SD卡上第一個文件的開始簇號為2。若文件長度小于1簇,則其開始簇號所對應(yīng)的2字節(jié)值為FFFF。若文件長度大于1簇,則其開始簇號所對應(yīng)2字節(jié)中存放的是文件所在的下一個簇號,由所得簇號再查找其對應(yīng)的2字節(jié),可找到文件接下來的簇號。依此類推,直到最后所得簇號對應(yīng)的2字節(jié)值為FFFF,即為文件的結(jié)束簇號。根據(jù)上述原則,由FAT表和根目錄就可以確定文件在數(shù)據(jù)區(qū)的存儲簇號,從而實現(xiàn)文件數(shù)據(jù)的管理。

2 FATl6文件系統(tǒng)設(shè)計
文件系統(tǒng)的基本功能包括:文件的創(chuàng)建、打開和讀寫。這里假定已經(jīng)實現(xiàn)了MCF51QEl28微控制器和SD卡的硬件接口和底層通信,具體細節(jié)參考文獻。
2.1 數(shù)據(jù)結(jié)構(gòu)
為了便于對主引導(dǎo)記錄、分區(qū)引導(dǎo)記錄、FAT表、根目錄和數(shù)據(jù)區(qū)中的相關(guān)信息進行記錄和處理,定義了FATl6_t和FILE_t兩個結(jié)構(gòu)體類型。數(shù)據(jù)類型byte、word和dword分別對應(yīng)于8位、16位和32位數(shù)據(jù)。
FATl6_t結(jié)構(gòu)體類型用于記錄主引導(dǎo)記錄和第1分區(qū)引導(dǎo)扇區(qū)信息,部分定義如下:

6f.jpg

FILE_t結(jié)構(gòu)體類型用于記錄每個文件項信息,部分定義如下:

6h.jpg

2.2 FATl6初始化
FATl6的初始化主要是讀取主引導(dǎo)記錄和第1分區(qū)引導(dǎo)扇區(qū)信息,并保存到FATl6_t類型變量中。初始化流程如圖5所示。

6g.jpg


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分別實現(xiàn)由高位向低位讀取4字節(jié)和2字節(jié)數(shù)據(jù)。

linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


關(guān)鍵詞: 嵌入式

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉