一種嵌入式文件系統(tǒng)數(shù)據(jù)存儲模塊的實現(xiàn)
出處:韓曉雪,曾 鳴,邵貝貝 清華大學(xué) 發(fā)布于:2011-09-02 08:48:20
引言
信息技術(shù)(Information Technology,簡稱IT),是主要用于管理和處理信息所采用的各種技術(shù)的總稱。它主要是應(yīng)用計算機(jī)科學(xué)和通信技術(shù)來設(shè)計、開發(fā)、安裝和實施信息系統(tǒng)及應(yīng)用軟件。它也常被稱為信息和通信技術(shù)(Information and Communications Technology, ICT)。主要包括傳感技術(shù)、計算機(jī)技術(shù)和通信技術(shù)。信息技術(shù)的研究包括科學(xué),技術(shù),工程以及管理等學(xué)科,這些學(xué)科在信息的管理,傳遞和處理中的應(yīng)用,相關(guān)的軟件和設(shè)備及其相互作用。
隨著信息技術(shù)的發(fā)展,嵌入式系統(tǒng)簡單地對存儲介質(zhì)按地址、字節(jié)進(jìn)行讀寫的方式已經(jīng)不能滿足實際應(yīng)用的需求,利用文件系統(tǒng)對存儲介質(zhì)進(jìn)行管理成為嵌入式系統(tǒng)的一個發(fā)展方向。嵌入式系統(tǒng)是“控制、監(jiān)視或者輔助裝置、機(jī)器和設(shè)備運行的裝置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。從中可以看出嵌入式系統(tǒng)是軟件和硬件的綜合體,還可以涵蓋機(jī)械等附屬裝置。目前國內(nèi)一個普遍被認(rèn)同的定義是:以應(yīng)用為中心、以計算機(jī)技術(shù)為基礎(chǔ)、軟件硬件可裁剪、適應(yīng)應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗嚴(yán)格要求的專用計算機(jī)系統(tǒng)。嵌入式系統(tǒng)是以應(yīng)用為中心,以計算機(jī)技術(shù)為基礎(chǔ),軟硬件可裁剪,適用于應(yīng)用系統(tǒng),對功能、對可靠性、成本、體積、功耗有嚴(yán)格要求的專用計算機(jī)系統(tǒng)。本文中基于MC9S12UF32單片機(jī),結(jié)合開源文件系統(tǒng)FatFS,設(shè)計實現(xiàn)了使用FAT文件系統(tǒng)的大容量數(shù)據(jù)存儲模塊。
1 系統(tǒng)結(jié)構(gòu)
數(shù)據(jù)存儲系統(tǒng)框架如圖1所示。該數(shù)據(jù)存儲模塊以Freescale公司的MC9S12UF32為,串行通信接口SCI接收到的數(shù)據(jù)可以直接通過單片機(jī)以FAT文件的形式存儲在micro SD卡中。用戶程序可以通過編程控制單片機(jī),直接對micro SD卡中的任意文件進(jìn)行讀寫,實現(xiàn)存儲數(shù)據(jù)。由于實現(xiàn)了FAT文件系統(tǒng),用戶也可以通過單片機(jī)內(nèi)置的USB接口將本數(shù)據(jù)模塊識別為U盤,用PC機(jī)進(jìn)行讀寫操作。PC (personal computer),個人計算機(jī)一詞源自于1978年IBM的部桌上型計算機(jī)型號PC,在此之前有Apple II的個人用計算機(jī)。能獨立運行、完成特定功能的個人計算機(jī)。個人計算機(jī)不需要共享其他計算機(jī)的處理、磁盤和打印機(jī)等資源也可以獨立工作。今天,個人計算機(jī)一詞則泛指所有的個人計算機(jī)、如桌上型計算機(jī)、筆記型計算機(jī)、或是兼容于IBM系統(tǒng)的個人計算機(jī)等。

