,, , ,
(1.中國人民解放軍32184部隊,北京 100072;2.北京北方車輛集團有限公司,北京 100072;3.北京航天測控技術(shù)有限公司,北京 100041)
在數(shù)據(jù)采集、狀態(tài)監(jiān)測以及故障診斷等應(yīng)用領(lǐng)域,隨著目標(biāo)對象的技術(shù)含量越來越高、結(jié)構(gòu)組成越來越復(fù)雜,所需要的技術(shù)參數(shù)越來越多,對嵌入式系統(tǒng)存儲容量的要求也越來越高。大容量NAND Flash存儲器的出現(xiàn)和應(yīng)用,意味著可以存儲更大量的數(shù)據(jù)或者說更長的數(shù)據(jù)覆蓋周期,為更深層次的數(shù)據(jù)挖掘奠定了數(shù)據(jù)基礎(chǔ)。
通常,對大容量NAND Flash存儲器的使用主要采用直接使用和移植FATS文件系統(tǒng)兩種方法。直接使用法是最基本和直接的方法,每次的下載或刪除總是從存儲器零地址開始,無法控制所需數(shù)據(jù)的大小,同時,刪除后再次寫入也是再次從原起始地址開始,造成存儲器的不均衡使用,影響使用壽命;移植FATS文件系統(tǒng)法是在嵌入式系統(tǒng)中軟件移植了FATS文件系統(tǒng),其優(yōu)點不用贅述,但這種方法對硬件性能和資源的要求相對較高,而且軟件設(shè)計相對復(fù)雜,因此在應(yīng)用于諸如成本限制嚴格、硬件系統(tǒng)資源相對不足的場景中時,為實現(xiàn)分區(qū)管理而占用過多的系統(tǒng)資源或為此而需要提高嵌入式系統(tǒng)性能不是一個最佳選擇。
實際經(jīng)驗表明,離線分析中所需要的關(guān)鍵數(shù)據(jù)通常只是全部存儲數(shù)據(jù)的某一個或幾個片段,并不需要把所有的數(shù)據(jù)全部下載。因此設(shè)計一種分區(qū)管理策略,盡量減少數(shù)據(jù)下載數(shù)量,使用戶可以根據(jù)故障時機等相關(guān)信息僅下載關(guān)鍵數(shù)據(jù),同時,實現(xiàn)存儲器存儲區(qū)間的均衡使用,是提高嵌入式系統(tǒng)大容量存儲器使用性價比的最佳選擇。
鑒于上述分析,本文提出通過建立NAND Flash存儲器分區(qū)屬性的方法,描述數(shù)據(jù)分區(qū),控制數(shù)據(jù)存儲,形成多個數(shù)據(jù)文件。用戶通過分區(qū)屬性獲得數(shù)據(jù)文件中的數(shù)據(jù)起始時間、結(jié)束時間以及進行數(shù)據(jù)寫入、導(dǎo)出、刪除等操作所需要的相關(guān)信息,使用戶對數(shù)據(jù)文件的操作類似于常規(guī)文件管理系統(tǒng)下對標(biāo)準(zhǔn)文件的操作。該方法無需升級硬件系統(tǒng)、無須移植文件管理系統(tǒng)、無須編寫復(fù)雜的驅(qū)動模塊,在非易失性鐵電存儲器(FRAM,如FM25640-S)的輔助下,實現(xiàn)了分區(qū)管理,解決了對大容量NAND Flash存儲器的分區(qū)管理問題。
NAND Flash分區(qū)設(shè)計的總體思想是將其全部可用空間劃分為多個由指定個數(shù)的連續(xù)塊(Block)構(gòu)成的分區(qū),每個分區(qū)作為一個獨立的“文件”來看待,并以文件屬性的方式表征分區(qū)屬性,描述分區(qū)在NAND Flash存儲器中的位置、相關(guān)操作狀態(tài)以及該屬性在FRAM中的存儲地址等。套用我們熟悉的硬盤及FAT文件系統(tǒng)的概念,本思想可以形象地描述為將一個大硬盤劃分為多個具有唯一編號的微硬盤,每個微硬盤上只存儲一個文件名固定的文件。這里文件名以編號的形式出現(xiàn),文件屬性被定義為除指明文件狀態(tài)、寫位置等屬性外,還包含微硬盤起始地址、空間大小等一些有別于標(biāo)準(zhǔn)文件屬性的屬性,即包含了分區(qū)和分區(qū)內(nèi)數(shù)據(jù)的屬性。分區(qū)屬性包括分區(qū)標(biāo)號(文件號)、起始地址以及文件屬性在FRAM中的存儲位置等;分區(qū)內(nèi)數(shù)據(jù)的屬性對應(yīng)文件屬性中動態(tài)變化的部分,包括數(shù)據(jù)結(jié)束日期時間、寫位置等。文件屬性中的分區(qū)屬性在Flash格式化時設(shè)定,分區(qū)內(nèi)數(shù)據(jù)的屬性隨文件的大小動態(tài)維護。
上述設(shè)計思想的數(shù)據(jù)結(jié)構(gòu)描述如下:
define MAX_FLASH_FILE_NUM 20 //定義分區(qū)總數(shù)
define MAX_FILE_LENGTH_PAGE 12800//分區(qū)空間(文件)大小,以Flash頁為單位
typedef struct
{
byte unFOM;//文件標(biāo)志:bit0-空/bit1-滿/bit2-正在寫/bit3-被導(dǎo)出/bit4-被覆蓋
byte bFileNo;//文件號
byte bPhyFileNo;//物理文件號,決定文件屬性在FRAM中的實際地址
unsigned long ulStartPage;//文件起始Flash頁
DWORDTIME stCreateDate;//數(shù)據(jù)起始日期時間
DWORDTIME stEndDate;//數(shù)據(jù)結(jié)束日期時間
unsigned long ulPageWtr; //當(dāng)前寫位置
}FLASH_FILE_PREP;
FLASH_FILE_PREP結(jié)構(gòu)所定義的文件屬性保存在FRAM中,并在數(shù)據(jù)操作過程中被動態(tài)維護。其中,unFOM定義了當(dāng)前文件的操作狀態(tài),包括空、滿、正在寫、被導(dǎo)出、被覆蓋等,對應(yīng)位置1表示有效,0表示無效;bFileNo定義了當(dāng)前文件的文件號,對應(yīng)Flash中的一個唯一分區(qū),是該分區(qū)的識別標(biāo)識;bPhyFileNo這里稱為物理文件號,它實際表明了對應(yīng)文件的文件屬性保存在FRAM中的實際地址序號,在操作中可通過該編號獲得文件屬性在FRAM中的實際保存地址;stCreateDate和stEndDate分別表示了保存在該文件中的數(shù)據(jù)的起始時間和結(jié)束時間,表示為“年、月、日、時、分、秒”,為索引定位數(shù)據(jù)提供時間標(biāo)識;ulStartPage指定了該文件在Flash中的起始頁地址,也可以形象地稱為是“文件首地址”;ulPageWtr表示當(dāng)前寫位置,是相對于文件首地址的偏移量(偏移頁數(shù)),以用于計算當(dāng)前數(shù)據(jù)將要寫入到NAND Flash存儲器哪一頁,同時該元素也表征了文件中有效數(shù)據(jù)的大小。
上述代碼中做了兩個宏定義,MAX_FLASH_FILE_NUM表示整個Flash存儲器被劃分為多少個分區(qū),即文件個數(shù);MAX_FILE_LENGTH_PAGE表示每個分區(qū)分配的總頁數(shù),即文件最大容量。這兩個宏定義由用戶根據(jù)實際工程的需要,結(jié)合所選用的Flash存儲器指標(biāo)和具體存儲管理需求設(shè)定。
在首次(或后續(xù)必要時)使用時,需要對Flash存儲器進行格式化,即完成分區(qū)和分區(qū)內(nèi)數(shù)據(jù)屬性的初始化,其操作過程描述如下:
1)分配文件號,并初始化文件屬性,除文件空狀態(tài)位置1外,其它屬性位均為0;
2)分配物理文件號,確定當(dāng)前文件屬性在FRAM中的存儲地址序號(=文件號);
3)設(shè)置文件的起始頁碼(=文件號×MAX_FILE_LENGTH_PAGE);
4)文件寫位置初始化(=文件的起始頁碼)。
4)保存文件屬性至FRAM。
5)選定0號文件作為當(dāng)前文件,并設(shè)置數(shù)據(jù)起始日期時間。
上述結(jié)構(gòu)中用到了自定義的數(shù)據(jù)類型DWORDTIME,用于表示日期時間,其定義如下:
typedef struct
{
byte year:5;//年
byte mon:5;//月
byte sec:6;//秒
byte day:5;//日
byte hour:5;//小時
byte min:6;//分鐘
} DWORDTIME ;
為實現(xiàn)上述設(shè)計思想,F(xiàn)RAM需要存儲每個文件的文件屬性,并在NAND Flash的讀寫等操作過程中實時維護。由于文件屬性直接決定了整個NAND Flash存儲器以及當(dāng)前文件的使用情況,其正確性與否直接影響數(shù)據(jù)的讀寫位置以及相關(guān)操作,所以保證文件屬性的正確性具有極其關(guān)鍵和重要的作用。由于嵌入式系統(tǒng)本身的特性,任何情況下的掉電都是“正?!钡?,所以必須考慮采取措施保證對文件屬性保存的正確性。
對于使用FRAM的嵌入式系統(tǒng)來講,影響文件屬性正確性的因素主要包括FRAM的可靠性程度和軟件策略的設(shè)計。對于FRAM的可靠性程度可以由硬件本身來保證。對于軟件策略來講,主要是對數(shù)據(jù)保存策略和完整性判讀的處理,這里采用了“三取二”的保存與判讀策略,即對要保存的數(shù)據(jù)在不同的存儲空間連續(xù)保存三次,取其中兩次相一致的數(shù)據(jù)作為最終結(jié)果。其原理是通過軟件設(shè)計強制這種存儲操作是連續(xù)的,若第i次存儲未完成,則另外兩次的存儲將不會進行,也就是說,每次的存儲操作僅針對當(dāng)前存儲區(qū),其他的兩個存儲區(qū)均不會被更新,因此,必然
圖1 文件寫入流程圖
存在兩次完全一致的存儲結(jié)果,而且這兩次完全一致的存儲結(jié)果必然是完整且有效的。
根據(jù)用戶對整個NAND Flash空間的分區(qū)定義,將對FRAM劃分為MAX_FLASH_FILE_NUM個連續(xù)存儲空間,每個空間的大小為3×sizeof(FLASH_FILE_PREP)字節(jié),這樣,每個文件號對應(yīng)的FRAM存儲起始地址的為:bPhyFileNo×3×sizeof(FLASH_FILE_PREP)。由此,根據(jù)“三取二”的判讀策略,無論在任何情況下,在連續(xù)保存的3次文件屬性中,總存在至少兩次是相同的,取這兩次結(jié)果中的一個作為最終結(jié)果使用
在對NAND Flash存儲器進行格式化時,一方面分配了文件號,同時也確定了物理文件號,分配了每個文件的文件屬性在FRAM中的存儲地址和空間,初始化了文件屬性中的相關(guān)參數(shù),而且,在格式化時,對于每個文件的文件屬性都進行了3次存儲,為后續(xù)的利用奠定了基礎(chǔ)。
在系統(tǒng)上電后,若是首次操作,則必須進行格式化操作,以獲得分區(qū)和分區(qū)內(nèi)數(shù)據(jù)屬性的初始參數(shù),并選定首個操作文件;否則,則從FRAM中讀取當(dāng)前操作的文件號,計算對應(yīng)的文件屬性在FRAM中的地址以讀取相應(yīng)的文件屬性,至此存儲器即可進入正常的工作狀態(tài)。根據(jù)NAND Flash存儲器的操作特性,數(shù)據(jù)的讀寫是按頁進行,因此需要在緩存中的數(shù)據(jù)達到一頁的容量時,先將數(shù)據(jù)寫入NAND Flash存儲器,即寫入當(dāng)前文件的ulPageWtr頁,之后再更新文件結(jié)束時間和文件狀態(tài)標(biāo)志。這樣的操作順序保證了文件中數(shù)據(jù)的完整性,但不足之處是可能造成部分數(shù)據(jù)(因未達到一頁的數(shù)據(jù)量)的丟失,但由于丟失的這部分數(shù)據(jù)是整個嵌入式系統(tǒng)掉電前瞬間的部分,這部分數(shù)據(jù)對目標(biāo)對象來講是可以舍棄的。實際驗證表明其對后續(xù)的數(shù)據(jù)分析基本沒有影響。
在每次寫入數(shù)據(jù)時,軟件將判讀當(dāng)前文件的存儲情況。若當(dāng)前文件未達到設(shè)定的大小(分區(qū)被賦予的最大值),則在數(shù)據(jù)寫入后,文件寫位置(頁碼)ulPageWtr遞增并更新文件結(jié)束時間,然后保存文件屬性指FRAM;若文件達到設(shè)定的大小,即文件滿,則需要在更新文件標(biāo)識、文件結(jié)束時間,并保存文件屬性指FRAM,之后通過“文件號=(文件號+1)% MAX_FLASH_FILE_NUM”的算法,計算新的文件號,并從FRAM中讀出新文件號的文件屬性,根據(jù)文件標(biāo)志確定下一個文件的文件號,并進行初始化工作(包括文件標(biāo)識設(shè)置、更新文件創(chuàng)建時間、文件頁碼置零等),之后保存文件屬性至FRAM,至此形成了一個新的文件,并可以開始保存數(shù)據(jù)。文件號采用“文件號=(文件號+1)% MAX_FLASH_FILE_NUM”的算法,保證了存儲過程中的文件號在0~MAX_FLASH_FILE_NUM-1之間輪回,實現(xiàn)多區(qū)循環(huán)覆蓋使用。其軟件設(shè)計流程如圖1所示。
根據(jù)上述設(shè)計,所需保存的數(shù)據(jù)將不斷地被寫入緩存然后轉(zhuǎn)存至Flash中,因此文件屬性的更新維護每寫一頁便要進行一次,而且必須在寫頁數(shù)據(jù)操作周期間隔內(nèi)完成,同時需要采用保證數(shù)據(jù)完整性的存儲措施(如每次更新時,F(xiàn)RAM連續(xù)保存三次文件屬性,讀出時,內(nèi)容完全相同的兩次認為是正確的),這就要求對于文件屬性的存儲是經(jīng)常的且不能耗費過多的時間,這也是設(shè)計中采取FRAM的一個重要原因。
由此,嵌入式系統(tǒng)采集到的數(shù)據(jù)可自動輪回使用NAND Flash存儲器的存儲空間,達到存儲器空間均衡使用的目的,同時,數(shù)據(jù)寫入過程中,文件屬性中的數(shù)據(jù)結(jié)束時間、文件寫位置以及文件狀態(tài)標(biāo)識等不斷更新維護,并保存在FRAM中,實現(xiàn)了掉電后存儲狀態(tài)的恢復(fù),保證了存儲空間使用的連續(xù)性。
該分區(qū)設(shè)計思想在某型裝備傳動系統(tǒng)的測試控制、狀態(tài)監(jiān)測及故障診斷節(jié)點的設(shè)計中得到了應(yīng)用。該節(jié)點作為整車CAN總線網(wǎng)絡(luò)的組成部分,通過CAN總線網(wǎng)絡(luò)進行信息交互,實現(xiàn)傳動系統(tǒng)的測試控制、狀態(tài)監(jiān)測及診斷,包括故障數(shù)據(jù)下載和離線分析等。整個節(jié)點主要由數(shù)據(jù)存儲單元、溫度采集單元、頻率采集單元、壓力采集單元等組成,要求保存采集控制數(shù)據(jù)以及故障診斷結(jié)果計60個通道,存儲頻率20Hz,數(shù)據(jù)保存時間不少于24小時。
這里主要討論數(shù)據(jù)存儲單元,根據(jù)要求,僅就數(shù)據(jù)存儲功能來講,該節(jié)點每秒需要保存20組數(shù)據(jù)計2400字節(jié)(每個通道2個字節(jié)),其硬件原理如圖2所示。
圖2 數(shù)據(jù)存儲單元硬件原理框圖
圖2中,主控制器采用了MC9S12XF512MLM單片機,它是Freescale公司研發(fā)的性價比極高的一款單片機,總線速度可達50Mhz,價格低、可靠性高;日歷芯片采用DS12C887+,它可計算到2100年前的秒、分、小時、星期、日期、月、秒,其中日歷信息并帶閏年補償,自帶晶振和鋰電池,在沒有外部電源的情況下可工作10年;非易失性隨機鐵電存儲器采用FM25640-S,它是一款64K位非易失性鐵電存儲器,可以向RAM一樣快速讀寫,支持SOPI模式0&3,結(jié)構(gòu)簡單,操作方便;大容量NAND Flash存儲器選用了MT29F4G08AAA存儲芯片,該芯片共4096塊,每塊64 Pages,每頁2,048+64 bytes。
應(yīng)用NAND Flash分區(qū)設(shè)計思想,結(jié)合大容量NAND Flash存儲器的指標(biāo),對存儲器劃分為20個區(qū),每個分區(qū)由200個塊組成,共計占用存儲器4000個塊空間,剩余空間作為壞塊處理機制使用。這樣,每個分區(qū)由12800頁組成,存儲空間約26M字節(jié),由此計算出每個分區(qū)可以保存約3小時的數(shù)據(jù),20個分區(qū)可以保存累計60小時的數(shù)據(jù),滿足了該節(jié)點的設(shè)計要求,并在實際裝車應(yīng)用中得到了證明。
在嵌入式系統(tǒng)軟件設(shè)計中,按照NAND Flash分區(qū)設(shè)計思想,定義了文件屬性讀寫函數(shù)、NAND Flash存儲器的格式化函數(shù)和讀寫函數(shù)、數(shù)據(jù)存儲函數(shù)、定時中斷服務(wù)等。NAND Flash存儲器的格式化操作是建立文件分區(qū)的最初操作,分配了文件號及其對應(yīng)的存儲起始地址、文件屬性等內(nèi)容。NAND Flash存儲器的讀寫函數(shù)用于實現(xiàn)對指定頁的讀寫;數(shù)據(jù)存儲函數(shù)是對圖1所示的數(shù)據(jù)寫入流程的實現(xiàn);定時中斷服務(wù)用于對通過CAN總線接收以及系統(tǒng)自身產(chǎn)生的心跳數(shù)據(jù)進行定時采集和緩存。
數(shù)據(jù)的緩存通過一個環(huán)形緩沖區(qū)的設(shè)計實現(xiàn),在定時中斷中將所有要保存的數(shù)據(jù)進行整理后存入環(huán)形緩沖區(qū)。數(shù)據(jù)存儲函數(shù)根據(jù)緩存中的數(shù)據(jù)量和頁碼值,計算文件號和頁碼值,調(diào)用NAND Flash存儲器的寫函數(shù)將緩存中的數(shù)據(jù)寫入NAND Flash存儲器的對應(yīng)頁,更新文件屬性并通過文件屬性寫函數(shù)保存,完成數(shù)據(jù)的存儲操作。
在上位機軟件的配合下,通過USB接口實現(xiàn)與嵌入式系統(tǒng)的交互,完成對NAND Flash存儲器的初始化、數(shù)據(jù)寫入、狀態(tài)維護、數(shù)據(jù)下載、數(shù)據(jù)刪除等功能。為方便用戶定位數(shù)據(jù),上位機軟件可以通過文件屬性翻譯相關(guān)信息,以數(shù)據(jù)起始時間和結(jié)束時間來表示具體數(shù)據(jù)段,方便用戶定位具體的關(guān)鍵數(shù)據(jù),進行刪除、下載等操作,其實際的應(yīng)用界面如圖3所示。在實際的應(yīng)用中,還必須考慮壞塊管理以及文件導(dǎo)出和刪除等的設(shè)計,具體的實現(xiàn)這里不再詳述。
圖3 數(shù)據(jù)導(dǎo)出與數(shù)據(jù)編輯界面
為了驗證該分區(qū)設(shè)計思想,按照某型裝備傳動系統(tǒng)的測試控制、狀態(tài)監(jiān)測及故障診斷節(jié)點的設(shè)計要求,采用同樣的硬件系統(tǒng)(如圖2所示)設(shè)計了車載數(shù)據(jù)存儲記錄裝置進行實驗驗證。主要包括以下幾個方面:1)數(shù)據(jù)可選性,主要驗證是否可以通過文件屬性的元素表征不同的文件,選取指定的文件進行導(dǎo)出、刪除等;2)數(shù)據(jù)使用效率比較;主要目的是看使用該思想后,對于目標(biāo)數(shù)據(jù)導(dǎo)出所用的時間,以及后續(xù)數(shù)據(jù)處理時數(shù)據(jù)檢索和處理的效率;3)嵌入式系統(tǒng)執(zhí)行效率比較,主要目的是驗證嵌入式系統(tǒng)對數(shù)據(jù)存儲的完整性、實時性、正確性;4)NAND Flash存儲器使用的均衡性,主要目的是看是否達到NAND Flash存儲器空間的均衡使用,進而達到延長其壽命的目的;5)軟件設(shè)計的方便性,主要是驗證軟件實現(xiàn)的復(fù)雜程度。
在同樣的硬件系統(tǒng)平臺上,在CodeWarrior5.0開發(fā)環(huán)境下設(shè)計開發(fā)了FAT文件管理系統(tǒng)、不分區(qū)數(shù)據(jù)直接存儲以及采用本文所述的分區(qū)管理思想等三種數(shù)據(jù)存儲管理模式,經(jīng)多次的實驗室驗證和實際的裝車使用,采用本文所述的分區(qū)管理思想設(shè)計的車載數(shù)據(jù)存儲記錄裝置能夠通過
對文件屬性翻譯,直觀地表征出不同時間段的數(shù)據(jù),并可任意選擇不同的文件進行導(dǎo)出、刪除等操作,其數(shù)據(jù)使用效率明顯優(yōu)于直接存儲的方式,并能夠?qū)崿F(xiàn)存儲空間的均衡使用個,所存儲的數(shù)據(jù)在完整性、實時性、正確性等方面完全滿足實際使用要求,更值得一提的是軟件設(shè)計容易實現(xiàn),占用系統(tǒng)資源少。實驗結(jié)果表明,該分區(qū)設(shè)計思想實現(xiàn)簡單,用戶使用方便,滿足實際工程使用的需要。
本文提出的大容量NAND Flash存儲器分區(qū)設(shè)計思想,其關(guān)鍵技術(shù)特點在于通過文件屬性數(shù)據(jù)結(jié)構(gòu)的設(shè)計和動態(tài)維護的算法,模擬了文件管理系統(tǒng),實現(xiàn)了對大容量NAND Flash存儲器的數(shù)據(jù)存儲管理和均衡使用。該設(shè)計思想對嵌入式系統(tǒng)性能資源要求低、軟件編程簡單、實現(xiàn)效率高,提供一條解決大容量存儲器在嵌入式系統(tǒng)中應(yīng)用的簡捷途徑,在實際的應(yīng)用中取得了良好的效果,具有廣泛的推廣應(yīng)用價值。