




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第第頁NANDFlash上均勻損耗與掉電恢復在線測試NANDFlash以其大容量、低價格等優勢迅速成為嵌入式系統存儲的新寵,因此其上的文件系統研究也日益廣泛。本文簡要介紹了常用的NANDFlash文件系統YAFFS,并針對YAFFS在均勻損耗和掉電恢復方面進行在線測試。在給出測試結果的同時,著重研究嵌入式軟件測試方案和方法;對測試結果進行分析,并提出改進方案和適用環境。
關鍵詞NANDFlash均勻損耗軟件測試YAFFS
引言
隨著嵌入式技術在各種電子產品中的廣泛應用,嵌入式系統中的數據存儲和管理已經成為一個重要的研究課題。Flash存儲器具有速度快、容量大、成本低等很多優點,因此在嵌入式系統中被廣泛用作外存儲器件。嵌入式系統中的Flash存儲器需要有自己的文件系統,而不能直接移植通用文件系統,主要有兩個原因:第一,嵌入式系統的應用條件惡劣,電源電壓不穩定,突發性斷電以及非法插拔都容易造成災難性的影響,通用文件系統對于可靠性的設計考慮不足;第二,通用文件系統的記錄信息(如FAT表)需要被多次修改,而記錄信息放在Flash存儲器固定的區塊中,將導致該區塊的頻繁操作,從而縮短Flash器的使用壽命。這樣就對軟件技術提出了更高的要求。
為了管理復雜的存儲硬件,同時提供可靠高效的存儲環境,出現了基于NAND和NOR的文件系統。目前主流的FFS(FlashFileSystem)有如下3種:TrueFFS、JFFSx以及YAFFS。YAFFS(YetAnotherFlashFileSystem)是專門為NANDFlash設計的嵌入式文件系統,適用于大容量的存儲設備。它是日志結構的文件系統,提供了損耗平衡和掉電保護等機制,可以有效地減小上述原因對文件系統一致性和完整性的影響。本文正是基于這樣的前提,介紹了關于嵌入式YAFFS文件系統測試方案,針對文件系統中損耗平衡和掉電保護兩個重要的系統性能指標進行實時在線的測試與分析,不同的應用環境使用該文件系統應進行相應的修改。
1YAFFS文件系統概述
YAFFS文件系統類似于JFFS/JFFS2文件系統。不同的是,JFFS1/2文件系統最初是針對NORFlash的應用場合設計的,而NORFlash和NANDFlash本質上有較大的區別。盡管JFFS1/2文件系統也能應用于NANDFlash,但由于它在內存占用和啟動時間方面針對NOR的特性做了一些取舍,所以對NAND來說通常并不是最優的方案。
1.1NOR和NAND的比較
基本上NOR比較適合存儲程序代碼,其容量一般較小(比如小于32MB),且價格較高;而NAND容量可達1GB以上,價格也相對便宜,適合存儲數據。一般來說,128MB以下容量NANDFlash芯片的一頁大小為512字節,用來存放數據,每一頁還有16字節的備用空間(SpareData),充當OOB(OutOfBand)區域,用來存儲ECC(ErrorCorrectionCode)校驗/壞塊標志等信息;再由若干頁組成一個塊,通常一塊為32頁(16KB)。與NOR相比,NAND不是完全可靠的。每塊芯片出廠時允許有一定比例的壞塊存在,對數據的存取不是使用線性地址映射,而是通過寄存器的操作串行存取數據。
1.2YAFFS數據在NAND上的存儲方式
YAFFS根據NAND閃存以頁為單位存取的特點,將文件組織成固定大小的數據段。利用NAND閃存提供的每頁16字節的備用空間來存放ECC檢驗信息和文件系統的組織信息,不僅能夠實現錯誤檢測和壞塊處理,而且能夠提高文件系統的加載速度。
YAFFS將文件組織成固定大小(512字節)的數據段。每個文件都有一個頁面專門存放文件頭,文件頭保存了文件的模式、所有者id、組id、長度、文件名等信息。為了提高文件數據塊的查找速度,文件的數據段組織成樹形結構。YAFFS在文件進行改寫時,總是先寫入新的數據塊,然后將舊的數據塊從文件中刪除。YAFFS使用存放在頁面備用空間中的ECC進行錯誤檢測,出現錯誤后會進行一定次數的重試;多次重試失敗后,該頁面就被停止使用。以(512+16)字節為一頁的NANDFlash芯片為例,YAFFS文件系統數據的存儲布局如圖1所示。
圖1YAFFS文件系統數據的存儲布局
2YAFFS文件系統測試方案總體設計
2.1測試總體說明
YAFFS文件系統是開源的,測試基于白盒測試。在所關心的代碼段中,插入測試代碼。為保證測試代碼不對原代碼造成影響,測試后可立即恢復為原代碼,所有測試代碼(包括測試用變量和函數)均嵌入到#defineFS_TEST宏定義中。
2.2模擬文件的生成
嵌入式環境下對文件系統進行大量、長時間的測試存在很多問題,不易實現,對測試代碼的插入和數據的監視也比較困難。這里采用PC模擬測試的形式,用文件的讀/寫模擬NAND器件,并在PC上對模擬文件監視,以達到測試的目的。代碼定義了各種NAND器件的類型,以適應不同的器件。模擬器件時,也用這些信息生成相應的模擬文件。
指明要模擬的NAND器件的大小(FILE_SIZE_IN_MEG)和結構(BLOCKS_PER_MEG,BLOCK_SIZE)后,按照相應的大小和結構生成文件g_filedisk。
3均勻損耗測試
3.1測試目的
NANDFlash器件每個Block區塊的擦寫次數有限。在需要實時記錄的應用環境中,為保證器件壽命,應盡量使每個區塊的擦寫次數相對平均,以最大程度地延長NANDFlash器件的使用壽命。此項測試記錄每個Block區塊的擦寫次數,以測試YAFFS文件系統在均勻損耗方面的性能。
3.2測試方法
測試代碼在器件模擬文件的每一頁的Spare區后,增加了字節,用于記錄該頁的擦寫次數。由于擦寫是以Block為單位進行的,因此每個Block各頁的擦寫記錄數是相同的。在以后的測試中,可以只使用第一頁的該Block空間記錄擦寫次數,其他空間作其他測試用。
測試代碼插入到CheckInit()和yaffs_FEEraseBlockInNAND()(yaffs_fileem.cpp)中,在初始化器件模擬文件時,生成(新模擬文件)或讀取(己有模擬文件)擦寫次數;并在程序執行擦寫函數時,對擦寫次數進行累加和保存。
測試程序用到的測試變量:記錄擦寫次數的數組-g_ersNumArray[FILE_SIZE_IN_MEG*BLOCKS_PER_MEG]、指向擦寫的最大值-g_pErsMax和指向擦寫的最小值?g_pErsMin。
測試程序用WireOut0.log和WireOut1.log兩個文件記錄每個Block區塊的擦寫次數,查看這兩個文件,可以看到每個區塊的擦寫次數以及最大/最小值。兩個文件是等同的,因測試時間比較長,取兩個文件以避免系統在寫記錄文件時出錯,而丟失所有的記錄;兩個文件輪流寫,保證至少有一個文件的內容是系統出錯前最近的記錄。
3.3測試結果
YAFFS文件系統按“順序”使用未分配的空間用于新的寫入操作,并以同樣“順序”擦除廢棄的區塊。寫入和擦除操作,均按順序在未分配的空間或廢棄的空間中進行。當系統未用空間小于某一預設值后,系統將對存在廢棄頁的區塊進行回收。這種寫入和擦除策略在一定程度上保證了損耗的均勻性。
這種機制雖然在一定程度上滿足均勻損耗的要求,但還是存在問題,并不適用于所有的嵌入式應用環境。假設在一塊16MB的NAND器件上,有10MB空間用來存放相對固定、不經常修改的數據文件,則經常修改的文件只能在剩下的6MB空間上重復擦寫,在這6MB空間上做到“均勻損耗”。對整個器件來說,系統并沒有合適的搬移策略對固定文件進行搬移,整個器件做不到均勻損耗。在實時記錄信息量比較大的應用環境中,應編寫相應的搬移策略函數,對固定文件進行定期的搬移,以確保整個NAND器件的均勻損耗。
4掉電恢復性能測試
4.1測試目的
文件系統應能保證在系統突然斷電的情況下,最大限度地恢復(保護)有用數據。如果在修改一個文件時掉電,那么掉電后的文件保護方式根據實際情況可分為3種:
①用舊文件完全代替新寫文件,新寫文件(沒寫完)被忽略。這種保護方式應用比較多,比如在更新設置時掉電,使用掉電前的設置,用戶是可以接受的。
②用新文件完全代替舊文件(新文件寫了多少就保留多少)。這種保護方式適合應用于文本的情況,比如短信。新短信雖然不完整,但根據情況用戶可以得到部分信息,如果發送方信息完整或屬于可猜測的情況,則可以要求發送方重發。
③己寫部分用新文件,未寫部分用老文件,所謂“新加舊”的保護方式。這種保護方式可以應用在動態更新的文件上。但是,對于使用偏移量進行的文件讀寫操作,采用這種保護方式,會產生亂碼。
4.2測試方法
測試代碼隨機產生掉電消息,模擬一次掉電行為。測試代碼插入到yaffs_FEWriteChunkToNAND()(yaffs_fileem.cpp)中,在寫Data區和Spare區時分別產生隨機掉電位置,模擬掉電行為。掉電后,程序重新掛接文件系統,并讀取掉電時正在更新的文件,與原文件相比給出判定結果。
程序用到的測試變量:掉電類別?g_tstPowerOff,1為Data區掉電,2為Spare區掉電。在完全模擬時,掉電類別隨機產生。程序用TestLog.log記錄掉電后判定的結果。TestLog.log為增加方式打開,新記錄寫在最后,不影響原有的記錄結果。
4.3測試手段
模擬一次“掉電”行為,需要進行特殊的處理。實際的掉電行為在電源重新供給后,整個系統會重新開始,包括重新啟動文件系統。掉電前系統的所有參數、系統堆棧以及現場均失效。在測試中模擬掉電行為有一定的難度,直接斷電既不安全,也不現實,可用exit()函數中止程序來模擬。在執行寫操作時,寫入隨機的字節數后,用exit()函數立即中止程序的運行;再重新啟動程序,讀取掉電時寫入的文件,分析文件以檢查文件系統新的掉電保護功能。
上述測試手段不適用于自動測試,也不可能手工進行大量的測試。筆者在該項測試中,巧妙地使用了try{}和catch{}結構,既模擬了實際的掉電行為,又保證了自動測試的順利進行。
模擬掉電行為的核心代碼如下:
#ifdefFS_TEST//測試代碼段
switch(rand()%5){//隨機產生20%的掉電率
case0://無掉電情況
case1:
case2:
case3:
write(g_filedisk,localData,512);
break;
case4://模擬掉電行為,隨機產生掉電時己寫的字節數
write(g_filedisk,localData,rand()%512);
close(g_filedisk);//己掉電,關閉磁盤模擬文件
initialised=0;//為防止文件系統出差,置初始化標志為未初始化拋出異常,直接返回到文件系統加載處,跳過函數正常返回的過程
throwint(0x01);
//exit(0);
break;
}
#endif
主控程序代碼如下:
yaffs_StartUp();
yaffs_mount((signedchar*)"/Root");
poCode=0;
try{
//修改一個文件(在寫文件時,每頁會有20%的掉電率)
modify_in_a_file("/Root/File");
}
catch(inti_code){
poCode=i_code;
}
//模擬掉電結束后重新掛接系統,并測試掉電文件的正確性
yaffs_StartUp();
yaffs_mount((signedchar*)"/Root");
copy_out_a_file("File.poff",(signedchar*)"/Boot/File");
yaffs_unmount((signedchar*)"/Root");
//以下檢測File.poff的正確性
4.4測試結果
YAFFS-NAND文件系統,只提供上述的②和③兩種文件保護方式。在打開文件時,若以“截短為0”的方式打開已有文件,則保護方式為第②種,使用新文件完全代替舊文件。若以修改的方式打開己有文件,則保護方式為第③種,使用新加舊的保護方式。
需要注意的是:在數據區掉電的情況下,以上兩種保護方式完好,測試通過。但在Spare區掉電的情況下,文件系統有很大的概率讀不出掉電時的文件,幾乎不能正常使用。在實際掉電情況中,按Data區和Spare區的比例關系(512∶16),寫操作掉電時發生在Spare區的概率為3.03%,不可接受。另外,文件系統不提供舊文件的保護方式,對于這類應用(還是比較多的)需要另外實現。
4.5對YaffsNAND在掉電保護方面的改進
4.5.1增加保護方式
Yaffs-NAND文件系統在原理上決定了只能有上述的②和③兩種文件保護方式。要提供第一種保護方式,需要對文件系統進行擴展,增加2個函數和2個結構體:
intyaffs_openEx(signedchar*path,intoflag,intmode,SProInfo*i_proInfo=NULL)
intyaffs_closeEx(intfd,SProInfo*i_proInfo=NULL)
typedefenumEProMode{
EOnlyOld,
EOnlyNew,
ENewOld,
EDefault,
}EProMode;
typedefstructSProInfo{
EProModeproMode;
signedchar*name;
intfd;
SProInfo(){
proMode=EDefault;
name=NULL;
fd=-1;
}
}SProInfo;
EOnlyOld、EOnlyNew、ENewOld和EDefault分別表示3種不同的保護方式和默認保護方式(由原文件系統提供)。SProInfo結構不僅記錄保護方式,還記錄了該文件名,供關閉文件時使用。
yaffs_openEx()根據傳入的保護方式,修改打開文件的標志,以顯式地設置原有的②、③兩種保護方式。當保護方式為EOnlyOld時,yaffs_openEx()將打開另一個新的臨時文件,并返回給用戶使用。傳入的SProInfo結構的指針,將帶回文件名和文件句柄,供關閉文件時用。yaffs_closeEx()函數在關閉文件時,檢查文件的保護方式。若為第②、③種情況,則直接關閉;若為第一種情況,則先刪除原文件,再把新文件重新命名,以達到文件保護的目的。
使用方法如下:
①使用默認方式,則與原文件系統使用方法相同。新參數默認為NULL,可以直接兼容己有代碼。
②使用擴展方式,則要先生成一個SProInfo的對象,但將其指針傳給yaffs_openEx()。關閉時同樣要將其指針傳給yaffs_closeEx()。例如:
SProInfopif;
Mode=EOnlyOld;//使用第一種保護方式
inth=yaffs_openEx(Name,O_CREAT|O_RDWR,S_IREAD|S_IWRITE,
//用文件句柄h對文件進行讀寫操
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年醫用縫合材料項目投資申請報告代可行性研究報告
- 2024年電子測量儀器資金籌措計劃書代可行性研究報告
- 2024年鐵道建筑資金需求報告代可行性研究報告
- 環保型固態電池生產線綜合運維管理服務協議
- 海鮮水產品牌授權合作協議
- 2025年中國保濕面霜行業市場前景預測及投資價值評估分析報告
- 高鐵站區交通運營管理及旅客服務合作協議
- 智能制造工業AR遠程調試協議
- 影視版權交易與改編成動漫服務合同
- 抖音直播帶貨糾紛仲裁服務協議
- 腦膠質瘤的治療:替莫唑胺-蒂清
- DL∕T 1746-2017 變電站端子箱
- 廣東省市政基礎設施工程竣工驗收技術資料統一用表(2019版)(下冊)
- 江蘇省蘇州市常熟市2023-2024學年五年級下學期數學期末檢測
- 江蘇省南京市鼓樓區2023-2024學年五年級下學期期末數學試卷
- YB/T 6328-2024 冶金工業建構筑物安全運維技術規范(正式版)
- DZ∕T 0148-2014 水文水井地質鉆探規程(正式版)
- 弘揚非遺傳統文化-評書2
- 《商業文化與素養》教案全套 第一周專題一認知商業文化1-第十八周專題六自我管理3
- AED(自動體外除顫儀)的使用
- 2024中考復習必背初中英語單詞詞匯表(蘇教譯林版)
評論
0/150
提交評論