文獻標識碼: A
文章編號: 0258-7998(2014)11-0009-03
0 引言
在嵌入式系統(tǒng)設計中,經常需要存儲一些關鍵參數(shù),,系統(tǒng)在復位或掉電后依賴于保存的這些參數(shù)才能正常運行,。這些數(shù)據(jù)通常保存在EEPROM存儲器中。隨著半導體技術發(fā)展,,基于Flash技術的單片機越來越多,,片內集成的Flash容量也越來越大,處理器片內存儲數(shù)據(jù)已經成為常規(guī)選擇,,不僅可以節(jié)約成本,,也可以起到較好的保密作用,。
保存數(shù)據(jù)需要考慮產品生命周期內存儲器件的讀寫次數(shù),EEPROM可以承受百萬次數(shù)量級的擦除/寫入操作,,NOR Flash存儲器擦寫次數(shù)可達10萬次,。而微處理器片內集成的Flash相對獨立存儲器件擦除次數(shù)會可能更少,利用片內Flash存儲關鍵參數(shù)具有一定風險,。因此如何延長片內Flash使用壽命,,成為一個研究熱點。
本文針對基于Flash技術的嵌入式微處理器設計了一種關鍵參數(shù)容錯存儲方案,,利用大容量Flash以及容錯編碼來確保數(shù)據(jù)的可靠以及延長Flash擦除和寫操作壽命,。本文首先介紹基于寫均衡原理的Flash擦除設計,基于冗余存儲和糾錯編碼的容錯設計,,集成寫均衡的容錯存儲,,最后在STM32F103硬件平臺進行驗證[1]。
1 片內Flash擦寫延壽
參數(shù)保存的一般方式是為每個參數(shù)分配固定的存儲地址,,可以相互獨立進行訪問,。由于Flash在進行寫操作時需要先擦除數(shù)據(jù)所在的整個扇區(qū),故對一個參數(shù)進行寫操作便會造成對扇區(qū)內其他參數(shù)的擦除,。由于擦除操作耗時較長,,需要考慮對系統(tǒng)實時性的影響,而且為了避免丟失其他參數(shù),,對微處理器RAM容量也有一定的要求,,至少能保存一個扇區(qū)數(shù)據(jù)內容。
通過在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)寫均衡則只限于未使用的空間和經常被更新的數(shù)據(jù)(即動態(tài)數(shù)據(jù)),。該類算法每次把要寫入的數(shù)據(jù)寫入到擦寫次數(shù)最少的塊中去,,這樣就達到了使寫Flash各個塊的擦寫次數(shù)近似相等的目的。
動態(tài)寫均衡算法用備用區(qū)塊列表中的塊替換舊的塊,。當系統(tǒng)準備改寫某個數(shù)據(jù)塊時,,備用區(qū)塊列表中的第一個塊將被用于替換該塊,,該塊將被擦除并放入備用區(qū)塊列表。動態(tài)寫均衡中區(qū)塊和頁的更新與回收只發(fā)生在空前或者被經常更新的數(shù)據(jù)占用的塊上,。如果系統(tǒng)持續(xù)對某個塊寫入數(shù)據(jù),,將頻繁使用備用區(qū)塊,不使用其它數(shù)據(jù)塊,。如果所有備用區(qū)塊比其它塊更早磨損,,將會出現(xiàn)最差的情況。
具體實現(xiàn)時,,首先根據(jù)嵌入式系統(tǒng)的應用需求和MCU內部數(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 次,而片內Flash可以承受10萬次擦除/寫入循環(huán),,即每個單元可以擦除并編程 100 000 次,。那么如果不使用寫均衡技術,100天就接近Flash的使用壽命,。
而如圖1所示,,采用簡單的寫均衡處理,假設產品有10年生命周期,,設頁面大小為2 KB,,由:
則n=12,即只需要12個2 KB頁面,,循環(huán)存儲64 B參數(shù),,就可以滿足10年產品生命周期內擦寫次數(shù)要求。
2 片內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ù)多頁冗余存儲
由于片內Flash只能按頁面擦除,,對一個數(shù)據(jù)進行寫操作同樣會造成對頁面內其他數(shù)據(jù)的擦除,對微處理器的RAM容量也有一定的要求,,至少能保存讀出一個頁面數(shù)據(jù),。如果寫入數(shù)據(jù)失敗,會造成所寫入數(shù)據(jù)的丟失,,如果在擦除頁面后發(fā)生掉電,,便會造成頁面內所有數(shù)據(jù)的丟失。為了解決這一問題,,本文設計了多頁冗余存儲模式,。該模式在進行存儲寫操作時,并非跟隨上次存儲地址在頁面內連續(xù)存儲,,而是在另一個頁面內執(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技術的主流微處理器,其片內集成Flash容量從16 KB~1 MB不等,,128 KB以下頁面大小為1 KB,,而128 KB以上頁面大小為2 KB[3]。片內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ù)與當前已經存儲地參數(shù)是否有變化,無變化則直接返回,,否則寫入當前存儲地址,,并更新該地址到下一數(shù)據(jù)塊地址。
為了測試系統(tǒng)參數(shù)儲存設計,,增加了流水日志方式存儲每次參數(shù)存儲的塊地址,。在測試過程中多次人為造成掉電復位,地址記錄統(tǒng)計顯示系統(tǒng)完好地恢復參數(shù),,參數(shù)寫操作均勻地分布在容錯數(shù)據(jù)區(qū)[5],。
5 結論
利用微處理器片內Flash存儲系統(tǒng)參數(shù),片內Flash存在必須按塊擦除,、寫壽命有限的問題,。通過合理設計寫均衡算法,以空間換壽命,同時利用多塊存儲以及編碼糾錯實現(xiàn)容錯儲存,,可以有效解決寫壽命和可靠性問題,。實際應用也證明,這種存儲方式無論硬件設計還是系統(tǒng)成本都易于接受,,可以保證參數(shù)在設計的生命周期許可范圍內,,確保系統(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].電子產品世界,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.