版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
緒論1.1實(shí)時(shí)操作系統(tǒng)簡(jiǎn)介1.1.1實(shí)時(shí)操作系統(tǒng)的概念實(shí)時(shí)操作系統(tǒng)(Real-timeOperationSystem,RTOS):系統(tǒng)能夠及時(shí)響應(yīng)外部事件的請(qǐng)求,在規(guī)定的時(shí)間內(nèi)完成對(duì)該事件的處理,并控制所有實(shí)時(shí)任務(wù)協(xié)調(diào)一致的運(yùn)行的嵌入式操作系統(tǒng)。在工業(yè)控制、航空航天、實(shí)時(shí)檢測(cè)等流程控制要求非常精確的領(lǐng)域,必須要在指定的時(shí)間內(nèi)做出指定的響應(yīng),這時(shí)就需要實(shí)時(shí)操作系統(tǒng)來(lái)控制。我們常常說的嵌入式操作系統(tǒng)都是嵌入式實(shí)時(shí)操作系統(tǒng),比如uTenux、uC/OS-II。1.1.2常見的實(shí)時(shí)微控制器操作系統(tǒng)及其對(duì)比1.uTenux微控制器操作系統(tǒng)uTenux是一款優(yōu)秀的開源免費(fèi)的實(shí)時(shí)微控制器操作系統(tǒng),是由大連悠龍軟件科技有限公司開發(fā)與維護(hù)。Tenux是由T-EngineLinux的縮寫構(gòu)成,Tenux具有(a)T-Engine的開源高實(shí)時(shí)性內(nèi)核T-Kernel為內(nèi)核;(b)Linux上豐富的開源中間件為中間件;(c)Eclipse+GNU開源開發(fā)工具為基礎(chǔ)工具;(d)打造適合中國(guó)電子產(chǎn)品市場(chǎng)的開源嵌入式實(shí)時(shí)操作系統(tǒng)及方便的集成開發(fā)環(huán)境。uTenux適用于微控制器(CortexM/ARM7,ROM:大于64K),它的內(nèi)核是uT-Kernel,具有豐富緊湊的中間件,比如FATFS、LWIP、FLTK。適用產(chǎn)品:小型物聯(lián)網(wǎng)控制終端,比如機(jī)器人、智能儀表、小型數(shù)控機(jī)床、PLC、相機(jī)等。它的特點(diǎn)有:所有源碼公開、完全免費(fèi)占有日本60%市場(chǎng)的成熟實(shí)時(shí)微內(nèi)核支持函數(shù)和軟中斷兩種方式搶占式實(shí)時(shí)多任務(wù)操作系統(tǒng)不需要MMU,占用ROM/RAM少可以支持所有32位ARM7/9和CortexM系列的微控制器可配置任意多個(gè)任務(wù)、任務(wù)的優(yōu)先級(jí)最多255個(gè)2.uCOS微控制器操作系統(tǒng)uC/OSII(MicroControlOperationSystemTwo)是一個(gè)可以基于ROM運(yùn)行的、可裁減的、搶占式、實(shí)時(shí)多任務(wù)內(nèi)核,具有高度可移植性,特別適合于微處理器和控制器,是和很多商業(yè)操作系統(tǒng)性能相當(dāng)?shù)膶?shí)時(shí)操作系統(tǒng)(RTOS)。為了提供最好的移植性能,uC/OSII最大程度上使用ANSIC語(yǔ)言進(jìn)行開發(fā),并且已經(jīng)移植到近40多種處理器體系上,涵蓋了從8位到64位各種CPU(包括DSP)。uC/OSII可以簡(jiǎn)單的視為一個(gè)多任務(wù)調(diào)度器,在這個(gè)任務(wù)調(diào)度器之上完善并添加了和多任務(wù)操作系統(tǒng)相關(guān)的系統(tǒng)服務(wù),如信號(hào)量、郵箱等。其主要特點(diǎn)有公開源代碼,代碼結(jié)構(gòu)清晰、明了,注釋詳盡,組織有條理,可移植性好,可裁剪,可固化。內(nèi)核屬于搶占式,最多可以管理60個(gè)任務(wù)。從1992年開始,由于高度可靠性、魯棒性和安全性,uC/OSII已經(jīng)廣泛使用在從照相機(jī)到航空電子產(chǎn)品的各種應(yīng)用中。3.uTenux和ucos的對(duì)比(1)uTenux有固定和可變尺寸內(nèi)存池管理;ucos只有固定尺寸內(nèi)存池。(2)uTenux的郵箱支持消息隊(duì)列和任務(wù)等待隊(duì)列,因此發(fā)送多個(gè)消息都可以;ucos的郵箱只能發(fā)送一條消息,很簡(jiǎn)單。(3)uTenux中有專門定義中斷處理程序的系統(tǒng)調(diào)用-tk_def_int,很方便,而ucos中就沒有。(4)uTenux有Trace、Hook等調(diào)試功能,而ucosii沒有。(5)uTenux的任務(wù)堆棧等需要內(nèi)存的地方,可以由系統(tǒng)自動(dòng)分配也可以開發(fā)人員手工分配;但ucos只能手工分配。(6)uTenux的任務(wù)、信號(hào)量等系統(tǒng)對(duì)象采用ID方式實(shí)現(xiàn),用戶看不到內(nèi)部的數(shù)據(jù)結(jié)構(gòu),對(duì)于安全性比較好,使用也方便;而ucos是用戶定義每個(gè)系統(tǒng)對(duì)象的變量。(7)uTenux的任務(wù)間通信機(jī)制比ucos多了好幾種,比如集合點(diǎn)端口等,而且每個(gè)通信機(jī)制都支持任務(wù)隊(duì)列和消息隊(duì)列。(8)uTenuxV1.5的易用性沒有ucos的強(qiáng),幸好uTenux已經(jīng)意識(shí)到自己的問題,向ucos的易用性學(xué)習(xí),在模仿中超越對(duì)手。(9)uTenux終身開源免費(fèi),無(wú)論是學(xué)習(xí)、商用、修改再發(fā)布,而ucos只有學(xué)習(xí)時(shí)是開源免費(fèi)的,商用必須付費(fèi)。綜上所述,學(xué)習(xí)uTenux的意義大于ucos。1.2嵌入式文件系統(tǒng)簡(jiǎn)介1.2.1文件系統(tǒng)概述文件系統(tǒng)是操作系統(tǒng)的重要組成部分,用于控制對(duì)數(shù)據(jù)、文件及設(shè)備的存儲(chǔ)[2]。它提供對(duì)文件和目錄的分層組織形式、數(shù)據(jù)緩沖以及對(duì)文件的存儲(chǔ)權(quán)限的控制。文件系統(tǒng)必須提供必要的用來(lái)創(chuàng)建、刪除文件、讀文件和寫文件等相應(yīng)的系統(tǒng)調(diào)用。文件的存儲(chǔ)通過目錄完成,所以對(duì)目錄的操作是文件系統(tǒng)功能的一部分,,文件系統(tǒng)應(yīng)具有以下功能:=1\*GB2⑴提供對(duì)文件和目錄的分層組織形式;=2\*GB2⑵建立與刪除文件的能力;=3\*GB2⑶文件的動(dòng)態(tài)增長(zhǎng)和數(shù)據(jù)保護(hù)。硬盤的出現(xiàn)推動(dòng)了針對(duì)桌面操作系統(tǒng)的文件系統(tǒng)的發(fā)展,同樣,嵌入式存儲(chǔ)設(shè)備特別是flash的出現(xiàn),也推動(dòng)了嵌入式文件系統(tǒng)的發(fā)展。1.2.2嵌入式文件系統(tǒng)一般體系結(jié)構(gòu)在嵌入式文件系統(tǒng)中,嵌入式系統(tǒng)可以針對(duì)特殊的目的定制,特別是隨著ASOS(為應(yīng)用定制的嵌入式操作系統(tǒng))的發(fā)展,對(duì)嵌入式操作系統(tǒng)的系統(tǒng)功能完整性和可伸縮性提出了更高的要求。所以不得不采取一種靈活的系統(tǒng)體系結(jié)構(gòu),對(duì)于操作系統(tǒng)來(lái)說,文件系統(tǒng)是一個(gè)獨(dú)立的子包含的整體,可以靈活的加載和卸載,這一切操作對(duì)操作系統(tǒng)內(nèi)核的功能沒有任何影響。嵌入式文件系統(tǒng)系統(tǒng)體系結(jié)構(gòu)從上到下一般有3層,如圖1.1所示。圖1.1嵌入式操作系統(tǒng)體系結(jié)構(gòu)最上一層是文件系統(tǒng)的核心,使文件系統(tǒng)實(shí)現(xiàn)的核心算法,提供了用戶可見的所有API函數(shù),以供用戶操作數(shù)據(jù),這一層是文件系統(tǒng)功能的集合。第二層是高速緩沖管理,高速緩沖區(qū)的大小直接關(guān)系到文件系統(tǒng)的處理效率,高效的緩沖區(qū)處理算法能大幅提高數(shù)據(jù)的處理效率;同時(shí)它為文件系統(tǒng)提供了與硬件無(wú)關(guān)的接口,為文件系統(tǒng)的層次性提供了基礎(chǔ)。最下面一層是設(shè)備驅(qū)動(dòng)程序,涉及到具體的硬件。設(shè)備驅(qū)動(dòng)程序的另一個(gè)重要任務(wù)就是提供統(tǒng)一設(shè)備驅(qū)動(dòng)接口。文件系統(tǒng)和操作系統(tǒng)內(nèi)核的關(guān)系主要體現(xiàn)在三方面:實(shí)時(shí)時(shí)鐘、信號(hào)量和中斷管理。用時(shí)鐘實(shí)現(xiàn)外設(shè)任務(wù)的等待延時(shí);用信號(hào)量實(shí)現(xiàn)外設(shè)的同步和互斥;用中斷管理機(jī)制管理外設(shè)的中斷處理程序。1.2.3文件系統(tǒng)概述目前,嵌入式文件系統(tǒng)解決方案比較多,由于嵌入式設(shè)備的多樣性,相應(yīng)文件系統(tǒng)的實(shí)現(xiàn)也有針對(duì)各種設(shè)備的,如只讀存儲(chǔ)器、可讀存儲(chǔ)器、Flash存儲(chǔ)器等。嵌入式文件系統(tǒng)也是要針對(duì)嵌入式操作系統(tǒng)的。1.FatFSFatFS是一個(gè)開源免費(fèi)通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實(shí)現(xiàn)FAT文件系統(tǒng)。FatFs的編寫遵循ANSIC,因此不依賴于硬件平臺(tái)。它可以嵌入到便宜的微控制器中,如8051、PIC、AVR、SH、Z80、H8、ARM等等。它是window兼容的FAT文件系統(tǒng),平臺(tái)依賴性小,易于移植,代碼和工作區(qū)占用非常小,有多種配置選項(xiàng)。通過配置FatFS可以使得FatFS占用的RAM達(dá)到44字節(jié),代碼空間的占用可以小到2K-4K,在這樣小的空間中它還能支持FAT32,這是以文件的寫功能的限制為代價(jià)的。FatFS是標(biāo)準(zhǔn)FAT文件系統(tǒng)的小型嵌入式文件系統(tǒng),它是一個(gè)自由軟件,可以用于教育、研究、商業(yè)。在使用過程中不用擔(dān)心被限制。用戶可以修改,重新發(fā)布以個(gè)人的身份。但是必須在源代碼中包含這個(gè)版權(quán)申明。文件分配表FAT(FileAllocationTable)用來(lái)跟蹤硬盤上每個(gè)文件的數(shù)據(jù)庫(kù),而FAT表存儲(chǔ)關(guān)于簇的信息。FAT表示microsoft在FAT文件系統(tǒng)中用于磁盤數(shù)據(jù)(文件)索引和定位引進(jìn)的一種鏈?zhǔn)浇Y(jié)構(gòu)。在FAT文件系統(tǒng)中,文件的存儲(chǔ)依照FAT表制定的簇鏈?zhǔn)綌?shù)據(jù)結(jié)構(gòu)來(lái)進(jìn)行。同時(shí),F(xiàn)AT文件系統(tǒng)將組織數(shù)據(jù)時(shí)使用的目錄也抽象為文件,以簡(jiǎn)化對(duì)數(shù)據(jù)的管理。FAT分區(qū)格式是microsoft最早支持的分區(qū)格式,依據(jù)FAT表中的每個(gè)簇鏈的所占位數(shù)分為FAT12、FAT16、FAT32三種形式,但其基本存儲(chǔ)方式是相似的。如圖1.2所示。圖1.2FatFs模塊結(jié)構(gòu)2.uC/FSuC/FS是uCOS的文件系統(tǒng),它是由Micrium公司新開發(fā)的一個(gè)產(chǎn)品,主要應(yīng)用在使用uCOS內(nèi)核的嵌入式系統(tǒng)中。uC/FS是一個(gè)用于能提供基礎(chǔ)訪問功能的FAT格式的文件系統(tǒng),是一個(gè)高效率的庫(kù),為高速、多功能及內(nèi)存使用進(jìn)行優(yōu)化。它用ANSIC編寫,由不同的層次結(jié)構(gòu)組成,包括API層、文件系統(tǒng)層、邏輯區(qū)塊層、設(shè)備驅(qū)動(dòng)和硬件層。總之,在上述的嵌入式文件系統(tǒng)中,F(xiàn)atFS和uC/FS都用于小容量閃存設(shè)備,功能都比較齊全。但是uC/FS是屬于擁有知識(shí)產(chǎn)權(quán)的技術(shù),是商業(yè)產(chǎn)品,而FatFS則完全是開源免費(fèi)的,用戶可以隨時(shí)下載所有全代碼,更改和再發(fā)布。隨著NANDFAlsh作為嵌入式系統(tǒng)中大容量存儲(chǔ)介質(zhì)的普及應(yīng)用,F(xiàn)atFS文件系統(tǒng)作為開源代碼的項(xiàng)目,得到芯片產(chǎn)商,項(xiàng)目開發(fā)人員的一致好評(píng)。所以在本項(xiàng)目中選擇FatFS作為目標(biāo)文件系統(tǒng)。1.3嵌入式文件系統(tǒng)的必要性嵌入式系統(tǒng)過去主要用于工業(yè)控制領(lǐng)域,對(duì)效率的比較高,對(duì)于數(shù)據(jù)處理不夠重視,引入文件系統(tǒng)不但沒有必要而且會(huì)降低效率,所以很多嵌入式系統(tǒng)應(yīng)用都沒有加載操作系統(tǒng)。隨著嵌入式處理器性能的不斷升級(jí),嵌入式系統(tǒng)的功能不斷加強(qiáng),用戶的需求也和功能復(fù)雜度的增加,許多嵌入式系統(tǒng)都面臨著處理大量數(shù)據(jù)的問題;另外對(duì)于應(yīng)用程序開發(fā)人員直接訪問內(nèi)存具有很大的風(fēng)險(xiǎn)性,需要對(duì)內(nèi)存的訪問進(jìn)行封裝。綜上所述在嵌入式操作系統(tǒng)內(nèi)核和應(yīng)用程序之間加一個(gè)文件系統(tǒng)成為必然趨勢(shì)。2uTenux實(shí)時(shí)操作系統(tǒng)uTenux實(shí)時(shí)操作系統(tǒng)的體系結(jié)構(gòu)如圖2.1所示。圖2.1uTenux實(shí)時(shí)操作系統(tǒng)的體系結(jié)構(gòu)Board:為uTenux所支持的處理器有ARM7、ARM9、CortexMx(x為0-4),用到的外設(shè)環(huán)境有通用輸入輸出端口(GPIO)、同步串口(SPI)、異步串口(UART)、存儲(chǔ)設(shè)備(NandFlash/SD)、USB接口等。uT/Kernel:為uTenux的核心部分,主要包括了三個(gè)部分uT/OS是操作系統(tǒng)內(nèi)核,包含了系統(tǒng)調(diào)用的所有API函數(shù);uT/SM是終端函數(shù),設(shè)備管理函數(shù);uT/DS為調(diào)試所需要的函數(shù),主要包括內(nèi)核狀態(tài)查詢函數(shù);uT/Lib:為操作系統(tǒng)移植相關(guān)部分,uT/CPU指的是系統(tǒng)的啟動(dòng)代碼,執(zhí)行CPU的初始化;uT/DEV這的是開發(fā)板上一系列外設(shè)的的初始化和配置文件;uT/TM指的是串口打印函數(shù),這是為了開發(fā)人員方便使用而設(shè)置的。StandCLib:標(biāo)準(zhǔn)的C語(yǔ)言庫(kù),uTenux操作系統(tǒng)支持標(biāo)準(zhǔn)的C語(yǔ)言庫(kù)。目前支持C99標(biāo)準(zhǔn)庫(kù)。uT/Subass:是uTenux上的一系列中間件,介于應(yīng)用程序和操作系統(tǒng)之間。包括GUI圖形界面;FatFS文件系統(tǒng);LWIP網(wǎng)絡(luò)模塊等等;IDE/ICE:分別表示uTenux所支持的開發(fā)環(huán)境,燒寫工具等。3FatFS文件系統(tǒng)的移植3.1FAT協(xié)議介紹3.1.1FAT協(xié)議概述每個(gè)分區(qū)(卷)都是一個(gè)獨(dú)立的文件系統(tǒng);FAT文件系統(tǒng)將分區(qū)分為四個(gè)區(qū)域,保留區(qū)、FAT表區(qū)、目錄區(qū)、數(shù)據(jù)區(qū)。FAT表區(qū):FAT(FileAllocationTable)是文件分配表的簡(jiǎn)稱,它是FAT文件系統(tǒng)最重要也是最根本的部分。文件分配表記錄了一個(gè)個(gè)鏈表,記錄了每個(gè)文件片段的直接后繼的地址,從而將一個(gè)個(gè)的文件片段連接起來(lái),形成一個(gè)完整的文件。一個(gè)FAT鏈表記錄了一個(gè)完整的文件。為了便于對(duì)數(shù)據(jù)的管理,F(xiàn)AT文件系統(tǒng)將目錄也抽象為文件,這個(gè)目錄下的所有文件稱為這個(gè)目錄文件的內(nèi)容。FAT文件系統(tǒng)存儲(chǔ)文件的基本單位是簇,也就是說一個(gè)文件片段就是一個(gè)簇。簇是文件系統(tǒng)中數(shù)據(jù)區(qū)的概念,一個(gè)分區(qū)(卷)中簇的多少,決定了這個(gè)文件系統(tǒng)中文件分配表中每個(gè)一個(gè)簇鏈所占用的位數(shù),根據(jù)文件分配表每一個(gè)簇項(xiàng)所占用的位數(shù)將文件系統(tǒng)分為FAT12、FAT16、FAT32三種形式,但原理基本相同。一個(gè)簇包含2的n次冪個(gè)扇區(qū),每個(gè)扇區(qū)是512個(gè)字節(jié)或者是512的倍數(shù)。扇區(qū)是在文件系統(tǒng)中可以統(tǒng)一使用的邏輯地址。保留區(qū):保留區(qū)位于整個(gè)卷的最前面,記錄了這個(gè)文件系統(tǒng)的一些基本的參數(shù),比如扇區(qū)的大小,簇的大小,文件系統(tǒng)的類型,F(xiàn)AT表是否有備份,每張F(tuán)AT表的大小,目錄區(qū)的大小等。目錄區(qū):如果說FAT表區(qū)是記錄的每個(gè)簇的直接后繼的話,那么目錄區(qū)則記錄了這個(gè)鏈表的頭結(jié)點(diǎn),以及一些其他的文件屬性,每天記錄占用32個(gè)字節(jié)。數(shù)據(jù)區(qū):用來(lái)以簇為單位存放文件內(nèi)容。一個(gè)文件是以鏈表的形式存放在卷中,數(shù)據(jù)區(qū)的每個(gè)簇都是這個(gè)鏈表一個(gè)結(jié)點(diǎn)的上內(nèi)容。綜上,保留區(qū)記錄了整個(gè)文件系統(tǒng)基本參數(shù),以及剩余簇的數(shù)量。FAT表區(qū)充當(dāng)了一個(gè)鏈表的next結(jié)點(diǎn)。目錄區(qū)記錄了每一個(gè)文件和目錄的基本屬性,以及每個(gè)文件的開始簇號(hào)。數(shù)據(jù)區(qū)存放了每一個(gè)結(jié)點(diǎn)的內(nèi)容。每次的文件訪問,文件系統(tǒng)都會(huì)從目錄區(qū)的第一條(根目錄)開始讀取,查找鏈表進(jìn)入文件或選擇指定的文件。3.1.2FAT保留區(qū)保留區(qū)位于分區(qū)(卷)的第一個(gè)扇區(qū),同時(shí)也屬于FAT文件系統(tǒng)基本區(qū)域的保留區(qū)。這個(gè)扇區(qū)又叫做“啟動(dòng)扇區(qū)”、“保留扇區(qū)”、“0扇區(qū)”。眾多的說法都是一個(gè)意思,該扇區(qū)是FAT卷的第一個(gè)扇區(qū)。這個(gè)區(qū)域最重要的就是BPB(BIOSParameterBlock),F(xiàn)AT32的BPB內(nèi)容和FAT12、FAT16的內(nèi)容在BPB_Toset32區(qū)域以前完全一致,而從偏移36開始它們的內(nèi)容才有所區(qū)別,這么做是為了啟動(dòng)扇區(qū)中存放一個(gè)完整的FAT12、FAT16或FAT32的BPB內(nèi)容,以達(dá)到最好的兼容性。表3.1FAT保留區(qū)各字段含義名稱偏移byte大小byte描述BS_jmpBoot03跳轉(zhuǎn)指令,指向啟動(dòng)代碼,有兩種形式BS_OEMName38標(biāo)志字符串,建議值為“MSWIN4.1”BPB_BytsPerSec112每個(gè)扇區(qū)的字節(jié)數(shù),512取得最好兼容性BPB_SecPerClus131每個(gè)簇的扇區(qū)數(shù),必須為2的n次冪,簇大小必須小于32kBPB_RsvdSecCnt142保留區(qū)中扇區(qū)的數(shù)目,F(xiàn)AT12/16為1,F(xiàn)AT32為32BPB_NumFATs161FAT表的份數(shù)。建議為2,這樣就會(huì)有一個(gè)備份FAT表BPB_RootEntCnt172在此卷中總共目錄的項(xiàng)數(shù),乘以32必須是512的倍數(shù)BPB_TotSec16192此卷中扇區(qū)總數(shù),若為0那么BPB_Tot32必須為非0BPB_Media211存儲(chǔ)介質(zhì)的類型,固定存儲(chǔ)介質(zhì)0xF8,移動(dòng)的為0xF0BPB_FATSz16222一個(gè)FAT表所占用的扇區(qū)數(shù),對(duì)于FAT32為0BPB_SecPerTrk242每磁道的扇區(qū)數(shù),用于BIOS的0x13中斷BPB_NumHeads262磁頭數(shù),用于BIOS的0x13中斷BPB_HiddSec284在卷之前的扇區(qū)數(shù),用于BIOS的0x13中斷BPB_TotSec32324對(duì)于FAT32類型,為此卷的扇區(qū)總數(shù)結(jié)束標(biāo)志151010x55結(jié)束標(biāo)志251110xAA從偏移36開始FAT12/FAT16的內(nèi)容開始不同于FAT32,表3.2為FAT12/FAT16的內(nèi)容:表3.2FAT12/FAT16的內(nèi)容名稱偏移(byte)大小(byte)描述BS_DrvNum361用于BIOS中斷0x13得到磁盤驅(qū)動(dòng)器參數(shù)BS_Reserved1371保留——供NT使用BS_BootSig381擴(kuò)展引導(dǎo)標(biāo)記,用于指明后期的3個(gè)域可用BS_VolID394卷標(biāo)序列號(hào),此域往往由日期和時(shí)間組成,用于檢測(cè)磁盤BS_VolLab4311磁盤卷標(biāo),此域必須與根目錄中11字長(zhǎng)的卷標(biāo)一致BS_FilSysType548文件系統(tǒng)類型標(biāo)記,此域?yàn)閷?shí)際的字符串FAT32的內(nèi)容。如下表3.3所示。表3.3FAT32的內(nèi)容名稱偏移(byte)大小(byte)描述BPB_FATSz32364一個(gè)FAT表所占的扇區(qū)數(shù)BPB_ExtFlags402Bit0-3:不小于0的活動(dòng)FAT數(shù)目BPB_FSVer422高位為主版本號(hào),低位為此版本號(hào)BPB_RootClus444根目錄所在的第一個(gè)簇號(hào),通常為2BPB_FSInfo482保留區(qū)中FAT32卷FSINFO結(jié)構(gòu)所占扇區(qū)數(shù),通常為1BPB_BkBootSec502保留區(qū)中引導(dǎo)記錄的備份數(shù)據(jù)所占的扇區(qū)數(shù),通常為1BPB_Reserved5212保留BS_DrvNum641同F(xiàn)AT12/16的定義BS_Reserved1651同F(xiàn)AT12/16的定義BS_BootSig661同F(xiàn)AT12/16的定義BS_VolID674同F(xiàn)AT12/16的定義BS_VolLab7111同F(xiàn)AT12/16的定義BS_FilSysType828同F(xiàn)AT12/16的定義,通常設(shè)為“FAT32”3.1.3FAT表區(qū)FAT表是文件系統(tǒng)一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),每一個(gè)FAT表項(xiàng)綁定一個(gè)數(shù)據(jù)區(qū)的簇,即FAT表的表項(xiàng)數(shù)目與數(shù)據(jù)區(qū)的簇的數(shù)目相等,所以簇的數(shù)目決定了FAT表項(xiàng)所占的位數(shù),如占12位則文件系統(tǒng)為FAT12,占16位則為FAT16,占32位則為FAT32,其中不允許出現(xiàn)其他的數(shù)字。順序的第一個(gè)FAT表項(xiàng)對(duì)應(yīng)數(shù)據(jù)區(qū)的第一個(gè)簇,第二個(gè)表項(xiàng)對(duì)應(yīng)數(shù)據(jù)區(qū)的第二個(gè)簇……。就像每一袋鼠都有一個(gè)袋子一樣,都可以用來(lái)存放自己的后繼者。簇的袋子就是對(duì)應(yīng)的FAT表項(xiàng)。FAT表項(xiàng)相當(dāng)于鏈表的next結(jié)點(diǎn),那么文件片段簇4的直接后繼,就應(yīng)該讀取FAT表中的第4個(gè)表項(xiàng),得到的值則為直接后繼的簇號(hào)。對(duì)于特殊的表項(xiàng)值進(jìn)行了如下定義。以FAT32為例,如表3.4所示。表3.4FAT表區(qū)各個(gè)字段的含義序號(hào)FAT表項(xiàng)值含義10x00000000表示本表項(xiàng)對(duì)應(yīng)的簇為空簇,為可用簇20x00000002~0xFFFFFFEF以用簇,表示本表項(xiàng)對(duì)應(yīng)的下一個(gè)簇的簇號(hào)30xFFFFFFF7表示本表項(xiàng)對(duì)應(yīng)的簇為壞簇40xFFFFFFF8置于FAT表的第一個(gè)表項(xiàng),作為磁盤標(biāo)識(shí)符50xFFFFFFFF設(shè)置FAT表的第二個(gè)表項(xiàng),表示第一個(gè)簇被占用60xFFFFFFF8~0xFFFFFFFF表示本表項(xiàng)對(duì)應(yīng)的簇為最后一個(gè)節(jié)點(diǎn)從表3.4可以看出,F(xiàn)AT表的第一和第二表項(xiàng)都有默認(rèn)值,作為識(shí)別使用,所以文件系統(tǒng)沒有簇0和簇1,簇的命名是直接從簇2開始的。3.1.4FAT目錄區(qū)所有鏈表的根源都來(lái)自于目錄區(qū),目錄區(qū)存放了一條條記錄,表示各個(gè)目錄和文件的基本屬性。每條記錄占32個(gè)字節(jié)。對(duì)于FAT32,目錄區(qū)和數(shù)據(jù)區(qū)沒有明顯的界線,數(shù)據(jù)和目錄是混合在一起的,每次寫數(shù)據(jù)時(shí)都是先用最小的空閑簇。每條記錄的各個(gè)字段的含義如表3.5所示。表3.5目錄區(qū)各個(gè)字段的含義名稱偏移(byte)大小(byte)描述DIR_Name011短文件名DIR_Attr111文件屬性:只讀(x01)、隱藏(0x02)、系統(tǒng)(0x04)、卷標(biāo)(0x08)、目錄(0x10)、歸檔(0x20)、長(zhǎng)文件名(0x0F)DIR_NTRes121保留給WindowNT使用DIR_CrtTimeTenth131文件創(chuàng)建時(shí)間的毫秒戳,精度為2毫秒DIR_CrtTime142文件創(chuàng)建時(shí)間DIR_CrtDate162文件創(chuàng)建日期DIR_LstAccDate182最后訪問日期,只有日期DIR_FstClusHI202該目錄或文件的簇號(hào)的高位字DIR_WrtTime222最后寫的時(shí)間,文件被創(chuàng)建被認(rèn)做寫DIR_WrtDate242最后寫的日期,文件被創(chuàng)建被認(rèn)做寫DIR_FstClusLO262該目錄或文件簇號(hào)的低位字DIR_FileSize284文件大小,由32-byte雙字組成3.1.5FAT數(shù)據(jù)區(qū)文件是被分割成一個(gè)個(gè)的簇大小的片段,保存在數(shù)據(jù)區(qū)的不同地方。簇是文件存儲(chǔ)的基本單位,即使是一個(gè)只有一個(gè)字節(jié)的文件也要占用一個(gè)簇的空間。3.2FatFS文件系統(tǒng)的配置FatFS文件系統(tǒng)是高度可裁剪的,可以根據(jù)功能的需求,容量的需求,效率的需求,在ffconf.h中配置需要的功能。函數(shù)和緩沖區(qū)的配置選項(xiàng)有:_FS_TINY、_FS_READONLY、_FS_MINIMIZE、_USE_STRFUNC、_USE_MKFS、_USE_FORWARD、_USE_FASTSEEK。本地命名空間的配置選項(xiàng)有:_CODE_PAGE、_USE_LFN、_MAX_LFN、_LFN_UNICODE、_FS_RPATH。物理驅(qū)動(dòng)的配置選項(xiàng)有:_VOLUMES、_MAX_SS、_MULTI_PARTITION、_USE_ERASE。系統(tǒng)配置的配置選項(xiàng)有:_WORD_ACCESS、_FS_REENTRANT、_FS_TIMEOUT、_SYNC_t、_FS_SHARE。_FS_TINY0:為正常模式(默認(rèn)),1:為微型模式。當(dāng)_FS_TINY被設(shè)置為1時(shí),F(xiàn)atFs使用扇區(qū)緩沖來(lái)代替正常模式的下文件中的私有緩沖區(qū)。這樣可以為每一個(gè)文件結(jié)構(gòu)類型減少512個(gè)字節(jié)的空間開銷。并且還會(huì)移除一些功能函數(shù)。_FS_READONLY0:可讀可寫(默認(rèn)),1:只讀。設(shè)置_FS_READONLY為1時(shí),將會(huì)移除關(guān)于寫的函數(shù),f_write,f_sync,f_unlink,f_mkdir,f_chmod,f_rename,f_truncateanduselessf_getfree_FS_MINIMIZE可設(shè)置為0~3。0為默認(rèn)值。_FS_MINIMIZE選項(xiàng)定義了文件系統(tǒng)的最小級(jí)別。通過移除一些函數(shù),將文件系統(tǒng)分為四個(gè)級(jí)別。0:支持所有功能1:f_stat,f_getfree,f_unlink,f_mkdir,f_chmod,f_truncateandf_renameareremoved。2:f_opendirandf_readdirareremovedinadditionto1。3:f_lseekisremovedinadditionto2。_USE_STRFUNC0:禁止(默認(rèn))1~2:使能。通過設(shè)置_USE_STRFUNC來(lái)使能和禁止字符串函數(shù)功能。_USE_MKFS0:禁止(默認(rèn))1:使能。通過_USE_MKFS來(lái)使能f_mkfs(格式化)函數(shù)。此時(shí)_USER_MKFS需要設(shè)置為1,并且_FS_READONLY需要設(shè)置為0。_USE_FORWARD0:禁止(默認(rèn))1:使能。通過設(shè)置_USER_FORWARD來(lái)使能f_forward函數(shù),需要設(shè)置_USER_FORWARD為1:,并且_FS_TINY設(shè)置為1_USE_FASTSEEK0:禁止(默認(rèn))1:使能。使能快速定位功能,需要設(shè)置_USE_FASTSEEK為1。_CODE_PAGE936:為簡(jiǎn)體中文,0為ASCII。這個(gè)選項(xiàng)精確的規(guī)定了可以使用的OEM字符集,不正確的設(shè)置將會(huì)使文件打開失敗。_USE_LFN0~3可以用來(lái)設(shè)置,默認(rèn)為0。_USE_LFN用來(lái)選擇支持長(zhǎng)文件名的方式。此處配置為1。0:禁止使用長(zhǎng)文件名,_MAX_LFN和_LFN_UNICODE將不起作用。1:使能長(zhǎng)文件名功能,使用BSS段的靜態(tài)緩沖區(qū)。重入功能將不能被使用。2:使能長(zhǎng)文件名功能,使用動(dòng)態(tài)的棧緩沖區(qū)。3:使能長(zhǎng)文件名功能,使用動(dòng)態(tài)的堆緩沖區(qū)。_MAX_LFN12~255可以被設(shè)置,用來(lái)表示最大長(zhǎng)文件名的長(zhǎng)度。長(zhǎng)文件名的工作緩沖區(qū)占用(_MAX_LFN+1)*2字節(jié)。如果使能了長(zhǎng)文件名,unicode操作函數(shù)ff_convert()和ff_wtoupper()必須被添加。如果使用了是堆緩沖區(qū),那么內(nèi)存控制函數(shù)ff_memalloc()和ff_memfree()必須被添加。_LFN_UNICODE0:ANSI/OEM(默認(rèn)),1:unicode。FatFsAPI要切換字符編碼形式為Union時(shí),將LEN和LFN_UNICODE為1。_FS_RPATH0~2可以被設(shè)置,默認(rèn)為0。_FS_RPAH用來(lái)配置相對(duì)路徑的特性。0:禁止使用相對(duì)路徑,移除相關(guān)的函數(shù)。1:使能相對(duì)路徑特性,可以使用f_chdirve()和f_chdir()兩個(gè)函數(shù)。2:在1的基礎(chǔ)上增加了f_getcwd()函數(shù)。注意:讀取路徑函數(shù)f_readdir()將會(huì)受到這個(gè)選項(xiàng)的影響。_VOLUMES默認(rèn)為1。整個(gè)文件系統(tǒng)有幾個(gè)邏輯驅(qū)動(dòng)器(分區(qū))。_MAX_SS512(默認(rèn))、1024、2048、4096。扇區(qū)被設(shè)置的最大字節(jié)數(shù)。在硬盤上將會(huì)一直被設(shè)置為512,但是一個(gè)大的分區(qū)可能會(huì)要求,比如在板上flash、軟盤、光盤。如果_MAX_SS大于512,那么disk_ioctl中的GET_SECTOR_SIZE必須生效。_MULTI_PARTITION0:?jiǎn)畏謪^(qū),每個(gè)分區(qū)都會(huì)被綁定到一個(gè)屋里驅(qū)動(dòng)號(hào)上。而且只能掛載第一個(gè)分區(qū)。1/2:使能多分區(qū)功能,每一個(gè)分區(qū)都會(huì)去試圖分開在VolToPart[]中。_USE_ERASE0:禁止(默認(rèn)),1:使能。使能扇區(qū)擦除功能,需要設(shè)置_USE_ERASE為1,且必須使disk_ioctl()函數(shù)中的CTRL_EARSE_SECTOR命令生效。_WORD_ACCESS0~1可以被設(shè)置,0為默認(rèn)值。_WORD_ACCESS選項(xiàng)定義了選擇哪一種存儲(chǔ)方式在FAT分區(qū)(卷)中來(lái)處理字操作。0為字節(jié)存儲(chǔ),能夠兼容所有的平臺(tái)。1為字存儲(chǔ)。當(dāng)字節(jié)順序?yàn)榇蠖嘶蛘邲]有字對(duì)齊時(shí),必須使用字節(jié)存儲(chǔ)。_FS_REENTRANT0:禁止(默認(rèn)),1:使能。_FS_REENTRANT選項(xiàng)用來(lái)配置FatFs的重入(線程安全訪問)功能模塊。0:禁止重入,_SYNC_t和_FS_TMEOUT失去作用。1:使能重入,用戶可以提供同步操作,ff_req_grant,ff_rel_grant,ff_del_syncobj函數(shù)必須被提供。_FS_TIMEOUT設(shè)置操作最大所允許的響應(yīng)時(shí)間,在_FS_TIMEOUT個(gè)滴答周期后,發(fā)送timeout信號(hào)。_SYNC_t操作系統(tǒng)依所依賴的關(guān)于同步操作的結(jié)構(gòu),比如有:HANDLE,OS_EVENT*,ID等等。_FS_SHARE0:禁止(默認(rèn)),大于0:一個(gè)文件所允許打開的次數(shù)。使能文件共享特性,需要設(shè)置_FS_SHARE為大于等于1的數(shù)。這個(gè)值將是所允許同時(shí)打開的文件數(shù)目。3.3FatFS文件系統(tǒng)結(jié)構(gòu)分析3.3.1FatFS模塊結(jié)構(gòu)FatFS文件系統(tǒng)由上下兩層組成,上層是文件系統(tǒng)的核心,通過實(shí)現(xiàn)文件系統(tǒng)的操作接口實(shí)現(xiàn)了文件系統(tǒng)的FAT原理。底層是文件系統(tǒng)的基礎(chǔ),主要定義了一些底層扇區(qū)的讀寫、及控制函數(shù)。如圖3.1所示。應(yīng)用程序文件系統(tǒng)層文件操作功能函數(shù)(ff.c)文件操作底層接口函數(shù)(diskio.c)文件操作功能函數(shù)(ff.c)文件操作底層接口函數(shù)(diskio.c)操作系統(tǒng)時(shí)間管理信號(hào)量操作時(shí)間管理信號(hào)量操作STDIOGPIO UART RTC 芯片、外設(shè)及其對(duì)應(yīng)的外設(shè)庫(kù)STDIOGPIO UART RTC 圖3.1FatFS模塊結(jié)構(gòu)3.3.2FatFS定義的結(jié)構(gòu)體FatFS文件系統(tǒng)用到了基本的四個(gè)結(jié)構(gòu)體類型,分別為FATFS、FIL、DIR、FILINFO。FATFS定義了文件系統(tǒng)的一些基本屬性,主要是文件系統(tǒng)保留區(qū)的的信息。fs_type0表示沒有掛載drv物理驅(qū)動(dòng)器號(hào)csize每個(gè)簇的扇區(qū)數(shù)n_fats本文件系統(tǒng)共有幾個(gè)fat表wflag緩沖win[]寫滿標(biāo)識(shí),如果為1的話必須回寫fsi_flagfsinfo結(jié)構(gòu)寫滿標(biāo)識(shí),如果為1的話必須回寫id文件系統(tǒng)的掛載IDn_rootdir根目錄下的入口個(gè)數(shù)ssize每個(gè)扇區(qū)的字節(jié)數(shù),僅在_MAX_SS不等于512時(shí)有效_SYNC_t在多線程中實(shí)現(xiàn)同步操作的結(jié)構(gòu),只有在使能重入配置時(shí)才有效last_clust最后一個(gè)存儲(chǔ)的簇號(hào),在只讀模式下無(wú)效free_clust空閑簇的數(shù)目,在文件系統(tǒng)中有專門的扇區(qū)來(lái)存放空閑的簇的數(shù)目,在只讀模式下無(wú)效fsi_sectorfsinfo結(jié)構(gòu)的扇區(qū),在只讀模式下無(wú)效cdir用來(lái)記錄當(dāng)前文件的起始簇號(hào),在使能相對(duì)路徑時(shí)才有效n_fatnet最大的簇號(hào)fsize一張fat表所占用的扇區(qū)數(shù)fatbasefat表區(qū)的起始扇區(qū)號(hào)dirbase目錄區(qū)的起始扇區(qū)號(hào)database數(shù)據(jù)區(qū)的起始扇區(qū)號(hào)winsect當(dāng)前在win[]緩沖區(qū)中存放的扇區(qū)號(hào)win[]磁盤存儲(chǔ)窗口,微型文文件系統(tǒng)沒有這個(gè)緩沖區(qū)FIL定義了文件的讀寫信息,包括讀寫指針的位置,當(dāng)前所在簇,當(dāng)前扇區(qū),文件的大小等。fs指向自身所在的文件系統(tǒng)的指針id此文件系統(tǒng)掛載的IDflag文件狀態(tài)標(biāo)志padlfptr文件讀寫指針,0:表示文件剛打開fsize此文件的大小sclust文件的起始簇號(hào),當(dāng)文件大小為0時(shí),起始簇號(hào)也為0clust當(dāng)前所在的簇desct當(dāng)前的所在扇區(qū)號(hào)dir_sect扇區(qū)包含的目錄入口,只有在讀寫模式下才有效dir_ptr在win[]緩沖區(qū)中指向目錄入口的指針,只有在讀寫模式下才有效cltbl指向簇鏈接表的指針,當(dāng)文件打開時(shí)為null,只有在使能快速查找功能時(shí)才有效lockid文件鎖定號(hào)(在信號(hào)量表中的索引)buf[]文件的讀寫緩沖區(qū)DIR目錄結(jié)構(gòu)體定義了目錄的一些基本信息fs指向自身所在的文件系統(tǒng)的指針id此文件系統(tǒng)掛載的IDindex當(dāng)前讀寫索引號(hào)sclust起始簇號(hào)clust當(dāng)前所在簇的粗豪sect當(dāng)前扇區(qū)號(hào)dir在win[]緩沖區(qū)中指向短文件名得起始地址fn指向SFN的指針,指向短文件名lfn指向長(zhǎng)文件名得工作緩沖區(qū),只有在使能長(zhǎng)文件名的時(shí)候才可以使用lfn_idx最后一個(gè)匹配的長(zhǎng)文件名索引號(hào),0xFFFF:表示沒有長(zhǎng)文件名,只有在使能長(zhǎng)文件名得時(shí)候才能使用FILINFO文件的屬性結(jié)構(gòu)體,定義了文件的基本屬性,創(chuàng)建日期,修改日期,訪問日期等等f(wàn)size文件的大小fdate文件的修改日期ftime文件的修改時(shí)間fattrib文件的基本屬性fname[]短文件名lfname指向長(zhǎng)文件名得指針lfsize記錄長(zhǎng)文件名得長(zhǎng)度3.4SD卡接口3.4.1SD協(xié)議SD卡是基于flash的存儲(chǔ)卡。SD卡和MMC卡的區(qū)別在于初始化的過程不同。SD卡的通信協(xié)議包括SD和SPI兩類。SD卡使用卡內(nèi)智能控制模塊進(jìn)行FALSH操作控制,包括協(xié)議、安全算法、數(shù)據(jù)存儲(chǔ)、ECC算法、缺陷處理和分析、電源管理、時(shí)鐘管理。SD卡結(jié)構(gòu)如圖3.2所示。SD卡Flash模塊SD卡控制芯片數(shù)據(jù)輸入/輸出Flash模塊SD卡控制芯片數(shù)據(jù)輸入/輸出SD總線/SPI總線接口 SD總線/SPI總線接口控制控制 圖3.2SD卡接口圖SD總線協(xié)議是基于命令和數(shù)據(jù)位流的方式的,有一個(gè)起始位開始,以一個(gè)停止位結(jié)束。命令——命令是開始操作的標(biāo)記。命令從主機(jī)發(fā)送一個(gè)卡(尋址命令)或所有連接的卡(廣播命令)。命令在CMD線上串行傳送。響應(yīng)——響應(yīng)是從尋址卡或所有連接的卡(同步)發(fā)送給主機(jī)用來(lái)響應(yīng)接受到的命令的標(biāo)記。命令在CMD線上串行傳送。響應(yīng)標(biāo)記(token)根據(jù)內(nèi)容不同具有四種格式,標(biāo)記長(zhǎng)度。長(zhǎng)度為48位或136位。數(shù)據(jù)塊的CRC算法采用16位的CCITT多項(xiàng)式。數(shù)據(jù)——數(shù)據(jù)可以通過數(shù)據(jù)線在卡和主機(jī)間雙向傳送。3.4.2SD命令SD卡的命令長(zhǎng)度為48位,命令格式如下表3.6所示。表3.6命令結(jié)構(gòu)01bit5….bit0bit31…bit0bit6…bit01起始位Host命令編號(hào)參數(shù)CRC7結(jié)束位SD卡命令集分為基本命令、讀塊命令、寫塊命令、擦除命令、寫保護(hù)命令、鎖命令、應(yīng)用命令7類,每個(gè)類支持一個(gè)卡功能集合操作。用的命令如表3.7所示。表3.7常用的SD卡命令命令索引類型參數(shù)響應(yīng)縮寫描述CMD0bc--GO_IDLE_STATE重置所有卡到空閑狀態(tài)CMD8bcr[31:12]保留[11:8]電壓[7:0]模式R7SEND_IF_COND發(fā)送SD卡的接口環(huán)境ACMD41bcr[31:1]OCRR3SD_APP_OP_COND請(qǐng)求條件寄存器OCRCMD2bcr[31:0]數(shù)據(jù)位R2ALL_SEND_CID請(qǐng)求標(biāo)識(shí)寄存器CIDCMD3bcr[31:0]數(shù)據(jù)位R6SENG_ELATIVE_ADDR要求提供新的地址RCACMD7ac[31:16]RCA[15:0]數(shù)據(jù)位R1bSELEC/DESELECT_CARD選擇或者取消卡3.5FatFS文件系統(tǒng)的移植FatFS文件系統(tǒng)具有很好的移植性和層次性,能夠在所有的支持C標(biāo)準(zhǔn)系統(tǒng)下運(yùn)行。目前FatFS在微控制器領(lǐng)域廣泛應(yīng)用,相關(guān)的資源比較多。本節(jié)討論FatFS文件系統(tǒng)在uTenux上移植和一些注意事項(xiàng)。導(dǎo)體(ST)的STM32f407ZG,SD卡選擇的為MicroSD卡,容量為2G。把FatFS編譯進(jìn)uTenux內(nèi)核,然后通過J-Link燒寫到開發(fā)板SRAM中,復(fù)位加載內(nèi)核。本次移植工作采用的是宿主機(jī)+目標(biāo)板的開發(fā)模式。宿主機(jī)為PC+Win7,目標(biāo)板為意法半FatFs具備清晰的層次結(jié)構(gòu),這種層次結(jié)構(gòu)使得文件系統(tǒng)與硬件相關(guān)的部分都包含在diskio.c中,即只需要按照disk.h編寫出對(duì)應(yīng)的disk.c即可使文件系統(tǒng)運(yùn)行起來(lái)。3.5.1開發(fā)環(huán)境uT/Stdio本次移植工作是在uT/Studio[1]V3.1上進(jìn)行開發(fā)編譯的。在微控制器的開發(fā)過程中,大學(xué)生和小企業(yè)因?yàn)槌杀驹?,不能?gòu)買商業(yè)軟件,這時(shí)可以使用悠龍軟件的開源免費(fèi)的開發(fā)環(huán)境工具-uT/Studio工具鏈,其中包含了Eclipse集成開發(fā)環(huán)境、ARM公司針對(duì)微控制器優(yōu)化的GNU編譯器及其二進(jìn)制工具集、MSYS最小POSIX系統(tǒng)工具集。推薦使用的仿真器是J-LinkICEV8,其中包括了FlashROM的燒寫工具和在線調(diào)試工具等。下載相關(guān)代碼:(1)從http://www.uloong.cc/cn/develop/tenux.htm下載uT/StudioV3.1安裝包,并參照軟件包中的uT-Studio_V3.0.00_C\uT-Studio_Edition\manual手冊(cè)進(jìn)行uT/Studio安裝。(2)從http://www.uloong.cc/cn/index.htm下載uTenuxV1.500R160源代碼。(3)從/fsw/ff/00index_e.html下載FatFsR0.09源代碼。(4)從意法半導(dǎo)體(ST)官網(wǎng)下載SD卡庫(kù)。3.5.2構(gòu)建移植環(huán)境將uTenuxV1.5工程導(dǎo)入uT/Studio中,建立相關(guān)目錄,如表3.8所示。表3.8新建目錄和文件序號(hào)目錄子目錄子目錄子目錄說明1include2sbs3midfatfsFatfs、sd卡頭文件4subass5midfatfs6build7app_stm32f4makefile8src源文件9diskio.c新建文件1.將FatFs源代碼和SD卡庫(kù)中的.h文件復(fù)制到include/sbs/midfatfs目錄下。將FatFs源代碼和SD卡庫(kù)中的.c文件復(fù)制到include/sbs/midfatfs目錄下。2.修改數(shù)據(jù)類型:為了使整個(gè)工程都遵循C99標(biāo)準(zhǔn),需要修改添加進(jìn)來(lái)的程序文件,并將之前的類型定義文件integer.h刪除,修改規(guī)則如表3.9所示。注意:(1)將所有源數(shù)據(jù)類型替換為對(duì)應(yīng)的目標(biāo)數(shù)據(jù)類型,注意不要將注釋或字符串替換。(2)將#include”integer.h”替換為#include”ts_basic.h”;將#include<stdio.h>替換為#include”ts_basic.h”;將option\*.c中#incliude“../ff.h”替換為#include“ff.h”。(3)將sdcard.c中bool類型的聲明刪除。(4)將integer.h文件刪除。需要修改的文件有\(zhòng)include\sbs\midfatfs\*.h,\subass\midfatfs\src\*.c,\subass\midfatfs\src\option\*.c。表3.9數(shù)據(jù)類型轉(zhuǎn)換標(biāo)準(zhǔn)序號(hào)類型1(源)類型2(源)類型3(源)C99類型(目標(biāo))1intINT-int32_t2unsignedintUINT-uint32_t3charCHAR-int8_t4unsignedcharUCHARBYTEuint8_t5shortSHORT-int16_t6unsignedshortUSHORT-uint16_t7unsignedshortWORDWCHARuint16_t8longLONG-int32_t9unsignedlongULLONGDWORDuint32_t10BOOL--Bool11FALSE--false12TRUE--true修改宏和條件編修改編譯條件使得能將FatFs編譯到內(nèi)核中,用到了makefile的語(yǔ)法的基本知識(shí),由于冗長(zhǎng)此處略寫,可以參照FatFs移植文檔。3.5.3初始化diskio_initialize函數(shù)用來(lái)初始化/識(shí)別指定的存儲(chǔ)設(shè)備,識(shí)別成功才能執(zhí)行后續(xù)操作,假如識(shí)別失敗,則報(bào)錯(cuò)自動(dòng)退出。通過傳進(jìn)來(lái)的參數(shù)判斷此時(shí)要初始化的磁盤物理驅(qū)動(dòng)號(hào),此參數(shù)用于多分區(qū),或者存儲(chǔ)設(shè)備比較多時(shí),假如為單分區(qū),這個(gè)參數(shù)默認(rèn)為0,多分區(qū)時(shí)多見于用switch語(yǔ)句進(jìn)行選擇,此處用if語(yǔ)句進(jìn)行判斷。選擇了指定的驅(qū)動(dòng)器號(hào)0,然后就是執(zhí)行對(duì)SD卡的識(shí)別和初始化操作,讀取相關(guān)的信息。代碼如下:/**FunctionName:disk_initialize*CreateDate:2013/05/08*Author:Houlw*Description:diskinitialize*Param :uint8_tdrv:Physicaldrivenmuber(0..)*ReturnCode:DRESULT*/DSTATUSdisk_initialize(uint8_tdrv){/*Physicaldrivenmuber(0..)*/SD_ErrorStatus;if(drv==0){Status=SD_Init();if(Status!=SD_OK){returnSTA_NOINIT;}else{Status=SD_GetCardInfo(&SDCardInfo);if(Status!=SD_OK){returnSTA_NOINIT;//RES_NOTRDY;}Status=SD_SelectDeselect((u32)(SDCardInfo.RCA<<16));if(Status!=SD_OK){returnSTA_NOINIT;}switch(SD_Mode){case0:/*dmamode*/Status=SD_EnableWideBusOperation(SDIO_BusWide_1b);if(Status!=SD_OK){returnRES_NOTRDY;}Status=SD_SetDeviceMode(SD_DMA_MODE);if(Status!=SD_OK){returnRES_NOTRDY;}break;case1:Status=SD_EnableWideBusOperation(SDIO_BusWide_1b);if(Status!=SD_OK){returnRES_NOTRDY;}Status=SD_SetDeviceMode(SD_INTERRUPT_MODE);if(Status!=SD_OK){returnRES_NOTRDY;}break;default:returnRES_NOTRDY;}return0;}}else{returnSTA_NOINIT;}}3.5.4讀寫函數(shù)讀寫函數(shù)向磁盤中讀出或?qū)懭霐?shù)據(jù),供上層函數(shù)調(diào)用。讀寫通過SD卡命令,來(lái)操作SD卡。有四個(gè)參數(shù),依次為磁盤驅(qū)動(dòng)號(hào)、讀寫緩沖區(qū)、起始扇區(qū)號(hào)、讀寫的扇區(qū)個(gè)數(shù)。讀一個(gè)扇區(qū),則:Status=SD_ReadBlock(sector<<9,(u32*)(&buff[0]),BlockSize);讀多個(gè)代碼則:Status=SD_ReadMultiBlocks(sector<<9,(u32*)(&buff[0]),BlockSize,count);寫一個(gè)扇區(qū),則:Status=SD_WriteBlock(sector<<9,(u32*)(&buff[0]),BlockSize);寫多個(gè)扇區(qū),則:Status=SD_WriteMultiBlocks(sector<<9,(u32*)(&buff[0]),BlockSize,count);4移植結(jié)果的測(cè)試可以通過單元測(cè)試來(lái)檢測(cè)與文件系統(tǒng)相關(guān)的各個(gè)外設(shè)模塊、寄存器、變量值的正確性。通過集成測(cè)試來(lái)測(cè)試文件系統(tǒng)的各個(gè)功能函數(shù)使用的正確性,由于篇幅所限這里只列出部分測(cè)試代碼。本次測(cè)試主要針對(duì)的是文件系統(tǒng)的可用性,主要證明移植的正確性。測(cè)試的功能為輸出SD卡中根目錄下存在的文件,并輸出每個(gè)文件的前一部分內(nèi)容。SD卡中有3個(gè)文件:文件名為filename1,filename2,filename3。文件內(nèi)容依次為1.2.3…..,a.b.c.d…..,A.B.C.D….主要代碼如下:ercd=disk_initialize(0);if(ercd!=RES_OK){tm_putstring((UB*)"diskinitializeerror.\n");return;}else{tm_putstring((UB*)"diskinitializesuccess.\n");}ercd=f_mount(0,&fs);if(ercd!=RES_OK){tm_putstring((UB*)"FileMountreturn;}else{tm_putstring((UB*)"FileMount}if(f_opendir(&dirs,path)==FR_OK){while(f_readdir(&dirs,&finfo)==FR_OK){if(finfo.fattrib&AM_ARC){if(!finfo.fname[0]){break;}tm_putstring((UB*)"filename:");tm_putstring((UB*)finfo.fname);tm_putstring((UB*)"\n");#if_USE_LFNtm_putstring((UB*)"Longfilename:");tm_putstring((UB*)finfo.lfname);tm_putstring((UB*)"\n");#endifres=f_open(&fsrc,finfo.fname,FA_OPEN_EXISTING|FA_READ);br=1;a=0;tm_putstring((UB*)"Filetext:");for(a=0;a<512;a++){buffer[a]=0;}res=f_read(&fsrc,buffer,sizeof(buffer),&br);tm_putstring((UB*)buffer);tm_putstring((UB*)"\n");if(res||br==0){/*errororeof*/break;}f_close(&fsrc);}}}串口信息輸出如下圖4.1:圖4.1串口輸出信息5總結(jié)與展望文件系統(tǒng)作為操作系統(tǒng)的重要組成部分,決定了操作系統(tǒng)本身信息和用戶數(shù)據(jù)在存儲(chǔ)設(shè)備上的組織形式。隨著嵌入式系統(tǒng)的發(fā)展,越來(lái)越多的嵌入式系統(tǒng)需要處理大量的數(shù)據(jù),所以文件系統(tǒng)將是嵌入式系統(tǒng)應(yīng)用的一個(gè)必然趨勢(shì)。由于嵌入式存儲(chǔ)設(shè)備的特殊性、電源供給的不穩(wěn)定性和移動(dòng)存儲(chǔ)的安全性等要求,嵌入式系統(tǒng)的重要性在嵌入式系統(tǒng)中愈加明顯。本論文基于SD卡實(shí)現(xiàn)了文件系統(tǒng)的基本操作,比如文件和目錄的基本操作,以及格式化等基本的SD卡操作,對(duì)系統(tǒng)的性能的提高有很大的作用。第一次實(shí)現(xiàn)FatFs在uTenux上的移植。本論文在研究FAT文件系統(tǒng)規(guī)范的基礎(chǔ)上,在嵌入式uTenux上移植了FatFs文件系統(tǒng),具有可讀寫,占用資源少,啟動(dòng)速度快等優(yōu)良特點(diǎn)。實(shí)際應(yīng)用中還需要注意一些地方,增加文件系統(tǒng)多線程訪問和互斥訪問機(jī)制,增加時(shí)間管理等功能,以適應(yīng)嵌入式操作系統(tǒng)對(duì)文件系統(tǒng)功能要求的增強(qiáng)。
參考文獻(xiàn)[1]劉波文.ARMCortex–M3應(yīng)用開發(fā)實(shí)例詳解[M].北京:電子工業(yè)出版社,2011[6]孟博宇.STM32自學(xué)筆記[M].北京:北京航空航天大學(xué)出版社,2012[2]魏忠,蔡勇,雷紅衛(wèi).嵌入式開發(fā)詳解[M].北京:電子工業(yè)出版社,2003[3]王田苗.嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例分析[M].北京:清華大學(xué)出版社,2003[4]張繼柯,谷青范.基于Flash的嵌入式文件系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2011,24(4):84-86.[5]李世奇,董浩斌.基于FatFs文件系統(tǒng)的SD卡存儲(chǔ)器設(shè)計(jì)[J].測(cè)控技術(shù).2011,30(12):70-81.[6]林建民.嵌入式操作系統(tǒng)發(fā)展趨勢(shì)[J].計(jì)算機(jī)工程.2001,7(10):1-4[7]WolfW.Cybel-physicalsystems[J].IEEEComputer.2009,42(3):88-89[8]RosenblumM.TheDesignandImplementationofaLogStructuredFileSystem[J].TransactionsonComputerSystems.1992,10(8):25-30[9]毛永強(qiáng).基于日志結(jié)構(gòu)的嵌入式文件系統(tǒng)研究與應(yīng)用[D].華中師范大學(xué),2006[10]高永占,周洪利.基于SD卡的嵌入式文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京交通大學(xué),2010[11]ChaN.ELM-FATFileSyatemModule[EB/OL]./fsw/ff/ooindex_e.html[12]uTenux源代碼.http://www.uloong.cc/cn/index.htm[13]uT/Stdio安裝包.http://www.uloong.cc/cn/develop/tenux.htm[14]SD卡接口規(guī)范[S].V2.0[15]FAT規(guī)范[S].MicrosoftExtensibleFirmwareInitiativeFAT32FileSystemSpecificationVersion1.03MicrosoftCorporation
致謝在攻讀學(xué)士學(xué)位,特別是完成論文期間,很多人在多方面為我提供幫助和支持,值此論文結(jié)束之際,一并向他們表示真誠(chéng)的感謝。首先,我衷心的感謝我的導(dǎo)師劉春貴,是他為我提供了學(xué)習(xí),研究的機(jī)會(huì)和工作平臺(tái)。在整個(gè)學(xué)習(xí)過程中,劉老師不僅從學(xué)術(shù)上、還是為人處世、個(gè)人發(fā)展及生活等方面給予我極大的關(guān)懷和支持。他淵博的知識(shí)、嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度、精益求精的工作作風(fēng)給我留下了深刻的印象,是我終生尊敬的師長(zhǎng)、學(xué)習(xí)的榜樣。其次,我要深深的感謝大連悠龍公司的王紹斌,王曉東等老師,他們無(wú)私的知道也使我終生受益,與他們的探討和交流,給了我很多啟發(fā),使我受益非淺,感悟頗深。最后,衷心地感謝為我評(píng)閱論文而付出辛勤勞動(dòng)的老師和學(xué)者們。
FatFsFileSystemMigrationBasedonuTenuxOperatingSystem Abstract:Withthedevelopmentofembeddedtechnology,especiallytheARMtechnologyconstantlyupdated,launchedthecortexserieschip,makingthegrowingcapabilitiesofembeddeddevices,andgraduallytransitiontotheeraofthesingle-chipmicrocontrollerera,haveaccesstothedatavolumeasignificantincrease,whichrequiresdatamanipulationlevelofclarity,improvedtransparency,maintainability,standardizationofinterfaces,portable,flexibleoperationanddatastoragereliabilityandsoputforwardhigherrequirements,soitisnecessarytointroducefilesystemtocompletethedatastorageandmanagementcapabilities,providinguserswithaccesstodatabyname,theinterface,thusavoidingtheapplicationdevelopersdirectaccessmemorybroughtinsecurity.ThisthesisisbasedonuTenuxoperatingsystemmigrationFatFSfilesystems,filesystemsarediscussedindetailtheimplementationoftheprinciple,bytransplantingsoFatFSinuTenuxoperatingsystems.Implementationfilesanddirectoriestocreate,open,read,write,close,etc.Keywords:microcontrollers;uTenux;FatFS;ARM基于C8051F單片機(jī)直流電動(dòng)機(jī)反饋控制系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的嵌入式Web服務(wù)器的研究MOTOROLA單片機(jī)MC68HC(8)05PV8/A內(nèi)嵌EEPROM的工藝和制程方法及對(duì)良率的影響研究基于模糊控制的電阻釬焊單片機(jī)溫度控制系統(tǒng)的研制基于MCS-51系列單片機(jī)的通用控制模塊的研究基于單片機(jī)實(shí)現(xiàn)的供暖系統(tǒng)最佳啟停自校正(STR)調(diào)節(jié)器單片機(jī)控制的二級(jí)倒立擺系統(tǒng)的研究基于增強(qiáng)型51系列單片機(jī)的TCP/IP協(xié)議棧的實(shí)現(xiàn)基于單片機(jī)的蓄電池自動(dòng)監(jiān)測(cè)系統(tǒng)基于32位嵌入式單片機(jī)系統(tǒng)的圖像采集與處理技術(shù)的研究基于單片機(jī)的作物營(yíng)養(yǎng)診斷專家系統(tǒng)的研究基于單片機(jī)的交流伺服電機(jī)運(yùn)動(dòng)控制系統(tǒng)研究與開發(fā)基于單片機(jī)的泵管內(nèi)壁硬度測(cè)試儀的研制基于單片機(jī)的自動(dòng)找平控制系統(tǒng)研究基于C8051F040單片機(jī)的嵌入式系統(tǒng)開發(fā)基于單片機(jī)的液壓動(dòng)力系統(tǒng)狀態(tài)監(jiān)測(cè)儀開發(fā)模糊Smith智能控制方法的研究及其單片機(jī)實(shí)現(xiàn)一種基于單片機(jī)的軸快流CO〈,2〉激光器的手持控制面板的研制基于雙單片機(jī)沖床數(shù)控系統(tǒng)的研究基于CYGNAL單片機(jī)的在線間歇式濁度儀的研制基于單片機(jī)的噴油泵試驗(yàn)臺(tái)控制器的研制基于單片機(jī)的軟起動(dòng)器的研究和設(shè)計(jì)基于單片機(jī)控制的高速快走絲電火花線切割機(jī)床短循環(huán)走絲方式研究基于單片機(jī)的機(jī)電產(chǎn)品控制系統(tǒng)開發(fā)基于PIC單片機(jī)的智能手機(jī)充電器基于單片機(jī)的實(shí)時(shí)內(nèi)核設(shè)計(jì)及其應(yīng)用研究基于單片機(jī)的遠(yuǎn)程抄表系統(tǒng)的設(shè)計(jì)與研究基于單片機(jī)的煙氣二氧化硫濃度檢測(cè)儀的研制基于微型光譜儀的單片機(jī)系統(tǒng)單片機(jī)系統(tǒng)軟件構(gòu)件開發(fā)的技術(shù)研究基于單片機(jī)的液體點(diǎn)滴速度自動(dòng)檢測(cè)儀的研制基于單片機(jī)系統(tǒng)的多功能溫度測(cè)量?jī)x的研制基于PIC單片機(jī)的電能采集終端的設(shè)計(jì)和應(yīng)用基于單片機(jī)的光纖光柵解調(diào)儀的研制氣壓式線性摩擦焊機(jī)單片機(jī)控制系統(tǒng)的研制基于單片機(jī)的數(shù)字磁通門傳感器基于單片機(jī)的旋轉(zhuǎn)變壓器-數(shù)字轉(zhuǎn)換器的研究基于單片機(jī)的光纖Bragg光柵解調(diào)系統(tǒng)的研究單片機(jī)控制的便攜式多功能乳腺治療儀的研制基于C8051F020單片機(jī)的多生理信號(hào)檢測(cè)儀基于單片機(jī)的電機(jī)運(yùn)動(dòng)控制系統(tǒng)設(shè)計(jì)Pico專用單片機(jī)核的可測(cè)性設(shè)計(jì)研究基于MCS-51單片機(jī)的熱量計(jì)基于雙單片機(jī)的智能遙測(cè)微型氣象站MCS-51單片機(jī)構(gòu)建機(jī)器人的實(shí)踐研究基于單片機(jī)的輪軌力檢測(cè)基于單片機(jī)的GPS定位儀的研究與實(shí)現(xiàn)基于單片機(jī)的電液伺服控制系統(tǒng)用于單片機(jī)系統(tǒng)的MMC卡文件系統(tǒng)研制基于單片機(jī)的時(shí)控和計(jì)數(shù)系統(tǒng)性能優(yōu)化的研究基于單片機(jī)和CPLD的粗光柵位移測(cè)量系統(tǒng)研究單片機(jī)控制的后備式方波UPS提升高職學(xué)生單片機(jī)應(yīng)用能力的探究基于單片機(jī)控制的自動(dòng)低頻減載裝置研究基于單片機(jī)控制的水下焊接電源的研究基于單片機(jī)的多通道數(shù)據(jù)采集系統(tǒng)基于uPSD3234單片機(jī)的氚表面污染測(cè)量?jī)x的研制基于單片機(jī)的紅外測(cè)油儀的研究96系列單片機(jī)仿真器研究與設(shè)計(jì)基于單片機(jī)的單晶金剛石刀具刃磨設(shè)備的數(shù)控改造基于單片機(jī)的溫度智能控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)基于MSP430單片機(jī)的電梯門機(jī)控制器的研制基于單片機(jī)的氣體測(cè)漏儀的研究基于三菱M16C/6N系列單片機(jī)的CAN/USB協(xié)議轉(zhuǎn)換器基于單片機(jī)和DSP的變壓器油色譜在線監(jiān)測(cè)技術(shù)研究基于單片機(jī)的膛壁溫度報(bào)警系統(tǒng)設(shè)計(jì)基于AVR單片機(jī)的低壓無(wú)功補(bǔ)償控制器的設(shè)計(jì)基于單片機(jī)船舶電力推進(jìn)電機(jī)監(jiān)測(cè)系統(tǒng)基于單片機(jī)網(wǎng)絡(luò)的振動(dòng)信號(hào)的采集系統(tǒng)基于單片機(jī)的大容量數(shù)據(jù)存儲(chǔ)技術(shù)的應(yīng)用研究基于單片機(jī)的疊圖機(jī)研究與教學(xué)方法實(shí)踐基于單片機(jī)嵌入式Web服務(wù)器技術(shù)的研究及實(shí)現(xiàn)基于AT89S
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川西南航空職業(yè)學(xué)院《視傳藝術(shù)考察》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年花卉產(chǎn)業(yè)扶貧項(xiàng)目合作合同協(xié)議3篇
- 二零二五年度按揭貸款房屋改造貸款合同范本2篇
- 2024影視行業(yè)人才中介服務(wù)合同
- 二零二五版戶外廣告牌制作、安裝與維護(hù)全流程服務(wù)合同3篇
- 紹興文理學(xué)院元培學(xué)院《影視動(dòng)畫海報(bào)設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 個(gè)人所得稅代扣代繳協(xié)議(2024年版)
- 二零二五年度水泥管行業(yè)市場(chǎng)競(jìng)爭(zhēng)策略合同
- 二零二五年度專業(yè)安保公司員工勞動(dòng)合同范本2篇
- 山東輕工職業(yè)學(xué)院《期貨投資》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023年德宏隴川縣人民法院招聘聘用制書記員考試真題及答案
- 第四章-國(guó)防動(dòng)員
- 酒店行業(yè)pest模型分析
- 汽車經(jīng)營(yíng)計(jì)劃書
- 2024屆山東省濱州無(wú)棣縣聯(lián)考物理九上期末綜合測(cè)試試題含解析
- 兩高環(huán)境污染罪司法解釋解讀
- 部編版小學(xué)六年級(jí)語(yǔ)文上冊(cè)第六單元集體備課記錄表
- 肩袖損傷的護(hù)理查房課件
- 財(cái)務(wù)情況說明書
- 無(wú)人值守汽車衡解決方案
- 動(dòng)脈瘤介入術(shù)后護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論