專利名稱:Fat文件系統(tǒng)中基于位置的接口訪問(wèn)方法及其裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)原理領(lǐng)域,具體涉及FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,以及使用這種方法的裝置。
背景技術(shù):
現(xiàn)有FAT文件系統(tǒng),在訪問(wèn)接口上都是基于“文件名”,故而所有操作前,文件系統(tǒng)必須根據(jù)文件的名字找到它的存儲(chǔ)位置以及相應(yīng)的簇鏈表。通過(guò)文件名讀取文件內(nèi)容的流程可以描述為(1)逐層目錄查找,例如查找“/testfolder/mp3/hello.mp3”,F(xiàn)AT文件系統(tǒng)會(huì)依據(jù)子目錄名“testfolder”在FAT表中查找相應(yīng)的表項(xiàng)(entry)結(jié)構(gòu),查找成功后依據(jù)表項(xiàng)結(jié)構(gòu)定位testfolder目錄的存儲(chǔ)位置,而后在其目錄下依據(jù)子目錄名“mp3”查找對(duì)應(yīng)的表項(xiàng)結(jié)構(gòu),最后在mp3目錄下查找“hello.mp3”對(duì)應(yīng)的表項(xiàng)結(jié)構(gòu),至此獲取了文件對(duì)應(yīng)的表項(xiàng)結(jié)構(gòu)。
(2)從表項(xiàng)結(jié)構(gòu)中獲取文件的首簇(cluster)值。
(3)從FAT表中獲取文件數(shù)據(jù)存儲(chǔ)的簇鏈表,簇鏈表以0xfff(FAT12)或0xffff(FAT16)或0xffffffff(FAT32)作為結(jié)束標(biāo)記。
(4)依據(jù)簇鏈表讀取文件內(nèi)容。
FAT文件分配表一式兩份,它位于邏輯0扇區(qū)(即引導(dǎo)扇區(qū))后面的幾個(gè)扇區(qū)中,用來(lái)表示磁盤(pán)空間的分配信息。它不表示引導(dǎo)區(qū)、文件目錄的信息,也不真正存儲(chǔ)文件內(nèi)容。
由于一個(gè)文件的數(shù)據(jù)并不一定完整的存放在磁盤(pán)的一個(gè)連續(xù)的區(qū)域內(nèi),而往往會(huì)分成若干段,像一條鏈子一樣存放。這種存儲(chǔ)方式稱為文件的鏈?zhǔn)酱鎯?chǔ)。為了實(shí)現(xiàn)文件的鏈?zhǔn)酱鎯?chǔ),硬盤(pán)記錄哪些簇已經(jīng)被文件占用,還必須為每個(gè)已經(jīng)占用的簇指明存儲(chǔ)后繼內(nèi)容的下一個(gè)簇的簇號(hào),對(duì)一個(gè)文件的最后一簇,則要指明本簇?zé)o后繼簇。這些都是由FAT(文件分配表)來(lái)保存的,表中有很多表項(xiàng),每項(xiàng)記錄一個(gè)簇的信息。
表項(xiàng)(entry)是FAT文件系統(tǒng)中的一個(gè)基本結(jié)構(gòu),它用于表示文件、目錄,事實(shí)上文件、目錄的存儲(chǔ)結(jié)構(gòu)是一樣的,只不過(guò)屬性不一樣而已。Entry結(jié)構(gòu)中主要包含文件名字、屬性、創(chuàng)建時(shí)間、訪問(wèn)時(shí)間、文件大小、首簇(cluster)值等信息。這些entry結(jié)構(gòu)存儲(chǔ)在FAT文件結(jié)構(gòu)的“根目錄區(qū)”和“文件存儲(chǔ)區(qū)”中,文件查找時(shí),系統(tǒng)先找到對(duì)應(yīng)的Entry結(jié)構(gòu),而后進(jìn)行其它相應(yīng)處理。
FAT文件系統(tǒng)最常用的一個(gè)接口就是文件瀏覽,把磁盤(pán)上所有文件信息顯示出來(lái)是所有應(yīng)用層第一件要做的事情,因?yàn)闉g覽磁盤(pán)前,應(yīng)用層并不知道磁盤(pán)上的數(shù)據(jù)信息。常規(guī)的FAT文件系統(tǒng)會(huì)提供兩個(gè)接口findfirst()和findnext()用來(lái)逐目錄、逐文件的瀏覽整個(gè)磁盤(pán),而后返回文件目錄信息,顯示在應(yīng)用層。
后續(xù)操作都基于第一次磁盤(pán)瀏覽操作,例如,應(yīng)用層瀏覽磁盤(pán)獲知根目錄下有一個(gè)目錄“test”和一個(gè)文件“fat.h”,那么應(yīng)用層想繼續(xù)瀏覽目錄“test”,必然是根據(jù)上次瀏覽結(jié)果生成路徑“/test”,調(diào)用findfirst函數(shù),然后用findnext函數(shù)逐個(gè)目錄逐個(gè)文件的瀏覽目錄“test”,其它瀏覽操作同理。
這種基于文件名的訪問(wèn)方法在嵌入式開(kāi)發(fā)中,存在兩個(gè)明顯的不足之處(1)子目錄級(jí)數(shù)、文件名字長(zhǎng)度的限制。進(jìn)行文件訪問(wèn),相應(yīng)的參數(shù)傳遞是必需的,如果子目錄級(jí)數(shù)加大或文件名字符數(shù)加長(zhǎng),勢(shì)必耗用更多內(nèi)存空間。因此,現(xiàn)有技術(shù)中,各種文件系統(tǒng)對(duì)子級(jí)目錄的級(jí)數(shù)都有明確的限制。
(2)搜索文件時(shí)間長(zhǎng)。由于文件系統(tǒng)采用逐層目錄解析來(lái)尋找文件,因此耗時(shí)必然加長(zhǎng)。
以上的缺陷已經(jīng)成為嵌入式開(kāi)發(fā)的障礙。
發(fā)明內(nèi)容
本發(fā)明的目的是要克服目前現(xiàn)有技術(shù)的缺陷,提出一種快速、有效、能適用于嵌入式系統(tǒng)開(kāi)發(fā)的、在FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法。
本發(fā)明提出一種FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法包括以下步驟定義一種結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體用于存儲(chǔ)地址位置信息;進(jìn)行位置解析操作,訪問(wèn)磁盤(pán)瀏覽根目錄,并將根目錄下的子目錄和文件的所述結(jié)構(gòu)體中的地址位置信息的返回到應(yīng)用層;這些地址位置信息存儲(chǔ)在寄存器中;當(dāng)需要打開(kāi)子目錄或文件時(shí),從寄存器中讀取文件的地址位置信息。
上述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,一種優(yōu)選的方案是,所定義的結(jié)構(gòu)體的地址信息包括文件或子目錄所在的首簇值、文件的起始簇值、當(dāng)前扇區(qū)值、終止扇區(qū)值、扇區(qū)中的表項(xiàng)值。
上述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,一種優(yōu)選的方案是,使用多個(gè)寄存器存儲(chǔ)返回到應(yīng)用層的文件信息。
上述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,一種優(yōu)選的方案是,使用2個(gè)寄存器存儲(chǔ)文件信息,其中一個(gè)寄存器用于存儲(chǔ)各級(jí)子目錄的地址位置信息,另一個(gè)用于存儲(chǔ)當(dāng)前目錄下的文件信息。
本發(fā)明還提出一種裝置,該裝置使用了本發(fā)明提出的FAT文件系統(tǒng)差錯(cuò)處理方法,該裝置包括CPU和存儲(chǔ)器,其中,存儲(chǔ)器內(nèi)包括一個(gè)FAT文件系統(tǒng),該文件系統(tǒng)中的文件數(shù)據(jù)還包括一種結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體用于存儲(chǔ)文件的地址位置信息;該文件系統(tǒng)還包括一個(gè)位置解析模塊,這個(gè)模塊用于當(dāng)系統(tǒng)第一次訪問(wèn)磁盤(pán)根目錄時(shí),將根目錄內(nèi)的子目錄和文件的地址位置信息返回到應(yīng)用層;當(dāng)再需要打開(kāi)子目錄或文件時(shí),由位置解析模塊直接讀取文件的地址位置信息,打開(kāi)文件。
上述的裝置,一種優(yōu)選的方案是所述位置解析模塊位于文件系統(tǒng)中,是一個(gè)應(yīng)用程序接口。
上述的裝置,一種優(yōu)選的方案是還包括2個(gè)寄存器,其中一個(gè)用于存儲(chǔ)首次瀏覽根目錄時(shí)系統(tǒng)返回的各級(jí)子目錄的地址位置信息,另一個(gè)用于存儲(chǔ)當(dāng)前目錄下的文件信息。
上述的裝置,一種優(yōu)選的方案是還包括USB模塊,用于將該裝置與計(jì)算機(jī)相連。
上述的裝置,一種優(yōu)選的方案是裝置的CPU、存儲(chǔ)器之間的通信采用DMA方式進(jìn)行數(shù)據(jù)傳輸。
采用本發(fā)明的FAT文件系統(tǒng)中基于地址的接口訪問(wèn)方法及其裝置,由于文件本身存儲(chǔ)了該文件的地址信息,因此搜索文件時(shí),不再需要逐級(jí)搜索,省去大量搜索時(shí)間,極大的提高了文件瀏覽效率,非常適用于嵌入式系統(tǒng)。
圖1為文件的地址位置信息的結(jié)構(gòu)體示意圖;圖2為本發(fā)明的實(shí)施例的模塊圖。
具體實(shí)施例方式
本發(fā)明提出的在FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,以及使用這種方式的裝置,結(jié)合附圖和實(shí)施例說(shuō)明如下。以下實(shí)施方式僅用于說(shuō)明本發(fā)明,而并非對(duì)本發(fā)明的限制,有關(guān)技術(shù)領(lǐng)域的普通技術(shù)人員,在不脫離本發(fā)明的精神和范圍的情況下,還可以做出各種變化和變型,因此所有等同的技術(shù)方案也屬于本發(fā)明的范疇,本發(fā)明的專利保護(hù)范圍應(yīng)由各項(xiàng)權(quán)利要求限定。
參照?qǐng)D2,本實(shí)施例中,整個(gè)FAT文件系統(tǒng)放置在一片音頻處理芯片中,這個(gè)音頻處理芯片包括CPU和存儲(chǔ)器部分,其中CPU和存儲(chǔ)器之間的數(shù)據(jù)傳輸采用現(xiàn)有技術(shù)中常用的DMA(直接存儲(chǔ)器存取)傳輸方式。具體在說(shuō),在這片音頻芯片的存儲(chǔ)器中設(shè)置了一個(gè)FAT文件系統(tǒng)。由于這個(gè)FAT文件系統(tǒng),因此通過(guò)它可以完成對(duì)外部存儲(chǔ)介質(zhì)的管理,例如通過(guò)它讀取外部的SD、MMC、NandFlash記憶卡中的數(shù)據(jù)。這種通過(guò)一個(gè)文件系統(tǒng)進(jìn)行對(duì)外部存儲(chǔ)介質(zhì)的管理屬于現(xiàn)有技術(shù),類似于在通用計(jì)算機(jī)上通過(guò)操作系統(tǒng)完成對(duì)USB存儲(chǔ)器的管理一樣,在此不作贅述。
在這個(gè)MCU系統(tǒng)1中,采用51C型CPU作為中央處理器,通過(guò)DMA方式與存儲(chǔ)器之間通信。本裝置采用現(xiàn)有技術(shù)中常用的音頻處理模塊,支持midi、mp3、wave多種格式的音樂(lè)播放功能,也支持midi+wave、midi+mp3的播放。這些音樂(lè)數(shù)據(jù)會(huì)通過(guò)音頻混音模塊,然后輸出到EQ(智能)模塊、3D模塊,然后輸出到揚(yáng)聲器2。
這個(gè)MCU系統(tǒng)中還包括USB模塊,這個(gè)音頻處理芯片可以通過(guò)該模塊與通用計(jì)算機(jī)(PC)之間進(jìn)行數(shù)據(jù)傳輸。
對(duì)于存儲(chǔ)在存儲(chǔ)器中的文件系統(tǒng)而言,在文件系統(tǒng)中定義文件的位置結(jié)構(gòu)(POS)信息,可以用一個(gè)結(jié)構(gòu)體描述typedef struct{unsigned long cluster; /*首簇值*/unsigned long sector; /*當(dāng)前扇區(qū)值*/unsigned long sectorend; /*末扇區(qū)值*/unsigned long pos; /*扇區(qū)中的表項(xiàng)值*/unsigned long parentclus; /*文件夾或文件所處目錄的首簇值*/}F_POS;這個(gè)結(jié)構(gòu)體中的信息包括文件或子目錄所在的首簇值、文件的起始簇值、當(dāng)前扇區(qū)值、末扇區(qū)值、扇區(qū)中的entry(表項(xiàng))值。POS指定了一個(gè)文件或子目錄在磁盤(pán)中的位置,如圖1所示。
在本實(shí)施例中,POS信息位于文件的末尾,占20字節(jié)。由于FAT文件系統(tǒng)中對(duì)文件的存儲(chǔ)有規(guī)定,根據(jù)這些規(guī)定,文件的末尾通常都會(huì)有剩余空間而這些空間是不會(huì)被其它文件所占用,而20字節(jié)所占用的數(shù)據(jù)空間特別小,因此,對(duì)每個(gè)文件增加POS不會(huì)對(duì)磁盤(pán)的空間占用帶來(lái)負(fù)擔(dān)。
另一方面,在FAT文件系統(tǒng)中設(shè)置位置解析模塊。這個(gè)模塊完成應(yīng)用層與FAT文件系統(tǒng)之間的銜接,負(fù)責(zé)POS信息的調(diào)用。具體的實(shí)現(xiàn)方法是,使用一個(gè)API(應(yīng)用程序接口)接口作為這個(gè)位置解析模塊,實(shí)現(xiàn)對(duì)POS的調(diào)用。這個(gè)API使用了參數(shù)F_POS,即上文定義的含有位置信息的結(jié)構(gòu)體POS。這樣設(shè)置之后,對(duì)所有文件的讀、寫(xiě)、瀏覽等所有操作都必須通過(guò)位置解析模塊。由于F_POS參數(shù)包含了定位文件存放位置的所有信息,因此位置解析模塊根據(jù)這些信息找到文件。步驟是(1)按照F_POS結(jié)構(gòu)的簇參數(shù)找到首簇,可直接定位文件所處的簇;(2)在首簇下逐個(gè)entry的查找,即獲取每一個(gè)文件名;(3)將所獲取的文件名所處的扇區(qū)和地址位置信息與已知參數(shù)比較,如果完全相同,則返回成功,否則重復(fù)步驟(2),直到整個(gè)簇搜索完畢,還未找到就返回失敗。
例如,當(dāng)瀏覽根目錄時(shí),采用和現(xiàn)有技術(shù)類似的findfirst()和findnext()函數(shù)搜索根目錄下的所有文件和子目錄,根據(jù)本發(fā)明,需要在這兩個(gè)函數(shù)中添加參數(shù)F_POS作為其中的變量。例如,findfirst()可以這樣描述
unsigned char f_qfindfirst(F_POS pos,char flag,F(xiàn)_FINDDATA*finddat)這樣,系統(tǒng)在搜索根目錄返回相關(guān)數(shù)據(jù)時(shí)會(huì)一并返回POS,這些POS信息將存儲(chǔ)在應(yīng)用層中。在往后的瀏覽中,就不需要逐級(jí)搜索子目錄,而是直接調(diào)用存儲(chǔ)在應(yīng)用層中的POS信息打開(kāi)所需目錄,調(diào)用POS信息所用函數(shù)接口可以這樣描述UINT8 f_findpath(F_NAME*fsname,F(xiàn)_POS*pos)可見(jiàn),在首次瀏覽根目錄并獲得POS信息后,后續(xù)再需要打開(kāi)文件時(shí),只要直接調(diào)用應(yīng)用層存儲(chǔ)的文件POS信息,也就是說(shuō)直接用文件的地址信息就可以指向文件。這種快速打開(kāi)文件的操作可以用以下函數(shù)實(shí)現(xiàn)unsigned char f_qopen(F_POS pos,const char*mode)類似的,創(chuàng)建新文件及其entry的函數(shù)接口可以描述為UINT8 f_addentry(F_NAME*fsname,F(xiàn)_POS*pos,F(xiàn)_DIRENTRY**pde)unsigned char f_qcreate(F_POS pos,char flag,const char*name,const char*uname)其中,在創(chuàng)建文件的同時(shí),也創(chuàng)建了文件的POS信息,這個(gè)信息占20字節(jié),位于文件的末尾,存儲(chǔ)了文件的地址信息。當(dāng)文件被移動(dòng)時(shí),這個(gè)信息也會(huì)相應(yīng)的更新。
這些函數(shù)構(gòu)成一套API,這個(gè)API實(shí)現(xiàn)了位置解析模塊,因此FAT文件系統(tǒng)在瀏覽根目錄時(shí)會(huì)獲得該目錄下所有文件的POS信息,這個(gè)POS信息被存儲(chǔ)在應(yīng)用層,方便以后的直接使用,由此實(shí)現(xiàn)FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法。
另外,本實(shí)施例中采用了2個(gè)buffer(寄存器),其中一個(gè)寄存器用于存儲(chǔ)首次瀏覽根目錄時(shí)系統(tǒng)返回的各級(jí)子目錄的地址位置信息,另一個(gè)用于存儲(chǔ)當(dāng)前目錄下的文件信息。同時(shí)使用2個(gè)寄存器的方案解決了POS信息存儲(chǔ)的管理問(wèn)題,以及進(jìn)入子目錄和返回上級(jí)目錄時(shí)的切換問(wèn)題。
可見(jiàn),采用本發(fā)明的FAT文件系統(tǒng)中基于地址的接口訪問(wèn)方法,由于文件本身存儲(chǔ)了該文件的地址信息,因此搜索文件時(shí),不再需要逐級(jí)搜索,只需要在瀏覽根目錄時(shí)返回文件的地址信息,后續(xù)的操作就可以直接根據(jù)文件的地址信息打開(kāi)文件,省去大量搜索時(shí)間,極大的提高了文件瀏覽效率。這種文件瀏覽效率的提高,在嵌入式系統(tǒng)中的效果尤其明顯。
這種采用了本發(fā)明提出的FAT文件系統(tǒng)種基于位置的接口訪問(wèn)方法的FAT文件系統(tǒng),本領(lǐng)域的技術(shù)人員都可以把它應(yīng)用到其他場(chǎng)合中,例如應(yīng)用到通用計(jì)算機(jī)或其他嵌入式開(kāi)發(fā)中。本實(shí)施例僅用于支持本發(fā)明,本發(fā)明的保護(hù)范圍應(yīng)該由權(quán)利要求書(shū)限定。
權(quán)利要求
1.一種FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,其特征在于包括以下步驟定義一種結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體用于存儲(chǔ)地址位置信息;進(jìn)行位置解析操作,訪問(wèn)磁盤(pán)瀏覽根目錄,并將根目錄下的子目錄和文件的所述結(jié)構(gòu)體中的地址位置信息的返回到應(yīng)用層;這些地址位置信息存儲(chǔ)在寄存器中;當(dāng)需要打開(kāi)子目錄或文件時(shí),從寄存器中讀取文件的地址位置信息。
2.如權(quán)利要求1所述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,其特征在于所定義的結(jié)構(gòu)體包括以下數(shù)據(jù)文件或子目錄所在的首簇值、文件的起始簇值、當(dāng)前扇區(qū)值、末扇區(qū)值、扇區(qū)中的表項(xiàng)值。
3.如權(quán)利要求1所述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,其特征在于使用多個(gè)寄存器存儲(chǔ)返回到應(yīng)用層的文件的地址位置信息。
4.如權(quán)利要求3所述的FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,其特征在于使用2個(gè)寄存器存儲(chǔ)文件信息,其中一個(gè)寄存器用于存儲(chǔ)各級(jí)子目錄的地址位置信息,另一個(gè)用于存儲(chǔ)當(dāng)前目錄下的文件信息。
5.一種使用如權(quán)利要求1所述的方法的裝置,包括CPU和存儲(chǔ)器,其特征在于存儲(chǔ)器內(nèi)包括一個(gè)FAT文件系統(tǒng),該文件系統(tǒng)中的文件數(shù)據(jù)還包括一種結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體用于存儲(chǔ)文件的地址位置信息;該文件系統(tǒng)還包括一個(gè)位置解析模塊,這個(gè)模塊用于當(dāng)系統(tǒng)第一次訪問(wèn)磁盤(pán)根目錄時(shí),將根目錄內(nèi)的子目錄和文件的地址位置信息返回到應(yīng)用層;當(dāng)再需要打開(kāi)子目錄或文件時(shí),由位置解析模塊直接讀取文件的地址位置信息,打開(kāi)文件。
6.如權(quán)利要求5所述的裝置,其特征在于所述位置解析模塊位于文件系統(tǒng)中,是一個(gè)應(yīng)用程序接口。
7.如權(quán)利要求5所述的裝置,其特征在于還包括2個(gè)寄存器,其中一個(gè)用于存儲(chǔ)首次瀏覽根目錄時(shí)系統(tǒng)返回的各級(jí)子目錄的地址位置信息,另一個(gè)用于存儲(chǔ)當(dāng)前目錄下的文件信息。
8.如權(quán)利要求5所述的裝置,其特征在于還包括USB模塊,用于將該裝置與計(jì)算機(jī)相連。
9.如權(quán)利要求5所述的裝置,其特征在于裝置的CPU、存儲(chǔ)器之間的通信采用DMA方式進(jìn)行數(shù)據(jù)傳輸。
全文摘要
本發(fā)明涉及計(jì)算機(jī)原理領(lǐng)域。本發(fā)明提出一種在FAT文件系統(tǒng)中基于位置的接口訪問(wèn)方法,首先為文件設(shè)置一個(gè)結(jié)構(gòu)體,用于存儲(chǔ)文件的地址信息;并設(shè)置一個(gè)地址解析模塊,文件系統(tǒng)對(duì)文件的所有操作都經(jīng)過(guò)此模塊,保證直接使用文件地址信息對(duì)文件進(jìn)行操作。使用本發(fā)明可以省去大量搜索時(shí)間,極大的提高了文件瀏覽效率,尤其適用于嵌入式系統(tǒng)開(kāi)發(fā)。
文檔編號(hào)G06F17/30GK1776686SQ20051013064
公開(kāi)日2006年5月24日 申請(qǐng)日期2005年12月16日 優(yōu)先權(quán)日2005年12月16日
發(fā)明者孫豐強(qiáng), 趙原 申請(qǐng)人:北京中星微電子有限公司