電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 1604|回復(fù): 0
收起左側(cè)

學(xué)嵌入式要很聰明嗎_英創(chuàng)信息技術(shù)工控主板FAT文件系統(tǒng)的穩(wěn)健讀寫方法介紹

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-7-22 10:53:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
學(xué)嵌入式要很聰明嗎_英創(chuàng)信息技術(shù)工控主板FAT文件系統(tǒng)的穩(wěn)健讀寫方法介紹,   

在基于WinCE的嵌入式系統(tǒng)中,通常NandFlash + FAT文件系統(tǒng)是最為常用的數(shù)據(jù)存儲方式。對這類設(shè)備長期運行情況的跟蹤,我們發(fā)現(xiàn)在一定的應(yīng)用情況下,F(xiàn)AT文件系統(tǒng)存在失效的可能,而文件系統(tǒng)的失效導(dǎo)致系統(tǒng)在重啟中不能讀取系統(tǒng)注冊表或應(yīng)用程序文件,宏觀的現(xiàn)象就是設(shè)備不能正常運行。

經(jīng)過對FAT文件失效情況的分析,我們發(fā)現(xiàn)出現(xiàn)失效的系統(tǒng)往往有以下兩種文件操作:

1、需要保存運行日志文件,每條日志記錄大約兩百字節(jié)水平,整個日志文件可包含上萬條記錄,即日志文件大小在2MB水平。應(yīng)用程序?qū)θ罩镜牟僮魇请S機的。

2、系統(tǒng)有一個容量上兆的配置文件,應(yīng)用程序可能根據(jù)運行的情況,動態(tài)修改配置的內(nèi)容。

以上這兩種文件操作,對NandFlash + FAT的存儲單位,由于文件都比較大,都可能導(dǎo)致大規(guī)模的NandFlash塊擦除及數(shù)據(jù)搬動。當此時CPU負載還比較重時,F(xiàn)AT文件系統(tǒng)內(nèi)部的某種缺陷就可能暴露出來,從而危害設(shè)備的穩(wěn)定運行。

針對上述兩種應(yīng)用的特點,以規(guī)避FAT文件系統(tǒng)出現(xiàn)致命缺陷為目的,我們設(shè)計了一層新的文件操作API函數(shù),來替代常規(guī)的文件API函數(shù)。新的API包括以下6個函數(shù):

.  HANDLE CreateFileEm(……);
         .  BOOL ReadFileEm(……);
         .  BOOL WriteFileEm(……);
         .  DWORD SetFilePointerEm(……);
         .  DWORD GetFileSizeEm(……);
         .  BOOL CloseHandleEm(……);

這6個API函數(shù)的名稱與對應(yīng)的常規(guī)函數(shù)名稱基本一致,只是在末尾增加了“Em”兩個字母以示區(qū)別,函數(shù)的參數(shù)與常規(guī)函數(shù)的參數(shù)則完全一致。應(yīng)用程序只需做簡單的修改,就可使用我們所提供的新方法。

新的文件操作的要點,是把一個日志文件或配置文件,映射為NandFlash下的子目錄,文件的內(nèi)容則分成若干個子文件(以下稱為量子文件,以表示它的不可分割性),量子文件按序號0000依次遞增9999,每個量子文件的大小為NandFlash的扇區(qū)大小,在英創(chuàng)工控主板中NandFlash的扇區(qū)Size為2KB,當前量子文件寫滿2KB后,會自動生成當前序號+1的新量子文件。API內(nèi)部建有當前量子文件的數(shù)據(jù)緩沖區(qū),當讀寫僅限于當前量子文件大。2KB)時,不會產(chǎn)生實質(zhì)性的NandFlash讀寫,從而降低NandFlash的讀寫負擔。即使進行實質(zhì)性的寫操作,因為總是2KB,F(xiàn)AT文件系統(tǒng)的工作量也被降到最低。

新的API函數(shù)盡管可支持不同線程操作同一文件,但若出現(xiàn)不同線程對同一個量子文件進行讀寫操作,則可能存在數(shù)據(jù)丟失的情況、讀取的數(shù)據(jù)不是最新數(shù)據(jù)的情況。因此應(yīng)用程序應(yīng)盡量避免不同線程對同一個量子文件進行讀寫操作。

在200MHz主頻的CE5.0系統(tǒng)中(如 EM9160、EM9360等),新API函數(shù)的文件寫操作的平均速度在90KB/s – 95KB/s范圍,文件讀操作的平均速度在600KB/s – 700KB/s范圍。

一般情況下若寫入的數(shù)據(jù)處在一個量子文件大小區(qū)域內(nèi),為了提高NandFlash的操作效率,不會立即觸發(fā)實質(zhì)性的NandFlash寫。但之后一定時間內(nèi)(設(shè)置為2秒),沒有進一步的寫操作,新API的后備線程會自動把應(yīng)用程序?qū)懭氲臄?shù)據(jù)實質(zhì)性寫入NandFlash的對應(yīng)量子文件中。因此這里存在,在實質(zhì)性寫入發(fā)生之前,系統(tǒng)由于某種情況出現(xiàn)重啟(Power Cycling),應(yīng)用程序?qū)懭氲臄?shù)據(jù)就會丟失的情況。這是為避免致命性錯誤,應(yīng)用程序需付出的代價。

更極端的情況,當正在實質(zhì)性寫某一量子文件時,系統(tǒng)出現(xiàn)Power Cycling,還可能存在該量子文件被破壞的情況。但這種情況在常規(guī)寫中同樣存在,且被破壞的還是整個文件。因此新API是Power Cycling對整個數(shù)據(jù)的損壞度是降低了的。

更重要的是,在系統(tǒng)進入穩(wěn)定運行后,量子文件的數(shù)目瞬間不會有大的變化,甚至完全沒有變化(配置文件情形,或日志文件達到應(yīng)用程序設(shè)置的上限),這樣新的API對FAT文件系統(tǒng)的FAT表、目錄區(qū)的負載會降到最低,從而大大避免FAT文件系統(tǒng)的關(guān)鍵區(qū)域被Power Cycling破壞的可能性。這是新API規(guī)避FAT文件系統(tǒng)缺陷的關(guān)鍵所在。

新API的定義包含在“LogFile.h”頭文件中,具體實現(xiàn)代碼則在“LogFile.cpp”中,對客戶應(yīng)用程序,只需簡單的把LogFile.cpp加入到應(yīng)用程序中,并在相關(guān)的cpp文件中include頭文件LogFile.h,就可方便的測試評估該方法了。
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)閉

站長推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表