《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于Flash的關鍵變量容錯存儲技術研究
基于Flash的關鍵變量容錯存儲技術研究
2014年電子技術應用第11期
龔雪容1,劉根賢2,生擁宏1
1.解放軍信息工程大學,河南 鄭州450004; 2.清華大學 計算機科學與技術系,北京100084
摘要: 嵌入式系統(tǒng)中往往需要保存少量復位或掉電后依賴的關鍵變量,利用處理器片內Flash存儲參數已經成為常規(guī)選擇,但與常規(guī)Flash存儲器件相比,片內Flash擦除次數更為有限,難以滿足系統(tǒng)生命周期要求。研究了如何延長微處理器片內Flash使用壽命以及關鍵系統(tǒng)變量容錯存儲技術,針對典型嵌入式系統(tǒng)應用,分析Flash擦寫管理機制,基于寫磨損均衡算法進行改良,進一步提升系統(tǒng)容錯能力。該技術在基于STM32單片機硬件平臺進行了測試驗證。
中圖分類號: TP368.1
文獻標識碼: A
文章編號: 0258-7998(2014)11-0009-03
Research on parameters fault tolerant storage technologies based on Flash
Gong Xuerong1,Liu Genxian2,Sheng Yonghong1
1.PLA Information Engineering University,Zhengzhou 450004,China;2.Department of Computer Science and Technology,Tsinghua University,Beijing 100084,China
Abstract: Some key variables should be preserved in embedded system after reset or power-down. It is a routine that those parameters are stored in processor chip memory. However, comparing with the off-chip Flash memory device, the in-chip Flash is limited in numbers of erasing. It will be a defect of short endurance. This paper studies how to extend the life of the Flash in microprocessor chip, and fault tolerant storage technologies for critical system variables. For a typical application for embedded systems, Flash management mechanism is researched by refining the existing wear-leveling algorithms to enhance the performance. The technology is verified on STM32 platforms.
Key words : micro processor;Flash;fault tolerant;embedded system

0 引言

  在嵌入式系統(tǒng)設計中,經常需要存儲一些關鍵參數,系統(tǒng)在復位或掉電后依賴于保存的這些參數才能正常運行。這些數據通常保存在EEPROM存儲器中。隨著半導體技術發(fā)展,基于Flash技術的單片機越來越多,片內集成的Flash容量也越來越大,處理器片內存儲數據已經成為常規(guī)選擇,不僅可以節(jié)約成本,也可以起到較好的保密作用。

  保存數據需要考慮產品生命周期內存儲器件的讀寫次數,EEPROM可以承受百萬次數量級的擦除/寫入操作,NOR Flash存儲器擦寫次數可達10萬次。而微處理器片內集成的Flash相對獨立存儲器件擦除次數會可能更少,利用片內Flash存儲關鍵參數具有一定風險。因此如何延長片內Flash使用壽命,成為一個研究熱點。

  本文針對基于Flash技術的嵌入式微處理器設計了一種關鍵參數容錯存儲方案,利用大容量Flash以及容錯編碼來確保數據的可靠以及延長Flash擦除和寫操作壽命。本文首先介紹基于寫均衡原理的Flash擦除設計,基于冗余存儲和糾錯編碼的容錯設計,集成寫均衡的容錯存儲,最后在STM32F103硬件平臺進行驗證[1]。

