文獻標識碼: A
文章編號: 0258-7998(2014)11-0009-03
0 引言
在嵌入式系統(tǒng)設計中,經(jīng)常需要存儲一些關鍵參數(shù),系統(tǒng)在復位或掉電后依賴于保存的這些參數(shù)才能正常運行。這些數(shù)據(jù)通常保存在EEPROM存儲器中。隨著半導體技術發(fā)展,基于Flash技術的單片機越來越多,片內(nèi)集成的Flash容量也越來越大,處理器片內(nèi)存儲數(shù)據(jù)已經(jīng)成為常規(guī)選擇,不僅可以節(jié)約成本,也可以起到較好的保密作用。
保存數(shù)據(jù)需要考慮產(chǎn)品生命周期內(nèi)存儲器件的讀寫次數(shù),EEPROM可以承受百萬次數(shù)量級的擦除/寫入操作,NOR Flash存儲器擦寫次數(shù)可達10萬次。而微處理器片內(nèi)集成的Flash相對獨立存儲器件擦除次數(shù)會可能更少,利用片內(nèi)Flash存儲關鍵參數(shù)具有一定風險。因此如何延長片內(nèi)Flash使用壽命,成為一個研究熱點。
本文針對基于Flash技術的嵌入式微處理器設計了一種關鍵參數(shù)容錯存儲方案,利用大容量Flash以及容錯編碼來確保數(shù)據(jù)的可靠以及延長Flash擦除和寫操作壽命。本文首先介紹基于寫均衡原理的Flash擦除設計,基于冗余存儲和糾錯編碼的容錯設計,集成寫均衡的容錯存儲,最后在STM32F103硬件平臺進行驗證[1]。
1 片內(nèi)Flash擦寫延壽
參數(shù)保存的一般方式是為每個參數(shù)分配固定的存儲地址,可以相互獨立進行訪問。由于Flash在進行寫操作時需要先擦除數(shù)據(jù)所在的整個扇區(qū),故對一個參數(shù)進行寫操作便會造成對扇區(qū)內(nèi)其他參數(shù)的擦除。由于擦除操作耗時較長,需要考慮對系統(tǒng)實時性的影響,而且為了避免丟失其他參數(shù),對微處理器RAM容量也有一定的要求,至少能保存一個扇區(qū)數(shù)據(jù)內(nèi)容。
通過在Flash上建立多個數(shù)據(jù)塊,避免對Flash單個扇區(qū)的反復擦除,同時通過數(shù)據(jù)讀寫方法的設計和數(shù)據(jù)塊的管理,避免對Flash扇區(qū)的不必要擦除,提高Flash的使用壽命,這就是寫均衡算法的基本原理。
寫均衡算法可以分為靜態(tài)寫均衡與動態(tài)寫均衡兩種類型。靜態(tài)寫均衡主要針對只讀數(shù)據(jù)和極少被更新的數(shù)據(jù),算法會強行搬移這些數(shù)據(jù)到擦寫次數(shù)相對較多的的塊中去。該類算法優(yōu)點是可以有效增加可靠性和使用壽命,缺點是會造成寫入數(shù)據(jù)的速度下降,而且可能會造成額外的不必要的擦除操作。動態(tài)寫均衡則只限于未使用的空間和經(jīng)常被更新的數(shù)據(jù)(即動態(tài)數(shù)據(jù))。該類算法每次把要寫入的數(shù)據(jù)寫入到擦寫次數(shù)最少的塊中去,這樣就達到了使寫Flash各個塊的擦寫次數(shù)近似相等的目的。
動態(tài)寫均衡算法用備用區(qū)塊列表中的塊替換舊的塊。當系統(tǒng)準備改寫某個數(shù)據(jù)塊時,備用區(qū)塊列表中的第一個塊將被用于替換該塊,該塊將被擦除并放入備用區(qū)塊列表。動態(tài)寫均衡中區(qū)塊和頁的更新與回收只發(fā)生在空前或者被經(jīng)常更新的數(shù)據(jù)占用的塊上。如果系統(tǒng)持續(xù)對某個塊寫入數(shù)據(jù),將頻繁使用備用區(qū)塊,不使用其它數(shù)據(jù)塊。如果所有備用區(qū)塊比其它塊更早磨損,將會出現(xiàn)最差的情況。
具體實現(xiàn)時,首先根據(jù)嵌入式系統(tǒng)的應用需求和MCU內(nèi)部數(shù)據(jù)Flash的容量大小,合理設置數(shù)據(jù)塊大小和個數(shù),將數(shù)據(jù)Flash的若干頁面劃分為多個數(shù)據(jù)塊[2]。在每個數(shù)據(jù)塊設置塊狀態(tài)字,反映數(shù)據(jù)塊的存儲歷史時間,不同數(shù)據(jù)塊存儲數(shù)據(jù)不同運行時間的拷貝,當前數(shù)據(jù)塊存儲最新的數(shù)據(jù)拷貝;同時需要檢查數(shù)據(jù)狀態(tài)是否為下次數(shù)據(jù)存儲擦除頁面。
假設一個需要存儲64 B參數(shù)的系統(tǒng),每天需要更新參數(shù)1 000 次,而片內(nèi)Flash可以承受10萬次擦除/寫入循環(huán),即每個單元可以擦除并編程 100 000 次。那么如果不使用寫均衡技術,100天就接近Flash的使用壽命。
而如圖1所示,采用簡單的寫均衡處理,假設產(chǎn)品有10年生命周期,設頁面大小為2 KB,由:
則n=12,即只需要12個2 KB頁面,循環(huán)存儲64 B參數(shù),就可以滿足10年產(chǎn)品生命周期內(nèi)擦寫次數(shù)要求。
2 片內(nèi)Flash容錯存儲
關鍵參數(shù)容錯存儲的常規(guī)方法主要通過數(shù)據(jù)多次備份。例如常用的三模冗余(Triple Modular Redundancy,TMR)方法,即對需要保存的參數(shù)存儲3次,讀出時兩兩進行比較,以比較結果來決定記錄結果正確與否。只有當至少兩個記錄結果相同時,系統(tǒng)才能以此為正確參數(shù),否則給出出錯信號。通過多次存儲能有效地避免單次記錄可能造成的錯誤,并能有效地彌補存儲器因部分單元物理損壞而造成的數(shù)據(jù)記錄結果錯誤,提高系統(tǒng)的可靠性。
讀出操作需要校驗數(shù)據(jù)有效性,有多種方法可以驗證數(shù)據(jù)被正確寫入,例如在完成寫操作后,寫入完成標志到數(shù)據(jù)塊特定位置,這個標志可以用于在電源恢復后判斷上次寫入是否正常完成,如果沒有就需要采取適當?shù)牟僮鳌?/p>
2.1 數(shù)據(jù)多頁冗余存儲
由于片內(nèi)Flash只能按頁面擦除,對一個數(shù)據(jù)進行寫操作同樣會造成對頁面內(nèi)其他數(shù)據(jù)的擦除,對微處理器的RAM容量也有一定的要求,至少能保存讀出一個頁面數(shù)據(jù)。如果寫入數(shù)據(jù)失敗,會造成所寫入數(shù)據(jù)的丟失,如果在擦除頁面后發(fā)生掉電,便會造成頁面內(nèi)所有數(shù)據(jù)的丟失。為了解決這一問題,本文設計了多頁冗余存儲模式。該模式在進行存儲寫操作時,并非跟隨上次存儲地址在頁面內(nèi)連續(xù)存儲,而是在另一個頁面內(nèi)執(zhí)行寫操作。這樣不僅當前參數(shù)數(shù)據(jù)被完整保存,而之前的參數(shù)也被完整保存在不同的頁面,可以根據(jù)需要選擇相應頁面數(shù),這就是n′。
如圖2所示,n′=16,第一次數(shù)據(jù)存儲在Page0,而下次存儲在Page1,依次存儲在不同頁面,而在需要執(zhí)行擦除操作時,從時間距離上也是擦除最早存儲地數(shù)據(jù)頁面,例如當存儲到Page15, 需要擦除地是最早存儲的頁面Page0。
2.2 數(shù)據(jù)冗余和編碼糾錯
參數(shù)的容錯存儲另一種重要方法是數(shù)據(jù)糾錯編碼和校驗編碼。讀取數(shù)據(jù)后根據(jù)校驗編碼是否正確以判定有無錯誤。當發(fā)現(xiàn)錯誤時,按編碼規(guī)則確定錯誤所在位置并予以糾正。實現(xiàn)時需要根據(jù)硬件平臺設計合理的編碼方式。
一種較為簡單有效的冗余糾錯校驗編碼如圖3所示。P0為4 B原始數(shù)據(jù),~P0為4 B補碼,CRC32為前面12 B的循環(huán)校驗碼。
3 包含容錯特性的寫均衡設計
根據(jù)前面寫均衡延長Flash擦除壽命以及數(shù)據(jù)冗余存儲,編碼糾錯原理,結合兩者設計包含容錯特性的寫均衡存儲方案。如圖4所示。根據(jù)微處理器的性能、實時性需求,可用于數(shù)據(jù)存儲的Flash容量大小,選擇合理的M、N(M為一個頁面中可以存放的整個需要保存的參數(shù)表的個數(shù),N為冗余個數(shù))。
每個參數(shù)數(shù)據(jù)塊包含所有需要保存的參數(shù),以及重要參數(shù)的糾錯編碼,數(shù)據(jù)校驗碼,用于判斷最新有效參數(shù)的數(shù)據(jù)塊流水號,數(shù)據(jù)塊寫入標志。保存時,需要先完成糾錯編碼、校驗編碼,寫入指定的當前存儲地址。更新該地址指針,指向下一個存儲地址,該地址為:
nParAddr=BaseAddr+n×(M×PARSIZE)+m×PARSIZE
(2)
式中:m=0,1,2…M-1,n=0,1,2…N-1。
4 功能驗證
STM32系列單片機是一種典型的基于Flash技術的主流微處理器,其片內(nèi)集成Flash容量從16 KB~1 MB不等,128 KB以下頁面大小為1 KB,而128 KB以上頁面大小為2 KB[3]。片內(nèi)Flash都有IAP能力,不僅可以用來存儲程序,也可以用于存儲數(shù)據(jù)。
在一個基于STM32F103單片機的設備設計中,需要存儲一組參數(shù)以及操作記錄,參數(shù)總字節(jié)數(shù)56 B,采用容錯存儲,操作記錄僅作為流水記錄,在數(shù)據(jù)存儲區(qū)循環(huán)記錄。設計了一組函數(shù)實現(xiàn)容錯存儲:(1)存儲結構初始化函數(shù);(2)編碼存儲函數(shù);(3)校驗讀操作函數(shù)。
初始化函數(shù)流程如圖5所示。初始化函數(shù)實現(xiàn)系統(tǒng)加電或復位后的狀態(tài)恢復,系統(tǒng)需要能夠再次正確找到最新的參數(shù)數(shù)據(jù)塊地址。函數(shù)在容錯存儲區(qū),從后往前按塊大小搜索數(shù)據(jù)標志并判斷數(shù)據(jù)完整性,直到找到存儲數(shù)據(jù)塊,返回數(shù)據(jù)塊地址。
讀操作實現(xiàn)參數(shù)讀取,數(shù)據(jù)校驗糾錯功能。由于STM32F103集成CRC32,因此選擇CRC32作為檢錯函數(shù),減少因增加校驗算法帶來的延遲。讀函數(shù)根據(jù)數(shù)據(jù)塊地址讀取數(shù)據(jù)塊,分別計算各自的CRC32校驗碼,使用CRC32校驗算法再確認冗余存儲的反相數(shù)據(jù)的正確性,校驗正確則返回相應數(shù)據(jù)[4]。
編碼存儲函數(shù)實現(xiàn)數(shù)據(jù)存儲功能,為了減少寫操作次數(shù),寫之前比較要保存的數(shù)據(jù)與當前已經(jīng)存儲地參數(shù)是否有變化,無變化則直接返回,否則寫入當前存儲地址,并更新該地址到下一數(shù)據(jù)塊地址。
為了測試系統(tǒng)參數(shù)儲存設計,增加了流水日志方式存儲每次參數(shù)存儲的塊地址。在測試過程中多次人為造成掉電復位,地址記錄統(tǒng)計顯示系統(tǒng)完好地恢復參數(shù),參數(shù)寫操作均勻地分布在容錯數(shù)據(jù)區(qū)[5]。
5 結論
利用微處理器片內(nèi)Flash存儲系統(tǒng)參數(shù),片內(nèi)Flash存在必須按塊擦除、寫壽命有限的問題。通過合理設計寫均衡算法,以空間換壽命,同時利用多塊存儲以及編碼糾錯實現(xiàn)容錯儲存,可以有效解決寫壽命和可靠性問題。實際應用也證明,這種存儲方式無論硬件設計還是系統(tǒng)成本都易于接受,可以保證參數(shù)在設計的生命周期許可范圍內(nèi),確保系統(tǒng)有較強的容錯能力,提高控制系統(tǒng)的運行可靠性。該方法對于需要保存參數(shù)的單片機系統(tǒng),如智能儀表、運動控制等領域的系統(tǒng)具有較高的應用價值。
參考文獻
[1] 鄭文靜,李明強,舒繼武.Flash存儲技術[J].計算機研究與發(fā)展,2010,47(4):716-726.
[2] 劉源楊,馬建輝,莊汝科,等.基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲及管理方法研究與實現(xiàn)[J].電子產(chǎn)品世界,2013(10):57-60.
[3] 李寧.基于MDK的STM32處理器開發(fā)應用[M].北京:北京航空航天大學出版社,2008.
[4] 康旺,張有光,金令旭,等.Flash存儲中的糾錯編碼[J].北京航空航天大學學報,2012,38(9):1176-1180.
[5] 陳峰,尹寒.嵌入式系統(tǒng)中的Flash存儲管理[J].單片機與嵌入式系統(tǒng)應用,2003(2):19-21,25.