摘要:目前的嵌入式系統多使用FLASH作為主存,因此,如何有效管理FLASH上的數據非常重要。文章以MX29LV160BT芯片為例,討論了在VxWorks操作系統下Nor Flash上建立TFFS文件系統的一般步驟,從而為FLASH上的數據管理提供了理想的選擇方式,同時也為開發者和用戶升級程序提供了方便。
嵌入式系統正隨著Internet的發展而在各個領域得到廣泛的應用,作為一個優秀的操作系統,VxWorks實現了比其他實時操作系統更好的有效性、商用性、可裁減性以及互操作性,廣泛應用在通信、軍事、航空、航天等高精尖技術及實時性要求極高的領域中,如衛星通訊、軍事演習、彈道制導、飛機導航等。
如今越來越多的嵌入式操作系統中,通常都使用FLASH作為主存介質。許多開發者和用戶為了方便以后升級用戶程序,通常在FLASH上建立TFFS文件系統,建立文件系統后,我們就可以象在windows操作系統下對硬盤操作一樣,進行數據的拷貝、刪除以及文件的建立等操作。
NOR和NAND是現在市場上兩種主要的非易失閃存技術。Intel于1988年首先開發出NOR flash技術,徹底改變了原先有EPROM和EEPROM一統天下的局面。NOR的特點是芯片內執行XIP execute In Place,這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的成本效益,因此在嵌入式系統得到廣泛的應用。
一、 TFFS文件系統結構簡介
Tornado的TrueFFS是和VxWorks兼容的一種M-Systems Flite實現方式,版本為2.0。它為種類繁多的flash存儲設備提供了統一的塊設備接口,并且具有可重入、線程安全的特點,支持大多數流行的CPU構架。有了Tornado的TrueFFS,應用程序對flash存儲設備的讀寫就好象它們對擁有MS-DOS文件系統的磁碟設備的操作一樣。
如圖1所示,TrueFFS由核心層(core layer)和三個功能層,翻譯層(translation layer),MTD層(MTD layer),socket層(socket layer)組成。
核心層(Core layer):核心層主要起相互連接其他幾層的功能。同時它也可以進行碎片回收、定時器和其他系統資源的維護。通常WindRiver公司將這部分內容以二進制文件提供。
翻譯層主要實現TrueFFS和dosFs之間的高級交互功能。它也包含了控制flash映射到塊、wear-leveling、碎片回收和數據完整性所需的智能化處理功能。目前有三種不同的翻譯層模塊可供選擇。選擇哪一種層要看你所用的flash介質是采用NOR-based, 還是NAND-based, 或者SSFDC-based技術而定。
Socket層則是提供TrueFFS和板卡硬件(如flash卡)的接口服務。其名字來源于用戶可以插入flash卡的物理插槽。用來向系統注冊socket設備,檢測設備拔插,硬件寫保護等。后面將詳細講解它的功能。
MTD層(Memory Technology Drivers)功能主要是實現對具體的flash進行讀、寫、擦、ID識別等驅動,并設置與flash密切相關的一些參數。TrueFFS已經包含了支持Intel,AMD以及samsung部分flash芯片的MTD層驅動。新的芯片需要新的MTD支持,你可以使用一個標準的接口來加入這些驅動。
以上四部分,我們通常要的工作就是后兩層。
當在VxWorks下配置TrueFFS時,你必須為每一層至少包含一個軟件模塊。后面我們將詳細討論。
二、 MX29LV160BT芯片上建立TrueFFS文件系統
1、配置相關文件
在此,我以Nor Flash MX29LV160BT為例,開發工具為Tornado2.2 for PPC。要在VxWorks映像中包含TrueFFS文件系統,首先必須在config.h文件中定義INCLUDE_TFFS。這使得VxWorks的初始化代碼調用tffsDrv()來創建管理TrueFFS所需的結構和全局變量,并為所有掛接了的flash設備注冊socket組件驅動。在鏈接的時候,通過解析與tffsDrv()相關聯的符號(symbols)可以將TrueFFS所必需的軟件模塊鏈接到VxWorks映象中。
為了支持TrueFFS,每一個BSP目錄下都必須包含一個sysTffs.c文件。它將TrueFFS所有的層(翻譯層,socket層和MTD層)鏈接到一起并和VxWorks綁定。因此,我必須編輯這個文件并決定哪一種MTD和翻譯層模塊應該包含到TrueFFS中。即:
#define INCLUDE_MTD_MX29LV /* MX29LV160BT MTD driver */
#define INCLUDE_TL_FTL /* FTL translation layer */
#define FLASH_BASE_ADRS 0x2a10000 /* Flash memory base address */
#undef FLASH_SIZE
#define FLASH_SIZE 0x001f0000 /*Flash memory size,2M(parameter block) */
其他無關的MTD driver包含頭都#undef掉,同時定義Flash在系統中的基地址和大小。另外,還必須編輯sysLib.c中的sysPhysMemDesc[ ]數組,將Flash基地址和大小加入到MMU中,以供將來訪問Flash,否則訪問Flash會失敗。如果BSP目錄下沒有sysTffs.c文件,那么我們可以從其他BSP目錄下拷貝一個即可,然后做上述修改,其他的內容基本可以不用修改。
接下來需要修改tffsConfig.c文件,為了方便管理,通常我們將src/drv/tffs/目錄下該文件拷貝到我們BSP目錄下,然后再做出修改。在MTDidentifyRoutine mtdTable[]表中加入如下語句:
#ifdef INCLUDE_MTD_MX29LV
mx29lvMTDIdentify,
#endif /* INCLUDE_MTD_MX29LV */
并在該文件開頭聲明。
#ifdef INCLUDE_MTD_MX29LV
FLStatus mx29lvMTDIdentify (FLFlash vol);
#endif /* INCLUDE_MTD_MX29LV */
最后就是將我們的flash相關MTD驅動加入到makefile中。即:
MACH_EXTRA = mx29lvMtd.o
為了方便我們調試MTD驅動,應該在重新編譯VxWorks映象前將諸如格式化flash、創建TrueFFS塊設備、綁定此塊設備到dosFs所必要的功能包含到VxWorks映像中。比如如下定義:
#define INCLUDE_TFFS
#ifdef INCLUDE_TFFS
#define INCLUDE_TFFS_DOSFS
#define INCLUDE_TFFS_SHOW
#define INCLUDE_DOSFS /* dosFs file system */
#define INCLUDE_SHOW_ROUTINES /* show routines for system facilities*/
#define INCLUDE_TL_FTL
#define INCLUDE_IO_SYSTEM
#define INCLUDE_DISK_UTIL
#endif /* INCLUDE_DOSFS */
2、MTD驅動簡介
做了上述配置后,進入VxWorks操作系統后,我們在shell上利用tffsShow工具來顯示flash的信息。TffsShow函數最終會調用MTD驅動中的mx29lvMtdIdentiy( )函數,在mx29lvMtdIdentiy ( )函數主要是通過讀取MX29LV160BT芯片的設備和廠商ID來識別它,然后對FLFlash結構成員進行初始化,最主要的幾個參數是:
type
Flash內存的JEDEC ID號。
erasableBlockSize
Flash內存的擦除塊大小(字節)。設置這個值時應考慮到interleaving。因此,通常通過如下方法來設置它的大小。
Vol.erasableBlockSize = MX29LV_MTD_SECTOR_SIZE * vol.interleaving;
對于MX29LV160BT,MX29LV_MTD_SECTOR_SIZE為64K字節。
chipSize
使用來構建TrueFFS文件系統的flash實際大小(字節)。
noOfChips
使用來構建TrueFFS文件系統的flash實際片數。
interleaving
Flash內存交叉因子(interleaving factor)。即擴展數據總線的設備數。比如,一個32位數據總線上,我們可以使用4片8位或2片16位的設備。
map
指向flash內存映射(map)函數。該函數將flash映射到內存區。
read
指向flash內存的讀函數。在MTD驅動識別函數中,這個成員函數已經被初始化為缺省的讀函數。通常情況下,我們不需要再初始化它,否則還需要修改很多相關的函數。
write
指向flash內存的寫函數。這個成員必須初始化,這是我們要做的一個重要工作。
erase
指向flash內存的擦除函數。這個成員必須初始化,這也是我們要做的一個重要工作。
針對FLFlash結構成員,我們所關心的兩個函數就是寫和擦除函數。在mx29lvMtdIdentiy()函數中必須有如下定義:
vol.write = mx29lvWrite;
vol.erase = mx29lvErase;
在mx29lvWrite()函數中主要是實現將數據寫到flash中。首先需要對扇區進行解鎖,然后寫入寫命令,之后才能進行數據的寫入。最后需要判斷數據是否寫完。為了確保操作成功,我們應該在寫完每個數據后進行數據的比較,比較正確后方能進行下一個數據的操作。
在mx29lvErase ()函數中主要是實現flash扇區的擦除。如今的flash一般都是按照扇區進行擦除操作的。在擦除操作之前也應該首先對扇區進行解鎖,然后寫擦除建立和扇區擦除命令。擦除成功后,flash中的內容應該是0xffff。所以為了確保成功,我們還是應該在擦除后進行比較,比較正確后方能進入下一個扇區的擦除操作,否則返回擦除錯誤標志。
所以,對于MTD驅動的調試,基本上就是調試寫和擦除兩個函數。在調試過程中,我們可以在這兩個函數相應位置加入打印語句來調試。為了能調試這兩個函數,我們通過在shell上輸入命令tffsDevFormat來格式化flash,tffsDevFormat最終會調用mx29lvErase和mx29lvWrite函數,如果成功就會返回0,否則返回-1。當然也可以調用tffsDevCreate函數來驗證我們的寫和擦除函數的正確性。圖2說明了tffsDevCreate調用過程。
在shell上利用tffsShow來驗證mx29lvMtdIdentiy。
è tffsShow
0: socket=RFA: type=0x2249, unitSize=0x10000, mediaSize=0x1f0000
value = 49 = 0x31 = "1"
說明已正確識別到MX29LV160BT設備,設備號為0x2249。
三、 建立TFFS設備
1、掛接設備名
MTD驅動調試成功后,我們就可以給flash設備掛接上dos設備名,如下操作:
格式化:
è tffsDevFormat
value = 1
è usrTffsConfig 0,0,”/tffs0”
value = 0
然后通過devs來查看掛接的設備名。
è devs
drv name
0 /null
1 /tyCo/0
1 /tyCo/1
5 host:
6 /pty/rlogin.S
7 /pty/rlogin.M
3 /tffs0/
8 /vio
value = 25 = 0x19
看到/tffs0/說明掛接設備已經成功,接下來就可以利用dosFs文件系統相關命令來操作flash了。如,ls、copy等。
2、從Flash中啟動并下載VxWorks映像
要從flash中下載VxWorks映像,首先需要把VxWorks映像拷貝到flash中,在shell中的操作命令為copy “VxWorks”,”/tffs0/VxWorks”,然后修改config.h文件中引導行,如下:
#define DEFAULT_BOOT_LINE \
"tffs=0,0(0,0)host:/tffs0/VxWorks h=192.168.0.153 e=192.168.0.154 u=target pw=target o=cpm"
修改完后,重新編譯生成bootrom_uncmp.bin,并把它燒寫到flash中(注意:該flash與上面建立TFFS文件系統的flash不一樣,它并沒有建立文件系統)。然后重新啟動,即可看到如下啟動畫面:
boot device : tffs=0,0
unit number : 0
processor number : 0
host name : host
file name : /tffs0/VxWorks
inet on ethernet (e) : 192.168.0.154
host inet (h) : 192.168.0.153
user (u) : target
ftp password (pw) : target
flags (f) : 0x0
other (o) : cpm
Attaching to TFFS... done.
Loading /tffs0/VxWorks...894304
Starting at 0x10000...
Development System
VxWorks version 5.5.1
KERNEL: WIND version 2.6
Copyright Wind River Systems, Inc., 1984-2003
CPU: Motorola ADS - PowerPC 860. Processor #0.
Memory Size: 0x1000000. BSP version 1.2/5.
WDB Comm Type: WDB_COMM_END
WDB: Ready.
到此,說明引導成功。flash整個TFFS文件系統就已經建立成功。
四、 結論
VxWorks操作系統中支持TFFS文件系統,我們將VxWorks映像作為文件放到flash上,這就有利于開發者和用戶更新應用程序而不需要影響bootrom,直接更新VxWorks映像或者將應用程序直接copy到flash中,然后裝載到RAM中運行。
- 嵌入式操(6223)
相關推薦
VxWorks文件系統、Flash的TFFS設計與實現