2 硬件結(jié)構(gòu)及底層函數(shù)的編寫
本文所介紹的數(shù)據(jù)存儲插件由MC9S12UF32、DSl2887實時鐘模塊、micro SD卡、串行通信接口以及USB接口5部分組成。實時時鐘,可以為數(shù)據(jù)存儲模塊的文件系統(tǒng)提供正確的時間戳信息,在精簡的系統(tǒng)設(shè)計中,這個部分則可以省略。
2.1 MC9S12UF32單片機(jī)
Freescale公司生產(chǎn)的這款16位單片機(jī)具有3.5 KBRAM和32 KB Flash EEPROM。它的特點在于擁有USB2.O接口、ATA5接口以及SD/MMC、SmartMedia、MemoryStick等多種存儲卡接口。
(1)SDHC模塊
SDHC是"Secure Digital High Capacity“的縮寫,即“高容量SD存儲卡”。2006年5月SD協(xié)會發(fā)布了SD 2.0的系統(tǒng)規(guī)范,并在其中規(guī)定SDHC是符合該規(guī)范、容量大于2GB小于等于32GB的SD卡。SDHC的特點就是高容量(2GB-32GB)。另外,SD協(xié)會規(guī)定SDHC必須采用FAT32 文件系統(tǒng),這是因為之前在SD卡中使用的FAT16文件系統(tǒng)所支持的容量為2GB,并不能滿足SDHC的要求。作為SD卡的繼任者,SDHC主要特征在于文件格式從以前的FAT12、FAT16提升到了FAT32,而且支持32GB。同時傳輸速度被重新定義為Class2、Class4、Class6等級別,高速的SD卡可以支持高分辨視頻錄制的實時存儲。
SDl.O規(guī)范協(xié)議中定義了對SD卡的兩種訪問模式:SD模式和SPI模式。使用SDHC(Secured Digital cardHost Controller)模塊對SD卡讀寫采用了SD模式。SD卡與SDHC的連接如圖2所示。
MC9S12UF32內(nèi)部集成的SDHC模塊支持SD卡1.O版本的物理層協(xié)議,所以本系統(tǒng)使用標(biāo)準(zhǔn)microSD卡(而非SDHC卡),其存儲容量為2 GB。這樣的存儲容量已經(jīng)完全可以滿足大多數(shù)嵌入式應(yīng)用的需求。

