新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > VxWorks文件系統(tǒng)和Flash的TFFS設(shè)計與實現(xiàn)

VxWorks文件系統(tǒng)和Flash的TFFS設(shè)計與實現(xiàn)

作者: 時間:2012-04-12 來源:網(wǎng)絡(luò) 收藏

3.3 垃圾收集過程

FTL格式化后,可用扇區(qū)將被不斷申請使用,原有扇區(qū)被不斷的廢棄,中可用的free扇區(qū)越來越少,但這并不是由于上層DOS真的使用了這么多扇區(qū),而是FTL為了方便管理、為了不需要每次擦除一塊而付出的管理代價。所以,當(dāng)中的可用扇區(qū)少于用戶要申請寫入的扇區(qū)時,F(xiàn)TL層就必須解決這些垃圾問題,這個過程在FTL中稱為垃圾回收(garbage collect)。

當(dāng)FTL中的可用sector小于用戶要申請的扇區(qū)時,將啟動垃圾收集,但系統(tǒng)中有很多個unit,到底收集哪個unit呢?FTL會考慮磨損均衡,它將采用一個偽隨機的算法來決定收集策略:即用4/256的幾率選擇磨損情況少的塊來收集;252/256的幾率則根據(jù)垃圾最多為第一條件,當(dāng)垃圾一樣時,判斷磨損次數(shù)小的優(yōu)先選擇。

3.4 FFL創(chuàng)建的DOS

的格式化函數(shù)需要調(diào)用tffsDevFormat來格式化,而不需要調(diào)用dosFsVolFormat來格式化;另外,在tffsDevFormat格式化參數(shù)中,需要傳人的參數(shù)含有FAT個數(shù)參數(shù),其原因是DOS是FTL層創(chuàng)建的,而不是在FTL基礎(chǔ)上創(chuàng)建的,下面是的整個格式化過程:

tffsDevFormat→flcall(FL_FORMAT_VOLUME)→formatVolume→Format→formatFTL;

其中,函數(shù)formatFTL是執(zhí)行FTL層格式化的操作函數(shù),操作時,首先根據(jù)格式化參數(shù)和BSP參數(shù)對內(nèi)部數(shù)據(jù)結(jié)構(gòu)初始化;然后再對每個unit進(jìn)行格式化,在擦除后,即可寫入unitheader信息和控制BAM值;之后寫入unit No;最后申請每個page的空間;

上述formatFTL函數(shù)執(zhí)行完以后,F(xiàn)TL就已經(jīng)準(zhǔn)備好,可以接受上層的扇區(qū)讀寫函數(shù)了(當(dāng)然還沒有內(nèi)容可以讀寫)。

本文引用地址:http://www.butianyuan.cn/article/149241.htm

在函數(shù)formatVolume中,mount可進(jìn)行卷操作,當(dāng)內(nèi)存的數(shù)據(jù)結(jié)構(gòu)準(zhǔn)備好后,F(xiàn)TL層即可調(diào)用函數(shù)flDosFormat來創(chuàng)建DOS。其中首先創(chuàng)建隱藏扇區(qū),以用于記錄該卷的部分信息,然后分別創(chuàng)建MBR、FAT和ROOT目錄;這樣,DOS創(chuàng)建完成后,再執(zhí)行dosFsDevCreat函數(shù),當(dāng)然就無須格式化,找到0扇區(qū)自然就找到了MBR,因為DOS是FTL創(chuàng)建的。

從更深層次講,F(xiàn)TL層之所以創(chuàng)建DOS層,是因為只有FTL層才知道有哪些扇區(qū)是可以供DOS使用的,哪些扇區(qū)是DOS不能使用的(作為FTL層管理使用),也正是因為DOS層不了解FTL層的運作情況,所有的扇區(qū)映射關(guān)系都被FTL層隱蔽,因而導(dǎo)致DOS層無法在上層作出有利于擦寫等優(yōu)化動作,如大寫入時的字節(jié)數(shù)更新,F(xiàn)AT表更新等操作,都會嚴(yán)重浪費FTL層的映射關(guān)系運算。

4 基于M25P32 SPI

對于TFFS的,涉及到config.h、sysTffs.c、tffsConifg.c、tffsMtd.c、Makefile幾個的配置和修改,其中編譯是通過建立一個downloadalbe的tomado工程,來把這幾個.c源編譯進(jìn)去生成.pl文件提供給bsp工程,而后由bsp工程把.pl文件編譯進(jìn)去,從而生成bootable image。

