司瑩瑩 曹高芳
摘要: 介紹了μC/FS嵌入式文件系統(tǒng)的主要功能,著重說明了μC/FS的移植步驟,實現(xiàn)了μC/FS在SD上的移植。測試結(jié)果表明,基于SD卡的μC/FS文件系統(tǒng)移植在采集系統(tǒng)中的應(yīng)用滿足了設(shè)計要求,并具有良好的性能。
關(guān)鍵詞: 嵌入式文件系統(tǒng); μC/FS; 移植
中圖分類號:TP319文獻標志碼:A文章編號:1006-8228(2012)05-03-03
Research and application of μC/FS embedded file system migration
Si Yingying, Cao Gaofang
(Binzhou Medical University,Yantai, Shandong 264003, China)
Abstract: The main function and feature of μC/FS embedded file system is described, highlights steps of μC/FS migration is illustrated. It is realized that μC/FS is migrated to SD card. The results of test show that the application of μC/FS file system migration based on SD card can meet the design of requirements and have good performance.
Key words: embedded file system; μC/FS; migration
0 引言
進入后PC技術(shù)時代,嵌入式操作系統(tǒng)成為最受關(guān)注的技術(shù)之一。在嵌入式操作系統(tǒng)中,文件管理系統(tǒng)的地位顯得非常重要。目前通用的操作系統(tǒng)上有很多成熟的文件系統(tǒng),如DOS/Windows9X下的FAT16/32文件系統(tǒng)、WindowsNT/2K/XP下的NTFS文件系統(tǒng)和UNIX文件系統(tǒng)等,但這些通用文件系統(tǒng)并不適合直接應(yīng)用于嵌入式實時系統(tǒng)。主要原因有兩點:一是通用文件系統(tǒng)采用緩存技術(shù)提高文件系統(tǒng)的速度特性,要耗費大量的系統(tǒng)資源;二是嵌入式實時系統(tǒng)電源的突發(fā)性斷電會對存儲造成很大影響,通用文件系統(tǒng)對此欠考慮[1]。
嵌入式文件系統(tǒng)比較簡單,主要提供文件存儲、檢索和更新等功能,一般不提供保護和加密等安全機制。它以系統(tǒng)調(diào)用和命令方式提供文件的各種操作,主要包括設(shè)置、修改對文件和目錄的存取權(quán)限,提供建立、修改、改變和刪除目錄等服務(wù),提供創(chuàng)建、打開、讀寫、關(guān)閉和撤銷文件等服務(wù)[2]。嵌入式文件系統(tǒng)能夠以較短的時間實時響應(yīng),對文件的操作允許多個任務(wù)同時打開文件并進行讀操作,具有可裁剪、可配置、支持多種存儲設(shè)備和開放的體系架構(gòu)等性能。其中μC/FS嵌入式文件系統(tǒng)以其源碼開放、價格低廉、兼容性等特點日漸受到重視。
1 μC/FS文件系統(tǒng)
μC/FS是Micrium公司開發(fā)的一個嵌入式文件系統(tǒng),可以應(yīng)用于多種存儲介質(zhì),并為它們提供了基本硬件接口函數(shù)。μC/FS嵌入式文件系統(tǒng)是一個高性能的函數(shù)庫,能夠在速度、多功能性和內(nèi)存占用上進行優(yōu)化。它的優(yōu)點是:采用模塊化結(jié)構(gòu),可讀性強;支持標準的應(yīng)用程序接口,可移植性高;符合FAT標準,支持FAT格式文件,可應(yīng)用的嵌入式操作系統(tǒng)范圍廣。μC/FS的源代碼用標準C語言編寫,幾乎可以應(yīng)用于所有處理器[3]。其主要功能如下。
⑴ 支持與MS-DOS/MS Windows兼容的FAT12、FAT16和FAT32文件系統(tǒng)。
⑵ 支持中文長文件名的FAT存儲介質(zhì)。
⑶ 支持多個設(shè)備驅(qū)動程序,允許同一時間通過文件系統(tǒng)訪問不同類型的硬件。
⑷ 支持多種存儲介質(zhì),允許同一時間通過驅(qū)動程序訪問不同存儲介質(zhì)。
⑸ 支持操作系統(tǒng),μC/FS可以移植到任意操作系統(tǒng),并在多線程條件下使用。
⑹ 支持標準C語言中的stdio.h中類似標準應(yīng)用程序接口(API),標準C語言I/O庫中的應(yīng)用程序可以移植到μC/FS中使用。
⑺ 支持簡單的設(shè)備驅(qū)動程序結(jié)構(gòu),μC/FS驅(qū)動程序只需要基本的讀寫塊函數(shù)。
⑻ 支持SmartMediaka和NAND閃存器件的驅(qū)動程序,可用于訪問硬件(讀卡器);支持通用電子集成驅(qū)動器(IDE)驅(qū)動程序,用于真正IDE或內(nèi)存映射模式的CF卡;支持通用閃存芯片(EEPOM)驅(qū)動程序,用于處理不同閃存扇區(qū)大小。
⑼ 支持集成多媒體和SD卡串行外設(shè)接口(SPI)模式。
⑽ 支持專用文件系統(tǒng)(EFS),支持中文長文件名。
μC/FS依據(jù)各層不同的功能劃分組織層次,使得μC/FS結(jié)構(gòu)清晰[4]。API層是μC/FS和用戶應(yīng)用程序的接口,包括一個與文件函數(shù)例如FS_fopen、FS_fwrite等有關(guān)的ANSIC庫。應(yīng)用程序通過調(diào)用API層所提供的函數(shù)可方便地訪問文件系統(tǒng)層。文件系統(tǒng)層把文件的操作請求傳遞給邏輯塊處理,系統(tǒng)通過這種文件傳遞調(diào)用邏輯塊為設(shè)備制定相應(yīng)的設(shè)備驅(qū)動。邏輯塊操作的主要功能是使對設(shè)備驅(qū)動的訪問同步,并為文件系統(tǒng)層提供一個便捷的接口。邏輯塊層調(diào)用一個設(shè)備驅(qū)動來進行塊操作。設(shè)備驅(qū)動層是訪問硬件設(shè)備的底層程序,它包括基本的I/O函數(shù),以便訪問硬件設(shè)備和保存指向函數(shù)指針的向量表[5]。
2 μC/FS文件系統(tǒng)的移植步驟
μC/FS的默認配置是一個內(nèi)存磁盤。進行μC/FS文件系統(tǒng)移植首先要熟悉工程開發(fā)所需要的工具(如編譯器,工程管理,連接器等),并能夠添加文件、目錄到include搜索路徑;還要熟悉目標工程使用的操作系統(tǒng)。將μC/FS移植到一個工程的進程中需經(jīng)以下步驟。
⑴ 創(chuàng)建一個不包括μC/FS的工程。
⑵ 將μC/FS目錄下的文件添加到工程中,然后驗證添加后的運行情況。這時應(yīng)從工程文件下的程序代碼啟動(但不包括main.c和start.c應(yīng)用程序)。應(yīng)用程序執(zhí)行過程如下:
(a) mian.c調(diào)用函數(shù)MainTask(),該函數(shù)的主要任務(wù)是完成初始化和添加μC/FS;
(b) 檢查卷標是否需要低級格式化或高級格式化,并輸出卷標名稱;
(c) 調(diào)用函數(shù)FS_GetFreeVolumeSpace()并輸出一個返回值—可用內(nèi)存磁盤的總空間;
(d) 創(chuàng)建并打開一個寫訪問設(shè)備的測試文件,向文件寫入4個字節(jié),并關(guān)閉文件句柄或程序輸出一個錯誤信息;
(e) 再次調(diào)用函數(shù)FS_GetFreeVolumeSpace()并得到一個函數(shù)返回值—可用的RAM磁盤空間;
(f) 程序輸出一個退出消息并進入循環(huán)等待。
⑶ 添加設(shè)備驅(qū)動程序。在μC/ FS文件系統(tǒng)配置設(shè)備驅(qū)動程序需要完成兩件事情:第一件是添加設(shè)備驅(qū)動程序到工程文件。大多數(shù)驅(qū)動程序運行需要硬件的設(shè)備驅(qū)動程序和特定的硬件,驅(qū)動訪問硬件的底層I/O函數(shù)和全局表。全局表中存放了I/O函數(shù)的指針。需要硬件驅(qū)動程序的有 NAND閃存、多媒體卡(MMC)、SD卡;不需要硬件驅(qū)動程序的有NOR閃存、RAM。幾乎所有的驅(qū)動程序使用之前都需要配置;配置函數(shù)主要任務(wù)是指定各自驅(qū)動配置文件的內(nèi)存地址和內(nèi)存空間。第二件是添加硬件驅(qū)動到工程文件。
⑷ 激活驅(qū)動程序。添加驅(qū)動程序和硬件驅(qū)動函數(shù)到工程文件后,復(fù)制config
⑸ 調(diào)整內(nèi)存空間。文件系統(tǒng)在很多地方由于管理的目的需要使用內(nèi)存,內(nèi)存空間取決于配置文件尤其是驅(qū)動的使用情況,通常硬盤、CF卡或SD卡驅(qū)動要比簡單的驅(qū)動管理需要更多內(nèi)存空間。每個驅(qū)動程序都需要分配內(nèi)存空間。文件系統(tǒng)在初始化階段分配到內(nèi)存,在運行過程中會一直占用分配到的空間。宏ALLOC_SIZE就是在文件系統(tǒng)中用來根據(jù)各自驅(qū)動配置函數(shù)指定內(nèi)存空間的。
3 μC/FS文件系統(tǒng)在SD卡上的移植應(yīng)用
SD卡(Secure Digital Memory Card)即安全數(shù)碼卡,是一種基于半導(dǎo)體快閃記憶器的新一代記憶設(shè)備,被廣泛使用在便攜式裝置上,如數(shù)碼相機、個人數(shù)碼助理(PDA)和多媒體播放器等。SD卡擁有高記憶容量、快速數(shù)據(jù)傳輸率、極大的靈活性和很好的安全性[6]。SD卡的通信基于一個9引腳接口(時鐘、命令、4根數(shù)據(jù)線、3根電源和地線),可以在最高25MHz頻率和低電壓范圍工作,不需要額外的電源來保持其上的記憶信息。SD卡主機接口支持MMC標準[7]。
SD卡的協(xié)議結(jié)構(gòu)如圖1所示。
[
SD卡
安全
規(guī)范
][音頻規(guī)范][其他應(yīng)用規(guī)范] [文件系統(tǒng)規(guī)范][SD卡物理層規(guī)范]
圖1SD卡協(xié)議結(jié)構(gòu)圖
其中,音頻規(guī)范和其他應(yīng)用規(guī)范闡述音頻應(yīng)用的規(guī)范和實現(xiàn)要求;SD卡文件系統(tǒng)規(guī)范闡述保存在SD卡中的文件結(jié)構(gòu)格式要求;SD卡安全規(guī)范闡述版權(quán)保護機制以及所支持的應(yīng)用專用命令;SD卡物理層規(guī)范闡述SD卡使用的物理接口和命令協(xié)議[8]。
3.1 μC/FS在SD卡的移植
μC/FS文件系統(tǒng)支持SD卡,但不包含SD卡驅(qū)動,用戶須提供SD卡設(shè)備邏輯層以下的驅(qū)動文件。μC/FS支持以SPI模式訪問SD卡,用戶必須提供基本的I/O功能以實現(xiàn)對卡的訪問。
μC/FS文件系統(tǒng)的移植需要對所支持的設(shè)備類型、操作系統(tǒng)、塊的大小等項加以配置,因此需要定義頭文件FS_Conf.h下的FS_OS值為1,并配置函數(shù)FS_X_OS_Init、FS_X_OS_Unlock、FS_X_OS_Lock。μC/FS移植的關(guān)鍵是添加SD驅(qū)動,添加設(shè)備驅(qū)動調(diào)用FS_AddDevice(),其代碼如下:
FS_AddDevice(&FS_MMC_SPI_Driver);
const FS_device_type
FS_MMC_SPI_Driver
{"SD device",
FS_SD_DevGetStatus,
FS_SD_ReadBlock,
FS_SD_WriteBlock,
FS_SD_DevIoCtl
};
其中FS_device_type是一個設(shè)備類型,定義為結(jié)構(gòu)體:
{Static int _DevGetName (U8 Unit);
Static int _DevGetStatus (U8 Unit);
Static int _DevRead (U8 Unit, U32 Sector, void *pBuffer);
Static int _DevWrite (U8 Unit, U32 Sector, void *pBuffer);
Static int _DevIoCtl (U8 Unit, I32 Cmd, I32 Aux,void
*pBuffer);
} FS_device_type
結(jié)構(gòu)體成員由設(shè)備名、設(shè)備狀態(tài)返回函數(shù)、讀函數(shù)、寫函數(shù)、控制函數(shù)組成。上述代碼的功能是把設(shè)備驅(qū)動函數(shù)添加到設(shè)備驅(qū)動表里,設(shè)備驅(qū)動表向文件系統(tǒng)上層注冊以備調(diào)用設(shè)備驅(qū)動程序。經(jīng)過此步驟后文件系統(tǒng)可以通過其中的FS_SD_ReadBlock和FS_SD_WriteBlock調(diào)用SD卡驅(qū)動程序的讀寫函數(shù)。
3.2 SD卡驅(qū)動程序測試
在測試過程中發(fā)現(xiàn),SD卡芯片支持庫提供的對設(shè)備訪問和控制的函數(shù)只能一次讀寫512字節(jié)的數(shù)據(jù),這極大地降低了存儲數(shù)據(jù)的速度。為了提高寫SD卡的讀寫速度,我們更改了μC/FS中FS_fat_fwrite函數(shù),使得文件系統(tǒng)在寫大于512KB的數(shù)據(jù)時,把數(shù)據(jù)全部寫入緩沖區(qū)后才調(diào)用設(shè)備驅(qū)動程序的寫函數(shù)FS_SD_WriteBlock。
實際應(yīng)用中,信號源發(fā)送頻率為500Hz、峰值為5V連續(xù)正弦波,采集時間為100秒;存儲到SD卡中的采集數(shù)據(jù)經(jīng)過讀卡器顯示的數(shù)據(jù)文件為7937KB;四通道數(shù)據(jù)采集,每通道采樣率為10kHz,A/D為16位。因此數(shù)據(jù)文件大小約為4×10×16×100/8=8MB,與實際采集數(shù)據(jù)量基本一致,系統(tǒng)的存儲功能正常。
SD卡中數(shù)據(jù)文件通過Matlab讀出的波形數(shù)據(jù)如圖2所示。
圖2讀SD卡數(shù)據(jù)波形截圖
由圖中可以看出四通道信號的每個周期由20個采樣點組成,與每通道信號采樣率10kHz相符。實際選用的SD卡的寫速度是1.5MB/S,SD卡在測試中寫速度約為187KB/S。如果使用高速SD卡,系統(tǒng)的讀寫速度將會得到顯著提高。
4 結(jié)束語
μC/FS文件系統(tǒng)在SD卡的移植,適合在對讀寫速度要求不是很高但對存儲容量和便攜性要求較高的場合使用。μC/FS文件系統(tǒng)移植操作簡單,可應(yīng)用于大多數(shù)常見存儲介質(zhì),如磁盤、閃存等。如果將μC/FS文件系統(tǒng)的移植推廣到其他存儲介質(zhì),僅需要更改文件系統(tǒng)初始化函數(shù)FS_Init()、文件系統(tǒng)配置函數(shù)FS_AddDevice()、文件系統(tǒng)訪問函數(shù)FS_Read()和FS_Write()即可。
參考文獻:
[1] William Stallings,王涌等譯.操作系統(tǒng)-內(nèi)核與設(shè)計原理(第四版)[M].電子工業(yè)出版社,2004.
[2] 成巍.嵌入式文件系統(tǒng)的的設(shè)計與實現(xiàn)[D].碩士論文,2006.1:2~6
[3] Micrium Corporation.μC/FS Embedded File System (SoftwareVersion 3.10),2004:33~42
[4] 唐長清,鄭強,占惠星.μC/FS文件系統(tǒng)在Nand Flash上的實現(xiàn)[J].計算機與現(xiàn)代化,2010.3:4~6
[5] 郝偉,李敬兆.基于μC/FS的大容量存儲FAT32格式的實現(xiàn)與應(yīng)用
[J].開發(fā)研究與設(shè)計技術(shù),2006:113
[6] 段琪瑋,周洪利.基于MMC卡的嵌入式文件系統(tǒng)的設(shè)計與實現(xiàn)[J].實踐與經(jīng)驗,2006.7:94~96
[7] 李宏佳,徐曉曉,魏權(quán)利.基于ARM和SD卡的嵌入式文件系統(tǒng)研究與設(shè)計[J].電子設(shè)計應(yīng)用,2007.7:101~103
[8] 李家良,慕德俊.基于SD卡的μC/FS文件系統(tǒng)移植研究[J].微處理機,2010.12:79~81