(2)MC9S12UF32與SD卡之間的數(shù)據(jù)傳輸
在完成對時鐘頻率和傳輸數(shù)據(jù)線寬度的配置之后,通過發(fā)送相應(yīng)的讀寫命令就可以實現(xiàn)單片機(jī)與SD卡之間的數(shù)據(jù)傳輸了。在單片機(jī)向SD卡寫入數(shù)據(jù)的過程中,編程者將需要寫入的數(shù)據(jù)寫入SDHC模塊的SDATA寄存器(16位)之后,該數(shù)據(jù)將被轉(zhuǎn)移至發(fā)送數(shù)據(jù)FIFO中。與此同時,只要發(fā)送數(shù)據(jù)FIFO非空,其中的數(shù)據(jù)就會不斷地通過數(shù)據(jù)線被寫入SD卡的相應(yīng)位置。在單片機(jī)從SD卡中讀取數(shù)據(jù)的過程中,SD卡中的數(shù)據(jù)將不斷發(fā)送至接收數(shù)據(jù)FIFO中。
2.2 DSl2887實時鐘模塊
DSl2887模塊使用數(shù)據(jù)/地址復(fù)用的并行異步總線,可以為單片機(jī)提供100年以內(nèi)的實時鐘信息(年/月/日/時/分/秒)。它內(nèi)部具有石英晶振和鋰電源,首次使用時,需要對該模塊內(nèi)部的寄存器進(jìn)行相應(yīng)配置,激活晶振使其進(jìn)入工作狀態(tài)。
設(shè)定DSl2887的時間和從DSl2887中讀取時間信息的底層程序比較簡單,只需參照芯片手冊對寄存器進(jìn)行合理配置。但是,需要特別注意的是,在寫時鐘和讀取時鐘之前需要鎖存時鐘信息相關(guān)的buffer,防止在讀寫過程中由于出現(xiàn)時鐘信息自動更新情況而導(dǎo)致的錯誤。系統(tǒng)中,在每次讀寫實時鐘之前,查詢DSl2887內(nèi)部控制寄存器A位UIP是否為O,以避免上述錯誤的產(chǎn)生。因為芯片手冊中給出,一旦UIP=O,那么在244μs內(nèi)實時鐘模塊都不會自動更新當(dāng)前的時鐘信息,而這段時間足以讓單片機(jī)完成讀寫實時鐘的過程。
3 FatFS文件系統(tǒng)的移植與配置
3.1 FatFS軟件包簡介
采用文件系統(tǒng),是為了在單片機(jī)能夠?qū)D卡進(jìn)行數(shù)據(jù)讀寫的同時,保證其讀寫的數(shù)據(jù)能夠被大多數(shù)通用設(shè)備識別。換言之,數(shù)據(jù)在存儲器內(nèi)的組織型式,需要遵循一些已有的工業(yè)標(biāo)準(zhǔn)和規(guī)范。
當(dāng)前著名的嵌入式文件系統(tǒng)有若干種選擇,這之中EFSL和FatFs都是開放源碼的,具有十分詳盡的文檔和函數(shù)手冊,除錯更新也十分及時,在本文的設(shè)計中我們采用的是FatFS。
FatFS采用使用ANSI C編寫,具有很好的硬件平臺獨立性,使用者只需要對源程序進(jìn)行簡單的修改和配置,就可以將其移植到各種系列的單片機(jī)上。此外,它的內(nèi)存開銷很小,ROM的占有量在十幾KB的量級,使用者可以根據(jù)不同的應(yīng)用方便的對代碼進(jìn)行裁減。FatFS支持FATl2、FATl6和FAT32,可以建立獨立的緩沖區(qū)對多個文件進(jìn)行讀寫。FatFs是一個通用的文件系統(tǒng)模塊,用于在小型嵌入式系統(tǒng)中實現(xiàn)FAT文件系統(tǒng)。 FatFs 的編寫遵循ANSI C,因此不依賴于硬件平臺。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, SH, Z80, H8, ARM 等等,不需要做任何修改。
3.2 FatFS的移植
可從FatFS的主頁上得到FatFS R0.07版本。FatFS的主程序包含5個文件,即diskio.c、diskio.h、ff.c、ff.h和integer.h。其中,diskio.c和diskio.h是與底層硬件I/O相關(guān)的函數(shù);ff.c和ff.h是應(yīng)用函數(shù),主要涉及FatFS的配置和裁減。
移植FatFS的過程中基本不需要對diskio.h和ff.c進(jìn)行修改。除了核實integer.h中的數(shù)據(jù)類型定義是否與MC9S12U32數(shù)據(jù)類型相符之外,移植的重點工作在于diskio.c中6個主要函數(shù)的實現(xiàn)和ff.h中對于文件系統(tǒng)的裁減配置。dikio.c包含的6個接口函數(shù):disk_initial-ize,disk status,disk ioctl,disk read,disk write和disk_fattime。
具體移植過程如下:
(1)存儲媒介初始化函數(shù)
DSTATUS disk_initialize(BYTE drv)
由于采用的存儲媒介是SD卡,所以該函數(shù)的實際功能是對SD卡進(jìn)行初始化。drv是存儲介質(zhì)號碼,由于Tiny-FatFS只支持一個存儲介質(zhì),所以此處drv始終取O值。執(zhí)行無誤,則返回值=O;執(zhí)行中出現(xiàn)錯誤,則返回非O值。
(2)狀態(tài)檢測函數(shù)
DSTATUS disk_status(BYTE drv)
該函數(shù)用于檢測是否支持當(dāng)前的存儲介質(zhì)。此處的drv仍然恒為O。對Tiny-FatFS而言,只要drv為O,就認(rèn)為支持當(dāng)前介質(zhì),函數(shù)直接返回O值即可。
(3)讀扇區(qū)函數(shù)
DRESULT disk read(BYTE drv,BYTE*buff,DWORD seetor,BYTE.count)
該函數(shù)是在“單片機(jī)從SD卡讀取一個扇區(qū)”的函數(shù)基礎(chǔ)上編寫而成的,其功能是從SD卡讀取一個或多個扇區(qū)的數(shù)據(jù)。*buff用于存儲已經(jīng)讀取的數(shù)據(jù),sector是待讀取扇區(qū)的起始扇區(qū)數(shù),count是需要讀取的扇區(qū)數(shù)。如果執(zhí)行無誤則返回O值,否則返回非O值。
(4)寫扇區(qū)函數(shù)
DRESULT disk_write(BYTE drv,const BYTE*buff。DWORD sector,BYTE count)
與disk_read相似,該函數(shù)是在“單片機(jī)向SD卡寫入一個扇區(qū)”的函數(shù)基礎(chǔ)上編寫而成的,其功能是向SD卡導(dǎo)入一個或多個扇區(qū)的數(shù)據(jù)。*buff用于保存將要寫入的數(shù)據(jù),sector是待寫入扇區(qū)的起始扇區(qū)數(shù),count是需要寫入的扇區(qū)數(shù)。如果執(zhí)行無誤,則返回0值;否則,返回非0值。
(5)存儲介質(zhì)控制函數(shù)
DRESULT disk_ioctl(BYTE drv,BYTE ctrl,VoiI*buff)
ctrl是控制代碼,*buff用于保存或接收需要控制的數(shù)據(jù)數(shù)據(jù)。使用者可以在此函數(shù)里添加自己需要的功能代碼,例如獲得存儲介質(zhì)的容量、扇區(qū)數(shù)等。如果是簡單的應(yīng)用,也可以不執(zhí)行任何功能,直接返回0值。
(6)實時鐘函數(shù)
DWORD disk_fattime(Void)
該函數(shù)將讀取的實時鐘信息保存在一個32位無符號整數(shù)中,并將其作為函數(shù)的返回值。時鐘信息在這32位中的具體分布如表1所列。

