VxWorks是一種的高性能實時操作系統,其強實時性、高可靠性、良好的可剪裁特性、友好的集成開發環境Tornado,使VxWorks成為實時操作系統中有特色的操作系統之一。加之VxWorks對ARM系列芯片有著良好的支持,使其在軍事、航天、通信、工業控制等諸多方面應用十分廣泛。但是目前大多數的嵌入式軟件開發人員都僅僅是開發了一些驅動程序,這樣也可以讓系統運行起來,然而僅僅做到這些是不夠的,構建文件系統,采用文件系統的方式對各個程序加以細化的管理和操作,將更加有利于提高整個系統的效率和可靠性。
TrueFFS是一種硬盤仿真技術,TrueFFS應用程序能從閃存中讀寫,其過程如同從磁性介質的機械硬盤驅動器上的MS-DOS文件系統中讀寫一樣。TrueFFS用磨損測評技術和無用單元收集算法,像硬盤一樣合理的分配和使用每一個區塊,減少了區塊遷移和區塊過度使用,讓閃盤更可靠、使用壽命更長。可以在許多嵌入式系的DOC中得以廣泛應用。
VxWorks操作系統在文件系統與設備驅動程序之間使用一種標準的I/O操作接口, 這樣使得在單個VxWorks操作系統中可以運行多個相同或者不同類型的文件系統。依據這些標準接口協議,用戶可以為VxWorks操作系統編寫自己的文件系統,并且可融入自己編寫的設備驅動程序,以實現兩者的自由組合。有較高的靈活性和可擴展性。
1 軟件結構
Window下的文件系統如FAT、NTFS往往不適合用在嵌入式應用系統中,因為:嵌入式應用系統工作條件往往比較惡劣。第二:實際的嵌入式應用系統往往資源很有限、不便于支持大型的文件系統。第三:閃存的過編程易造成閃存的損壞。
VxWorks中可支持的文件系統有:dosFs文件系統、TrueFFS文件系統(TrueFFS支持閃存設備)、rawFs文件系統、tapeFs文件系統、cdromFs文件系統、TSFS目標服務器文件系統。其中dosFs文件系統適合于塊存儲設備的實時操作,與MS-DOS文件系統兼容。TrueFFS提供面向多種閃存設備的塊設備接口,可以重進入、線程安全、并支持所有裝載VxWorks的CPU結構。由于閃存非常適合移動設備、手持設備和大多數的嵌入式系統,而這些要求對于機械硬盤而言則難以滿足。TureFFS與dosFs文件系統是兼容的所以很有實用價值。
TureFFS與dosFs的區別在于TrueFFS不支持分區表,也不支持ioctl。值得注意的是,Tornado的這個版本支持SSFDC規范的NAND器件,但不支持NOR器件。VxWorks中的軟件體系結構如圖1所示。
至底向上依次是硬件設備、塊存取設備、文件系統、設備驅動、應用程序。硬件設備是閃存、DRAM、串口、網口等;塊存取設備驅動程序主要是面向設備的啟動層;文件系統主要有dosFs和TrueFFS,這部分是非常重要的,一個良好而高效的嵌入式系統必須要有這樣一個或者多個文件系統。接著是I/O系統接口,VxWorks操作系統中的I/O系統可以提供簡單、統一、與任何設備無關的接口,包括基本I/O和緩沖I/O系統,適應高實型的要求。頂部是用戶的編寫應用程序與下層的代碼也不直接與硬件聯系。
2 TureFFS層次架構
圖2 TrueFFS具有分層結構
1.核心層:該層將其他各層連接起來,并處理全局事務,如后臺處理、碎片搜集、計時器和其他系統資源,核心層只有二進制形式。
2.轉換層:該層包含了存儲媒質的文件系統視圖與閃存擦除之間的映射。轉換層只有二進制形式。
3.MTD層:MTD執行閃存媒質的低級編程(映射、讀、寫、擦除),MTD具有源代碼和二進制形式。
4.Socket層:Socket層提供TrueFFS與板級硬件之間的接口,提供指定板硬件的存取程序。Socket驅動程序只具有源代碼形式。
3 構建支持TrueFFS系統的步驟
① 選擇MTD組件,MTD是軟件模塊既可以用WINDRIVER公司的產品也可以用戶自己編寫。MTD支持的閃存設備有 CFI接口的也有SCS接口,根據自己的Flash芯片,決定采用什么樣的BSP組件。
②確定Socket驅動程序、sysTffs.c文件中執行、在相應的BSP中也要有所定義。
③配置系統。添加dosFs和其他組件。并且必須要有一個核心組件INCLUDE_TFFS。
④構建項目。在這里包含多種組件,主要是與選擇的Flash種類有關,各種公司生產的閃存設備都對應了不同的組件。如INCLUDE_MTD_AMD就是包含AMD、Fujitsu的閃存設備。
⑤引導目標機以及格式化驅動程序。
⑥安裝驅動程序。使用usrTffsConfig()函數將文件系統安裝在TrueFFS閃存驅動器。
⑦檢測驅動程序。確保文件操作的正確性。啟動系統,注冊Socket驅動程序后,調出shell程序,用tfsDevFormat()格式化Flash。由于系統中有一部分是下載的系統映象文件,所以這部分區域不能被格式化,所以創建啟動鏡像區域是有必要的。
4 閃存驅動程序設計
這部分的程序應該放在MTD層中實現。通用設備驅動程序是放在子程序usrRoot()中、而BSP專用設備驅動程序是放在子程序sysHWInit()中。硬件的行為和特性是通過內部寄存器來控制的,對內部寄存器的訪問,有兩種方式,I/O方式和存儲器映射閃存方式,在ARM系統里把外設I/O與內存統一編址。驅動程序是界于硬件和上層應用軟件之間的低層程序代碼,驅動程序負責低層硬件和上層應用程序間的數據交換,直接面向硬件操作。驅動程序寫得好則使得上層應用程序的工作量相對減少很多。為防止阻塞,在驅動程序中設置狀態檢查至關重要,對硬件操作延時必然會產生,延時可以測出,通過時間判斷延時和死機等異常情況,從而做出相應處理。對Flash可以分扇區擦除也可以整片擦除,對閃存的寫數據其實也是先擦除再寫入,讀出數據也是分塊讀出數據,可以按照周期時序規則對指定的寄存器寫入指令和讀出或者寫入數據。盡量循環擦除以避免造成閃存某一個區域的過編程,這樣可以有效利用各個塊的存儲空間也可以延長壽命。還必須注意數據的長度和數據類型的選擇,使內存地址必須對齊,否則可能造成系統不可預知的問題。下面是部分代碼。
//定義_廠各種指令代碼
#define FLASH_CMD_FIRST 0xaa
#define FLASH_CMD_SECOND 0x55
//定義了總線周期地址
#define FLASH_REG_FIRST_CYCLE *(unsigned short *)(0x2000000+0x555*2)
#define FLASH REG_SECOND_CYCLE *(unsigned short *)
(Ox2000000+Ox2aa*2)
#define FLASH_CMD_PROGRAM1 0x80
#define FLASH_CMD_PROGRAM2 0x10
……
//flash按扇區擦除
STATUS sysFlashEraseSector(unsigned int addr)
//flash整片擦除
STATUS sysFlashChipErase(void)
//flash讀出整塊數據
void FLASH_READ(unsigned int addr,unsigned short int *
pread,int nwords)
//flash寫入整塊數據
STATUS sysFlashWrite (unsigned short int data,short int size,
unsigned int addr)
……
為了盡可能的延長使用壽命,TrueFFS使用了一種稱為磨損測評的技術和無用單元收集算法。磨損測評可以緩解“過編程”的現象,平衡整個介質的磨損情況,使每個單元的擦除次數近似相等。無用存儲單元收集技術對已經擦除塊進行再次聲明,便于循環使用。
5 小結
本文介紹了TrueFFS文件系統的建立過程,分析了各個層次架構,介紹了Flash驅動程序。因為現在的嵌入式系統目標板上,普遍都有Flash作為引導啟動和數據存儲的設備,所以對這部分數據實現文件方式的有效的管理很有必要。采用TrueFFS硬盤仿真技術對Flash進行管理,可以把Flash模擬成硬盤,也正是因為采用了TrueFFS技術對數據在Flash中的讀寫操作進行管理,大大提高了寫的次數,提高了Flash的可靠性,延長了使用壽命。