WINCE文件系統(tǒng)的偶發(fā)故障一直是WINCE系統(tǒng)最為棘手的問題,盡管出現(xiàn)故障的幾率不高,但對設(shè)備的穩(wěn)定運行造成嚴重影響。為了保證基于WinCE的嵌入式系統(tǒng)能穩(wěn)定可靠運行,英創(chuàng)公司對WINCE文件系統(tǒng)進行了長期分析測試,希望能找到有效辦法來規(guī)避WINCE文件系統(tǒng)故障。本文主要介紹英創(chuàng)在這方面的工作及獲得的成果。
先前的工作
過去多年,英創(chuàng)公司陸續(xù)做過很多工作改善WINCE文件系統(tǒng),也取得了一些成效。
1.將文件系統(tǒng)升級成exfat。
2.封裝文件讀寫庫,增加緩存空間,使文件讀寫盡量以整塊形式操作。
3.升級數(shù)據(jù)庫版本。
4.實現(xiàn)WINCE5->WINCE6->WEC7的升級。
5.修改NandFlash的ECC校驗。
6.將內(nèi)核注冊表類型由HIVE-Based注冊表替換為RAM-Based注冊表并測試其穩(wěn)定性。
7.增加文件備份恢復(fù)工具BFS。
先前的實驗工作
因為文件系統(tǒng)故障極低,使得通過實驗程序復(fù)現(xiàn)其故障變得很困難。在實驗室里通常大量板卡滿負荷連續(xù)工作1周以上可能才會發(fā)現(xiàn)有板卡出現(xiàn)文件系統(tǒng)故障。因為在實驗室運行程序始終與用戶現(xiàn)場使用存在差異,通過同樣CPU負載率完成近似文件讀寫量,確很難復(fù)現(xiàn)文件系統(tǒng)故障。英創(chuàng)公司也采用了很多不同的測試方法進行測試,例如:
數(shù)據(jù)輪詢讀寫測試
基礎(chǔ)的文件讀寫測試程序,程序滿負荷向nandflash寫記錄文件,寫滿后刪除最早記錄繼續(xù)添加新記錄。英創(chuàng)所有板卡均能通過該測試,該實驗程序也很難測試出文件系統(tǒng)故障。
數(shù)據(jù)庫讀寫測試1
程序為C#數(shù)據(jù)庫程序,程序滿負荷向SQLCE數(shù)據(jù)庫中不停添加記錄,該實驗測試了WINCE5,WINCE6的板子,其中WINCE5的板子有測試出文件系統(tǒng)故障,整個測試周期較長。
對該測試的分析,認為WINCE6升級了文件系統(tǒng)和數(shù)據(jù)庫版本,所以表現(xiàn)比WINCE5好。
數(shù)據(jù)庫讀寫測試2
程序分別為C代碼的SQLCE數(shù)據(jù)庫程序和SQLite數(shù)據(jù)庫程序,多線程滿負荷對同數(shù)據(jù)庫進行讀寫操作。SQLCE數(shù)據(jù)庫程序表現(xiàn)正常,SQLite數(shù)據(jù)庫程序只有在單線程時表現(xiàn)正常。查看SQLite源碼發(fā)現(xiàn),WINCE中使用的SQLite庫精簡掉了線程安全模式,所以不能保證多線程對數(shù)據(jù)庫同時操作的穩(wěn)定性。同時發(fā)現(xiàn)SQLite數(shù)據(jù)庫每次添加數(shù)據(jù),都會新建一個臨時文件然后刪除,每次添加數(shù)據(jù)都會重新打開數(shù)據(jù)庫然后關(guān)閉,導(dǎo)致SQLite的CPU負載遠遠高于SQLCE。
對該測試的分析,目前版本的SQLite數(shù)據(jù)庫并適合在WINCE平臺上使用
1.數(shù)據(jù)滿負荷讀寫時增加隨機斷電
運行之前文件讀寫程序,并增加外部定時斷電,用于模擬實際現(xiàn)場環(huán)境可能出現(xiàn)的掉電情況。測試發(fā)現(xiàn)運行一段時間后發(fā)現(xiàn)WINCE6板子出現(xiàn)了文件系統(tǒng)故障,WEC7板子沒有出現(xiàn)。
該測試英創(chuàng)分析認為CPU滿負荷讀寫狀態(tài)下突然掉電,可能是導(dǎo)致WINCE文件系統(tǒng)故障的主要原因。WEC7可能對文件系統(tǒng)做了近一步優(yōu)化,所以表現(xiàn)比WINCE6好。因為設(shè)備意外斷電總是不可避免,所以英創(chuàng)增加了備份還原工具來解決該問題。
2.多線程文件讀寫
根據(jù)客戶反饋,編寫測試程序模擬客戶應(yīng)用程序?qū)ξ募到y(tǒng)進行讀寫操作,使用多個線程分別操作不同的文件進行讀寫。當實驗讀寫數(shù)據(jù)量已經(jīng)遠遠超過客戶估算數(shù)據(jù)量,依然不能復(fù)現(xiàn)出客戶反饋的文件系統(tǒng)故障。
該測試英創(chuàng)分析認為測試程序始終和客戶應(yīng)用程序存在巨大差異,這種差異導(dǎo)致實驗難以復(fù)現(xiàn)客戶反饋故障。
3.單文件多線程共享讀寫測試
同樣根據(jù)客戶反饋,編寫測試程序模擬客戶應(yīng)用程序?qū)ξ募到y(tǒng)進行讀寫操作,這一次,使用多個線程同時對同個文件進行讀寫操作。當實驗讀寫數(shù)據(jù)量已經(jīng)遠遠超過客戶估算數(shù)據(jù)量時,同樣無法復(fù)現(xiàn)出客戶反饋的文件系統(tǒng)故障。
近期的實驗發(fā)現(xiàn)
在近2個月里,我們采用了新的測試方法來檢驗FATFS。測試程序通過Timer,分別以60ms,90ms,150ms間隔讀寫3個不同文件。與以往測試的最大不同在于,之前測試是在文件中不停的添加新數(shù)據(jù),此次測試是以覆蓋的形式反復(fù)讀寫文件同一位置,即文件開頭2048字節(jié)數(shù)據(jù)。
該實驗讀寫量遠遠低于之前的測試,略60KB/s,CPU負載平時在20%以下,但是穩(wěn)定在短時間內(nèi)測試出文件系統(tǒng)故障(通常在一天內(nèi)就能觀察到文件系統(tǒng)故障)。此次試驗的意義在于大大降低了測試規(guī)模,(此前由于文件系統(tǒng)故障出現(xiàn)幾率太低,測試規(guī)模小了很可能測試不出結(jié)果。)
根據(jù)不同的實驗條件,整個實驗項目由十幾個具體實驗組成,實驗數(shù)據(jù)見文章末尾附表。以下簡要描述各個實驗的情況。
1 - 3號實驗
實驗測試了英創(chuàng)EM928X平臺下所有產(chǎn)品,發(fā)現(xiàn)不同硬件的產(chǎn)品在一定條件下均存在文件系統(tǒng)故障的概率,說明文件系統(tǒng)故障與硬件關(guān)系不大。
實驗測試RAM注冊表,和HIVE注冊表的主板,實驗結(jié)果說明文件系統(tǒng)故障與主板內(nèi)核中注冊表類型關(guān)系不大。
4 - 5號實驗
實驗中升級了測試程序,可以設(shè)置程序運行時間。實驗采用對比的形式,一組實驗板運行時間為90s,另一組實驗板不限制測試時間,而外部斷電時間為150s。這樣,保證第一組測試版在外部斷電時,沒有進行文件操作。
實驗結(jié)果,兩組測試均出現(xiàn)了文件系統(tǒng)故障,實驗結(jié)果看來,文件系統(tǒng)故障并非單純因為進行文件讀寫操作時意外斷電導(dǎo)致。
實驗還修改了ECC校驗,從校驗1位改為校驗8位。實驗結(jié)果看來,文件系統(tǒng)故障與ECC校驗關(guān)系也不大。
6 - 8號實驗
實驗測試了電源對文件系統(tǒng)的影響,實驗結(jié)果看來,文件系統(tǒng)故障與電源關(guān)系不大。
實驗測試對比了大容量FLASH和小容量FLASH,實驗結(jié)果看來,文件系統(tǒng)故障與FLASH容量大小沒有直接的關(guān)系,但容量越大故障出現(xiàn)的概率越小。
9號實驗
采用了2組不同測試程序進行對比實驗,一套測試程序為原測試程序,一套測試程序增加一組判斷,當CPU負載率超過70%時暫時停止文件讀寫,當CPU負載率重新降到70%以下,再進行文件操作。
實驗發(fā)現(xiàn)采用了監(jiān)控CPU負載策略的板子再沒有出現(xiàn)文件系統(tǒng)故障。
10 - 13號實驗
為了排除程序差異性,重新編寫測試程序,使測試使用相同測試程序,僅通過不同配置文件設(shè)置不同的文件讀寫策略。
實驗再次驗證,采用了監(jiān)控CPU負載策略的板子沒有發(fā)現(xiàn)文件系統(tǒng)故障,至少證明通過該策略,能大大降低文件系統(tǒng)故障概率。
進一步觀察發(fā)現(xiàn),板子每運行1分鐘左右,大概文件重復(fù)寫1000次左右時,CPU負載率會迅速升高到100%,這里應(yīng)該是文件系統(tǒng)在后臺做寫平衡注操作。如果此時停止文件讀寫,CPU負載會很快下降至正常水平。反之,系統(tǒng)很大概率會一直維持CPU負載率100%狀態(tài)。分析認為在系統(tǒng)進行寫平衡操作時保持高頻率文件讀寫,容易導(dǎo)致應(yīng)用程序文件操作與后臺的寫平衡操作構(gòu)成某種互鎖而無法完成。
注:嵌入式板卡所使用的nandflash在寫之前需要擦除,而nandflash只有大約10萬次的擦寫壽命。為了增加nandflash的使用壽命,文件系統(tǒng)會采用算法讓程序均與寫到nandflash各個位置,所以當文件系統(tǒng)發(fā)現(xiàn)nandflash某個位置讀寫過于頻繁,就會將該處數(shù)據(jù)轉(zhuǎn)移到其它位置上。
14 - 17號實驗
Timer實際上是并在主線程里的單線程操作,客戶在實際使用時更多使用多線程進行讀寫操作。14號至17號實驗使用修改后的測試程序,程序使用多線程進行文件讀寫操作,讀寫間隔為50ms、100ms、150ms,與之前相似。實驗發(fā)現(xiàn),使用多線程,CPU負載比Timer低,文件系統(tǒng)出現(xiàn)故障幾率比之前低,但是不采用CPU負載監(jiān)控策略的板子依然會出現(xiàn)文件系統(tǒng)故障。
實驗設(shè)定了不同CPU監(jiān)控閾值,測試發(fā)現(xiàn)閾值設(shè)置到99,即僅在CPU負載達到99%以上時暫停文件讀寫,就可以有效避免出現(xiàn)文件系統(tǒng)故障。即只要CPU負載不達到100%,后臺寫平衡操作就能很快完成。
實驗結(jié)論
從實驗結(jié)果來看,文件系統(tǒng)故障最大誘因是系統(tǒng)內(nèi)部做寫平衡處理同時應(yīng)用程序也在進行高頻率文件讀寫。寫平衡操作長時間無法完成容易導(dǎo)致文件系統(tǒng)故障。采用文章中提到的讀寫策略:即監(jiān)控CPU負載率,在CPU負載超過一定閾值(推薦70%),暫停文件操作,等待CPU負載率降低到閾值以下(系統(tǒng)后臺寫平衡操作結(jié)束),可有效規(guī)避FATFS內(nèi)部均衡操作與文件讀寫的沖突,從而保證文件系統(tǒng)的穩(wěn)定運行。
客戶程序如果高頻率對文件進行覆蓋讀寫操作,或是反復(fù)修改數(shù)據(jù)庫某項值,會導(dǎo)致系統(tǒng)頻繁進行寫平衡操作。優(yōu)化程序,降低系統(tǒng)寫平衡操作的頻率,也有助于提供文件系統(tǒng)穩(wěn)定性。
小結(jié)
對基于WinCE的嵌入式系統(tǒng),應(yīng)用程序如果遵循以下2條規(guī)則:(1)采用多線程進行不同文件的讀寫操作;(2)基于CPU負載率的文件讀寫控制策略。就能夠保證文件系統(tǒng)的穩(wěn)定可靠運行。
附表實驗記錄
實驗編號 | 日期 | 板卡名稱 | 內(nèi)核 | Flash | 板卡數(shù) | 實驗程序 | 外部斷電 | 實驗時長 | 實驗結(jié)果 |
1 | 2018/12/13 | EM9281 | FSREGRAM | 1G08 | 5套 | test_filesys.exe V1.01 | 開80s,斷5s | 396小時/16771次 | 2套應(yīng)用程序出錯 |
2 | 2018/12/29 | EM9281 | FSREGHIVE | 1G08 | 4套 | test_filesys.exe V1.01 | 開80s,斷5s | 8小時/338次 | 3套應(yīng)系統(tǒng)報錯 |
EM9281 | FSREGRAM | 1G08 | 4套 | test_filesys.exe V1.01 | 開80s,斷5s | 265小時/11223次 | 1套應(yīng)用程序出錯, 1套應(yīng)系統(tǒng)報錯 | ||
EM9287 | FSREGRAM | 1G08 | 3套 | test_filesys.exe V1.01 | 開80s,斷5s | 8小時/338次 | 1套應(yīng)用程序出錯 | ||
EM9287 | FSREGHIVE | 1G08 | 4套 | test_filesys.exe V1.01 | 開80s,斷5s | 95小時/4032次 | 1套應(yīng)用程序出錯,1套<-NandMonitor_Setup | ||
EM9287 | FSREGHIVE | 1G08 | 6套 | test_filesys.exe V1.01 | 開80s,斷5s | 88小時/3727次 | 1套應(yīng)系統(tǒng)報錯, <-NandMonitor_Setup | ||
3 | 2019/01/02 | EM9287 | FSREGHIVE | 1G08 | 10套 | test_filesys.exe V1.01 | 開80s,斷5s | 151小時/6395次 | 2套應(yīng)用程序出錯 |
4 | 2019/01/09 | EM9281 | FSREGRAM | 1G08 | 8套 | test_filesys.exe V1.00(Parameters=”90”) | 開150s,斷5s | 18小時/426次 | 1套應(yīng)用程序出錯 |
5 | 2019/01/10 | EM9281 | FSREGRAM(ecc校驗8個及以上 | 1G08 | 8套 | test_filesys.exe V1.00 Parameters=”S 90” | 開150s,斷5s | 99小時/2299次 | 1套應(yīng)用程序出錯,1套死機 |
6 | 2019/01/15 | EM9281 | FSREGRAM(VDD電源) | 1G08 | 8套 | test_filesys.exe V1.03 | 開80s,斷5s | 14.9小時/632次 | 未出現(xiàn)異常 |
7 | 2019/01/16 | ES9281 | FSREGRAM(VDD電源) | 2G08 | 8套 | test_filesys.exe V1.03 | 開80s,斷5s | 23小時/976次 | 2套應(yīng)用程序出錯 |
EM9281 | FSREGHIVE(紋波過沖) | 1G08 | 8套 | test_filesys.exe V1.03 | 開80s,斷5s | 16小時/677次 | 2019/01/25查看時有1套核報NK.EXE錯誤,且應(yīng)用程序無法執(zhí)行 | ||
8 | 2019/01/17 | ES9281 | FSREGHIVE(紋波過沖) | 2G08 | 8套 | test_filesys.exe |
開80s,斷5s 開300s,斷5s 開540s,斷5s |
103.3小時/4376次 48小時/283次 |
1套應(yīng)用程序出錯 |
EM9281 | FSREGHIVE(紋波過沖) | 2G08 | 8套 | test_filesys.exe V1.03 | 開80s,斷5s | 31.3小時/1327次 | 2019/01/25查看時有2套核報NK.EXE錯誤,且應(yīng)用程序可以運行 | ||
9 | 2019/01/18 | EM9281 | FSREGHIVE(把盤分成2個) | 2G08 | 8套 | test_filesys.exe |
開80s,斷5s 開300s,斷5s 開90s,斷5s |
72小時/3049次 48小時/283次 |
未出現(xiàn)異常 |
EM9281 | FSREGHIVE | 1G08 | 6套 | test_filesys.exe(V1.03,超過70%就不寫) | 開80s,斷5s | 72/小時/3049次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 6套 | test_filesys.exe(V1.04 50 70%) | 開300s,斷5s | 48小時/283次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 6套 | test_filesys.exe (V1.04,設(shè)置350 100%) | 開90s,斷5s | 24小時/1016次 | 1套報NK.EXE錯誤,且應(yīng)用程序可以運行 | ||
EM9281 | FSREGHIVE | 1G08 | 6套 | test_filesys.exe(v1.01) | 開540s,斷5s | 15小時/99次 | 1套報NK.EXE錯誤,且應(yīng)用程序無法運行 | ||
10 | 2019/01/25 | EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe (v2.00) | 開120s,斷5s | 21小時/607次 | 1套應(yīng)用程序打不開 |
11 | 2019/01/26 | EM9281 | FSREGHIVE | 1G08 | 10套 | test_filesys.exe(V1.04 350 100%) | 開120s,斷5s | 46.1小時/1328次 | 1套報NK.EXE錯誤,且應(yīng)用程序無法運行,1套應(yīng)用程序嚴重錯誤,無法打開 |
12 | 2019/01/28 | EM9281 | FSREGHIVE | 1G08 | 10套 | test_filesys.exe(V2.01 350 100%) | 開120s,斷5s | 23.6小時/680次 | 1套應(yīng)用程序打不開, 1套應(yīng)用程序嚴重錯誤,無法打開 |
13 | 2019/01/29 | EM9281 | FSREGHIVE | 1G08 | 10套 | test_filesys.exe(V2.01b 350 100%) | 開120s,斷5s | 4.09小時/118次 | 未出現(xiàn)異常 |
14 | 2019/01/31 | EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.02,70,50,100,150) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 |
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.02,80,50,100,150) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.02,100,50,100,150) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
15 | 2019/02/01 | EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,70,20,20,20) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 |
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,80,20,20,20) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,100,20,20,20) | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
16 | 2019/02/02 | EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,-1)CPU負載最高100 | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 |
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,-1)CPU負載最高90 | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 5套 | FST.exe(v2.04,-1)CPU負載最高80 | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 5套 | FST.exe(v2.04,-1)CPU負載最高70 | 開120s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
17 | 2019/02/11 | EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,-1)CPU負載最高100 | 開180s,斷5s | 23.6小時/681次 | 2套出現(xiàn)文件系統(tǒng)故障 |
EM9281 | FSREGHIVE | 1G08 | 10套 | FST.exe(v2.04,-1)CPU負載最高90 | 開180s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 5套 | FST.exe(v2.04,-1)CPU負載最高80 | 開180s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 | ||
EM9281 | FSREGHIVE | 1G08 | 5套 | FST.exe(v2.04,-1)CPU負載最高70 | 開180s,斷5s | 23.6小時/681次 | 未出現(xiàn)異常 |
其他
測試中使用的測試程序及源碼,客戶可以聯(lián)系英創(chuàng)工程師獲得。
-
嵌入式系統(tǒng)
+關(guān)注
關(guān)注
41文章
3593瀏覽量
129500
發(fā)布評論請先 登錄
相關(guān)推薦
評論