1 片內Flash擦寫延壽

  參數保存的一般方式是為每個參數分配固定的存儲地址,可以相互獨立進行訪問。由于Flash在進行寫操作時需要先擦除數據所在的整個扇區(qū),故對一個參數進行寫操作便會造成對扇區(qū)內其他參數的擦除。由于擦除操作耗時較長,需要考慮對系統(tǒng)實時性的影響,而且為了避免丟失其他參數,對微處理器RAM容量也有一定的要求,至少能保存一個扇區(qū)數據內容。

  通過在Flash上建立多個數據塊,避免對Flash單個扇區(qū)的反復擦除,同時通過數據讀寫方法的設計和數據塊的管理,避免對Flash扇區(qū)的不必要擦除,提高Flash的使用壽命,這就是寫均衡算法的基本原理。

  寫均衡算法可以分為靜態(tài)寫均衡與動態(tài)寫均衡兩種類型。靜態(tài)寫均衡主要針對只讀數據和極少被更新的數據,算法會強行搬移這些數據到擦寫次數相對較多的的塊中去。該類算法優(yōu)點是可以有效增加可靠性和使用壽命,缺點是會造成寫入數據的速度下降,而且可能會造成額外的不必要的擦除操作。動態(tài)寫均衡則只限于未使用的空間和經常被更新的數據(即動態(tài)數據)。該類算法每次把要寫入的數據寫入到擦寫次數最少的塊中去,這樣就達到了使寫Flash各個塊的擦寫次數近似相等的目的。

  動態(tài)寫均衡算法用備用區(qū)塊列表中的塊替換舊的塊。當系統(tǒng)準備改寫某個數據塊時,備用區(qū)塊列表中的第一個塊將被用于替換該塊,該塊將被擦除并放入備用區(qū)塊列表。動態(tài)寫均衡中區(qū)塊和頁的更新與回收只發(fā)生在空前或者被經常更新的數據占用的塊上。如果系統(tǒng)持續(xù)對某個塊寫入數據,將頻繁使用備用區(qū)塊,不使用其它數據塊。如果所有備用區(qū)塊比其它塊更早磨損,將會出現(xiàn)最差的情況。

  具體實現(xiàn)時,首先根據嵌入式系統(tǒng)的應用需求和MCU內部數據Flash的容量大小,合理設置數據塊大小和個數,將數據Flash的若干頁面劃分為多個數據塊[2]。在每個數據塊設置塊狀態(tài)字,反映數據塊的存儲歷史時間,不同數據塊存儲數據不同運行時間的拷貝,當前數據塊存儲最新的數據拷貝;同時需要檢查數據狀態(tài)是否為下次數據存儲擦除頁面。

  假設一個需要存儲64 B參數的系統(tǒng),每天需要更新參數1 000 次,而片內Flash可以承受10萬次擦除/寫入循環(huán),即每個單元可以擦除并編程 100 000 次。那么如果不使用寫均衡技術,100天就接近Flash的使用壽命。

001.jpg

  而如圖1所示,采用簡單的寫均衡處理,假設產品有10年生命周期,設頁面大小為2 KB,由:

  ZU7XA[JZ0D@@8}5@}2K]$IP.png

  則n=12,即只需要12個2 KB頁面,循環(huán)存儲64 B參數,就可以滿足10年產品生命周期內擦寫次數要求。

2 片內Flash容錯存儲

  關鍵參數容錯存儲的常規(guī)方法主要通過數據多次備份。例如常用的三模冗余(Triple Modular Redundancy,TMR)方法,即對需要保存的參數存儲3次,讀出時兩兩進行比較,以比較結果來決定記錄結果正確與否。只有當至少兩個記錄結果相同時,系統(tǒng)才能以此為正確參數,否則給出出錯信號。通過多次存儲能有效地避免單次記錄可能造成的錯誤,并能有效地彌補存儲器因部分單元物理損壞而造成的數據記錄結果錯誤,提高系統(tǒng)的可靠性。

  讀出操作需要校驗數據有效性,有多種方法可以驗證數據被正確寫入,例如在完成寫操作后,寫入完成標志到數據塊特定位置,這個標志可以用于在電源恢復后判斷上次寫入是否正常完成,如果沒有就需要采取適當的操作。

  2.1 數據多頁冗余存儲

  由于片內Flash只能按頁面擦除,對一個數據進行寫操作同樣會造成對頁面內其他數據的擦除,對微處理器的RAM容量也有一定的要求,至少能保存讀出一個頁面數據。如果寫入數據失敗,會造成所寫入數據的丟失,如果在擦除頁面后發(fā)生掉電,便會造成頁面內所有數據的丟失。為了解決這一問題,本文設計了多頁冗余存儲模式。該模式在進行存儲寫操作時,并非跟隨上次存儲地址在頁面內連續(xù)存儲,而是在另一個頁面內執(zhí)行寫操作。這樣不僅當前參數數據被完整保存,而之前的參數也被完整保存在不同的頁面,可以根據需要選擇相應頁面數,這就是n′。