VxWorks中的TFFS文件系統怎么實現?
VxWorks操作系統具有哪些優點
VxWorks操作系統基于ARM處理器的中斷怎么處理?
Vxworks實時操作系統分析
嵌入式VxWorks招聘
嵌入式操作系統VxWorks設備驅動程序該怎么設計?
嵌入式操作系統Windows CE研究
嵌入式操作系統上的FreeRTOS操作系統分析
嵌入式操作系統怎么實現網絡加載?
嵌入式操作系統怎么選擇?
嵌入式操作系統有哪些
嵌入式操作系統相關資料分享
嵌入式文件系統構建
嵌入式文件系統概述
嵌入式系統開發中操作系統的選型依據是什么
嵌入式系統軟件及操作系統的資料大合集,絕對實用
嵌入式Linux操作系統的使用
嵌入式Linux操作系統結構——7個重要模塊
嵌入式Linux之Android操作系統
嵌入式Linux根文件系統怎么制作?
嵌入式XPE操作系統構建時要注意什么?
嵌入式學習——ElfBoard ELF1板卡 之文件系統的介紹
嵌入式實時操作系統如何簡化應用軟件的設計
文件系統Yocto是什么
ARM嵌入式操作系統匯總
Linux操作系統和文件系統的相關資料分享
Linux作為嵌入式操作系統的優勢是什么?如何建立嵌入式Linux?
STM32嵌入式操作系統介紹
STM32嵌入式操作系統介紹
主流的14種嵌入式操作系統的特點
主流的嵌入式操作系統有哪些?
五大適合STM32的嵌入式操作系統
什么是嵌入式操作系統內存管理技術?
什么是嵌入式操作系統?
介紹十四種嵌入式操作系統的特點
關于嵌入式操作系統和PC機的操作系統
幾種嵌入式實時操作系統分析與比較
在VxWorks操作系統的Nor Flash上怎么建立TFFS文件系統?
基于嵌入式視頻存儲的專用文件系統該怎么設計?
基于Linux的嵌入式操作系統
如何構建嵌入式Linux NFS根文件系統?
實時多任務操作系統的相關資料推薦
常見嵌入式操作系統介紹
常見的嵌入操作系統的利弊都有哪些?
概述常用的嵌入式操作系統
用于嵌入式系統的操作系統
適合STM32的三大嵌入式操作系統
通用嵌入式操作系統有什么區別?
采用ARM和SD卡實現嵌入式文件系統
在嵌入式Linux上實現JFFS文件系統

嵌入式Linux文件系統的研究與應用

通過TFFS加載和升級VxWorks 映像

嵌入式實時操作系統COS一Ⅱ與VxWORKs

嵌入式XPE操作系統的構建及應用


嵌入式操作系統uCLinux詳解

嵌入式文件系統及特點

基于嵌入式視頻存儲的專用文件系統設計

Linux嵌入式文件系統如何構建

什么是嵌入式操作系統 常見的嵌入式系統有哪些

嵌入式Linux系統移植開發-(1)基于Yocto構建嵌入式u-boot,內核,文件系統

嵌入式Linux系統移植-(Linux文件系統)

使用BusyBox構建根文件系統


評論