3.3 FatFS的裁減與配置Tiny-FatFS
FatFs提供了豐富的庫函數(shù),可以實現(xiàn)創(chuàng)建、讀取文件夾,創(chuàng)建、讀寫文件,移動文件指針,向文件中寫入或讀取字符串,甚至是類似與C語言fprintf()的格式化輸入等各種功能。FatFS提供的函數(shù)與宏的對應(yīng)關(guān)系如圖3所示。

FatFS的裁減,不僅僅是函數(shù)層面的。更重要的是,在內(nèi)部機(jī)制上形成一個精簡版本,稱為Tiny-FatFS。它與標(biāo)準(zhǔn)版FatFS相比,主要的區(qū)別在于Tiny-FatFS僅支持一個物理存儲介質(zhì),而且不再針對每個開啟的文件建立512字節(jié)的緩存,整個文件系統(tǒng)和物理介質(zhì)使用同一個緩存。顯然,Tiny-FatFs需要的內(nèi)存開銷比標(biāo)準(zhǔn)版FatFS更低,只要1 KB左右的RAM。
在表2中,對ff.h中主要配置宏的含義進(jìn)行了說明,同時給出了本文所介紹的數(shù)據(jù)存儲模塊采用的取值。

4 FatFS文件系統(tǒng)的使用
FatFS文件系統(tǒng)中涉及2個基本的數(shù)據(jù)結(jié)構(gòu):文件系統(tǒng)(磁盤)的數(shù)據(jù)結(jié)構(gòu)FATFS和文件的數(shù)據(jù)結(jié)構(gòu)FIL。這兩個結(jié)構(gòu)是FatFS軟件主要的RAM開銷,F(xiàn)ATFS數(shù)據(jù)結(jié)構(gòu)中有針對磁盤的512字節(jié)讀寫緩存,F(xiàn)IL則有針對每個文件的緩存。
依次使用f_mount、f_open、f_rcad/f_write、f_close可以完成基本的讀寫。FatFS允許對同一文件同時復(fù)數(shù)讀取,但完全不支持對同一文件同時復(fù)數(shù)的寫入操作,因為這會引起文件系統(tǒng)錯誤。具體每一個函數(shù),特別是字符串讀寫、格式化讀寫等,可以參見原始幫助和例程。
此外,由于嵌入式系統(tǒng)具有突然掉電的可能性,一些關(guān)鍵代碼段可能導(dǎo)致文件系統(tǒng)錯誤,所以要注意調(diào)用f_sync()及時寫入。當(dāng)然,如果是一組連續(xù)的f_write()寫入,而每次寫完都f_sync(),則會極大地影響速度,可以全部寫完后f_sync()。
V0.07以后版本的FatFS,增加了以下新的功能:
①_FS_TINY。Tiny模式變成了一個宏選項,而不是獨立的代碼包。
②_FS_RPATH。決定是否有當(dāng)前路徑的概念,這將影響兩個相關(guān)函數(shù)的參數(shù)。
③_USE_LFN。啟用長文件名支持,可為1或2,為2時可重入。由于長文件名存在堆棧上,而且啟用LFN會依據(jù)代碼頁增加一個很大的轉(zhuǎn)換表,占掉幾十~幾百KB,所以不推薦。
④_LFN_UNICODE。長文件名使用Unicode,實驗階段,尚未正式寫入文檔。
結(jié)語
MC9S12UF32單片機(jī)內(nèi)部集成的SDHC模塊,可將SD總線轉(zhuǎn)換為單片機(jī)內(nèi)部的IP總線,開發(fā)者只需要對SD協(xié)議的基本內(nèi)容有所了解,通過讀寫相應(yīng)的寄存器就可以方便地實現(xiàn)對SD卡的底層讀寫,大大簡化了硬件的開發(fā)過程。同時,獨立于硬件平臺的FatFS軟件包可以方便地移植到各種嵌入式系統(tǒng)中,研發(fā)者只需要對該軟件包的diskio.c和ff.h進(jìn)行修改,即可完成移植,從而使用FatFS提供的豐富且易于使用的各種接口函數(shù)。
應(yīng)用上述主要技術(shù)實現(xiàn)的具有嵌入式文件系統(tǒng)的數(shù)據(jù)模塊如圖4所示。

該模塊體積小巧、存儲數(shù)據(jù)的靈活性和通用性很高,可以通過模塊自帶的串行通信接口接收數(shù)據(jù),并以文件的形式存儲起來。用戶既可以直接通過USB接口將本模塊識別為U盤進(jìn)行數(shù)據(jù)讀寫和分析,也可以將micro SD卡拔出,在任意一個具有micro SD讀卡器功能的設(shè)備上讀寫數(shù)據(jù)。
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://hbjingang.com,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負(fù)版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04