002.jpg

  如圖2所示,n′=16,第一次數據存儲在Page0,而下次存儲在Page1,依次存儲在不同頁面,而在需要執(zhí)行擦除操作時,從時間距離上也是擦除最早存儲地數據頁面,例如當存儲到Page15, 需要擦除地是最早存儲的頁面Page0。

  2.2 數據冗余和編碼糾錯

  參數的容錯存儲另一種重要方法是數據糾錯編碼和校驗編碼。讀取數據后根據校驗編碼是否正確以判定有無錯誤。當發(fā)現(xiàn)錯誤時,按編碼規(guī)則確定錯誤所在位置并予以糾正。實現(xiàn)時需要根據硬件平臺設計合理的編碼方式。

003.jpg

  一種較為簡單有效的冗余糾錯校驗編碼如圖3所示。P0為4 B原始數據,~P0為4 B補碼,CRC32為前面12 B的循環(huán)校驗碼。

3 包含容錯特性的寫均衡設計


004.jpg

  根據前面寫均衡延長Flash擦除壽命以及數據冗余存儲,編碼糾錯原理,結合兩者設計包含容錯特性的寫均衡存儲方案。如圖4所示。根據微處理器的性能、實時性需求,可用于數據存儲的Flash容量大小,選擇合理的M、N(M為一個頁面中可以存放的整個需要保存的參數表的個數,N為冗余個數)。

  每個參數數據塊包含所有需要保存的參數,以及重要參數的糾錯編碼,數據校驗碼,用于判斷最新有效參數的數據塊流水號,數據塊寫入標志。保存時,需要先完成糾錯編碼、校驗編碼,寫入指定的當前存儲地址。更新該地址指針,指向下一個存儲地址,該地址為:

  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能力,不僅可以用來存儲程序,也可以用于存儲數據。

  在一個基于STM32F103單片機的設備設計中,需要存儲一組參數以及操作記錄,參數總字節(jié)數56 B,采用容錯存儲,操作記錄僅作為流水記錄,在數據存儲區(qū)循環(huán)記錄。設計了一組函數實現(xiàn)容錯存儲:(1)存儲結構初始化函數;(2)編碼存儲函數;(3)校驗讀操作函數。

005.jpg

  初始化函數流程如圖5所示。初始化函數實現(xiàn)系統(tǒng)加電或復位后的狀態(tài)恢復,系統(tǒng)需要能夠再次正確找到最新的參數數據塊地址。函數在容錯存儲區(qū),從后往前按塊大小搜索數據標志并判斷數據完整性,直到找到存儲數據塊,返回數據塊地址。

  讀操作實現(xiàn)參數讀取,數據校驗糾錯功能。由于STM32F103集成CRC32,因此選擇CRC32作為檢錯函數,減少因增加校驗算法帶來的延遲。讀函數根據數據塊地址讀取數據塊,分別計算各自的CRC32校驗碼,使用CRC32校驗算法再確認冗余存儲的反相數據的正確性,校驗正確則返回相應數據[4]。

  編碼存儲函數實現(xiàn)數據存儲功能,為了減少寫操作次數,寫之前比較要保存的數據與當前已經存儲地參數是否有變化,無變化則直接返回,否則寫入當前存儲地址,并更新該地址到下一數據塊地址。

  為了測試系統(tǒng)參數儲存設計,增加了流水日志方式存儲每次參數存儲的塊地址。在測試過程中多次人為造成掉電復位,地址記錄統(tǒng)計顯示系統(tǒng)完好地恢復參數,參數寫操作均勻地分布在容錯數據區(qū)[5]。

5 結論

  利用微處理器片內Flash存儲系統(tǒng)參數,片內Flash存在必須按塊擦除、寫壽命有限的問題。通過合理設計寫均衡算法,以空間換壽命,同時利用多塊存儲以及編碼糾錯實現(xiàn)容錯儲存,可以有效解決寫壽命和可靠性問題。實際應用也證明,這種存儲方式無論硬件設計還是系統(tǒng)成本都易于接受,可以保證參數在設計的生命周期許可范圍內,確保系統(tǒng)有較強的容錯能力,提高控制系統(tǒng)的運行可靠性。該方法對于需要保存參數的單片機系統(tǒng),如智能儀表、運動控制等領域的系統(tǒng)具有較高的應用價值。

  參考文獻

  [1] 鄭文靜,李明強,舒繼武.Flash存儲技術[J].計算機研究與發(fā)展,2010,47(4):716-726.

  [2] 劉源楊,馬建輝,莊汝科,等.基于嵌入式MCU數據Flash的數據存儲及管理方法研究與實現(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.


此內容為AET網站原創(chuàng),未經授權禁止轉載。