4.1 Config.h的相關(guān)配置

要在vxworks映像中加入TFFS文件系統(tǒng),需要加入相關(guān)的組件,雖然也可以在該文件中直接加入相應(yīng)的配置宏,但很容易造成遺漏和有些需要依賴的宏沒有定義或者沖突,本文采用的方法是建一個bootable的tornado工程,而后在這個工程中通過加入TFFS和DOSFS的相關(guān)組件來編譯這個工程,從而生成一個prjParams.h文件,該文件里就包含了剛剛加入的組件對應(yīng)的宏,因而,組件與組件之間依賴也是安全的,不會有任何沖突,最后再在Config.h中包含這個文件即可。

4.2 sysTffs.c文件的修改

該文件用于提供socket層的bsp代碼。如果鏡像文件包含TFFS相關(guān)組件,那么,系統(tǒng)啟動時就會按照如下過程自動調(diào)用sysTffsInit()函數(shù):

usrRoot()→tffsDrv()→flInit()→flRegisterComponent ()→sysTffslnit ()

sysTffsInit ()函數(shù)會依次調(diào)用socket注冊函數(shù)simmRegisterOfsl (),注冊函數(shù)數(shù)量視需要構(gòu)建的文件系統(tǒng)數(shù)量而定,本文構(gòu)建了1個文件系統(tǒng)ofsl,并在simmRegisterOfsl()函數(shù)中對文件系統(tǒng)的基地址進(jìn)行了設(shè)置,同時對FLSocket()結(jié)構(gòu)體中的毀掉處理函數(shù)進(jìn)行了掛接,掛接函數(shù)也在該文件中,如卡上電、斷電、寫保護(hù)等。

對sysTffsFormaOfsl()函數(shù)的格式化參數(shù)可根據(jù)自己的需要進(jìn)行修改。

4.3 tffsConfig.c和tffSMtd.c文件的修改

tffsConfig.c文件的修改就是在mtdTalbe []表中注冊識別函數(shù)iUnifiedIdentifyOfsl();而tffsConfig.c文件則用于實現(xiàn)iUnifiedldentifyOfsl()函數(shù),iUnifiedIdentifyOfsl()函數(shù)對FLFlash結(jié)構(gòu)體中的回調(diào)函數(shù)進(jìn)行了掛接,如flash的讀、寫、擦除等,掛接函數(shù)的具體實現(xiàn)可在Dry_MvSFlash.cpp文件中以一個類的方式提供針對M25P32 spi Flash操作的所有驅(qū)動接口。

4.4 TFFS文件系統(tǒng)的安裝

通過上面的過程,socket層和mtd層就都準(zhǔn)備好了,下面便可以安裝tffs文件系統(tǒng)。安裝時,首先用sysTffsFormatOfsl()函數(shù)按照上面設(shè)定的參數(shù)格式化TFFS文件系統(tǒng),而后通過usrTffsConfig(0,0,”ofsl”)函數(shù)接口在已建好的TFFS上掛接DOS文件系統(tǒng),成功后,即可通過open、read、write等來操作Flash上的文件系統(tǒng),也可以通過FTP方式用IE訪問該文件系統(tǒng)中的內(nèi)容。

4.5 Makefile文件的修改

對于Makefile的修改非常簡單,因為幾個和TFFS相關(guān)的源文件都是以.pl的方式被鏈人bsp工程的,所以只需要在makefile文件中把這個文件加入即可,即在makefile中加了如下的宏定義:

MACH_EXTRA+=../ArmPri/ARMARCH5gnu/ArmBspPrj.pl

5 結(jié)束語

本文對下TFFS文件系統(tǒng)的層次結(jié)構(gòu)和FTL層的啟動過程、塊映射算法、垃圾回收算法以及用FTL創(chuàng)建DOSFS進(jìn)行了分析,給出了在M25P32 SPI Flash上創(chuàng)建TFFS文件系統(tǒng)和將TFFS掛在DOSFS的實現(xiàn)方法。通過對TFFS核心層FIL的分析給出的TFFS實現(xiàn)方法,可以從更基礎(chǔ)的層面來認(rèn)識中的TFFS文件系統(tǒng),從而給TFFS文件系統(tǒng)的問題定位和實現(xiàn)帶來新的方法。


上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