《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Flash的關(guān)鍵變量容錯(cuò)存儲(chǔ)技術(shù)研究
基于Flash的關(guān)鍵變量容錯(cuò)存儲(chǔ)技術(shù)研究
2014年電子技術(shù)應(yīng)用第11期
龔雪容1,劉根賢2,生擁宏1
1.解放軍信息工程大學(xué),河南 鄭州450004; 2.清華大學(xué) 計(jì)算機(jī)科學(xué)與技術(shù)系,北京100084
摘要: 嵌入式系統(tǒng)中往往需要保存少量復(fù)位或掉電后依賴(lài)的關(guān)鍵變量,利用處理器片內(nèi)Flash存儲(chǔ)參數(shù)已經(jīng)成為常規(guī)選擇,但與常規(guī)Flash存儲(chǔ)器件相比,片內(nèi)Flash擦除次數(shù)更為有限,難以滿足系統(tǒng)生命周期要求。研究了如何延長(zhǎng)微處理器片內(nèi)Flash使用壽命以及關(guān)鍵系統(tǒng)變量容錯(cuò)存儲(chǔ)技術(shù),針對(duì)典型嵌入式系統(tǒng)應(yīng)用,分析Flash擦寫(xiě)管理機(jī)制,基于寫(xiě)磨損均衡算法進(jìn)行改良,進(jìn)一步提升系統(tǒng)容錯(cuò)能力。該技術(shù)在基于STM32單片機(jī)硬件平臺(tái)進(jìn)行了測(cè)試驗(yàn)證。
中圖分類(lèi)號(hào): TP368.1
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 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)設(shè)計(jì)中,經(jīng)常需要存儲(chǔ)一些關(guān)鍵參數(shù),系統(tǒng)在復(fù)位或掉電后依賴(lài)于保存的這些參數(shù)才能正常運(yùn)行。這些數(shù)據(jù)通常保存在EEPROM存儲(chǔ)器中。隨著半導(dǎo)體技術(shù)發(fā)展,基于Flash技術(shù)的單片機(jī)越來(lái)越多,片內(nèi)集成的Flash容量也越來(lái)越大,處理器片內(nèi)存儲(chǔ)數(shù)據(jù)已經(jīng)成為常規(guī)選擇,不僅可以節(jié)約成本,也可以起到較好的保密作用。

  保存數(shù)據(jù)需要考慮產(chǎn)品生命周期內(nèi)存儲(chǔ)器件的讀寫(xiě)次數(shù),EEPROM可以承受百萬(wàn)次數(shù)量級(jí)的擦除/寫(xiě)入操作,NOR Flash存儲(chǔ)器擦寫(xiě)次數(shù)可達(dá)10萬(wàn)次。而微處理器片內(nèi)集成的Flash相對(duì)獨(dú)立存儲(chǔ)器件擦除次數(shù)會(huì)可能更少,利用片內(nèi)Flash存儲(chǔ)關(guān)鍵參數(shù)具有一定風(fēng)險(xiǎn)。因此如何延長(zhǎng)片內(nèi)Flash使用壽命,成為一個(gè)研究熱點(diǎn)。

  本文針對(duì)基于Flash技術(shù)的嵌入式微處理器設(shè)計(jì)了一種關(guān)鍵參數(shù)容錯(cuò)存儲(chǔ)方案,利用大容量Flash以及容錯(cuò)編碼來(lái)確保數(shù)據(jù)的可靠以及延長(zhǎng)Flash擦除和寫(xiě)操作壽命。本文首先介紹基于寫(xiě)均衡原理的Flash擦除設(shè)計(jì),基于冗余存儲(chǔ)和糾錯(cuò)編碼的容錯(cuò)設(shè)計(jì),集成寫(xiě)均衡的容錯(cuò)存儲(chǔ),最后在STM32F103硬件平臺(tái)進(jìn)行驗(yàn)證[1]。

1 片內(nèi)Flash擦寫(xiě)延壽

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

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

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

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

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

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

001.jpg

  而如圖1所示,采用簡(jiǎn)單的寫(xiě)均衡處理,假設(shè)產(chǎn)品有10年生命周期,設(shè)頁(yè)面大小為2 KB,由:

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

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

2 片內(nèi)Flash容錯(cuò)存儲(chǔ)

  關(guān)鍵參數(shù)容錯(cuò)存儲(chǔ)的常規(guī)方法主要通過(guò)數(shù)據(jù)多次備份。例如常用的三模冗余(Triple Modular Redundancy,TMR)方法,即對(duì)需要保存的參數(shù)存儲(chǔ)3次,讀出時(shí)兩兩進(jìn)行比較,以比較結(jié)果來(lái)決定記錄結(jié)果正確與否。只有當(dāng)至少兩個(gè)記錄結(jié)果相同時(shí),系統(tǒng)才能以此為正確參數(shù),否則給出出錯(cuò)信號(hào)。通過(guò)多次存儲(chǔ)能有效地避免單次記錄可能造成的錯(cuò)誤,并能有效地彌補(bǔ)存儲(chǔ)器因部分單元物理?yè)p壞而造成的數(shù)據(jù)記錄結(jié)果錯(cuò)誤,提高系統(tǒng)的可靠性。

  讀出操作需要校驗(yàn)數(shù)據(jù)有效性,有多種方法可以驗(yàn)證數(shù)據(jù)被正確寫(xiě)入,例如在完成寫(xiě)操作后,寫(xiě)入完成標(biāo)志到數(shù)據(jù)塊特定位置,這個(gè)標(biāo)志可以用于在電源恢復(fù)后判斷上次寫(xiě)入是否正常完成,如果沒(méi)有就需要采取適當(dāng)?shù)牟僮鳌?/p>

  2.1 數(shù)據(jù)多頁(yè)冗余存儲(chǔ)

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

002.jpg

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

  2.2 數(shù)據(jù)冗余和編碼糾錯(cuò)

  參數(shù)的容錯(cuò)存儲(chǔ)另一種重要方法是數(shù)據(jù)糾錯(cuò)編碼和校驗(yàn)編碼。讀取數(shù)據(jù)后根據(jù)校驗(yàn)編碼是否正確以判定有無(wú)錯(cuò)誤。當(dāng)發(fā)現(xiàn)錯(cuò)誤時(shí),按編碼規(guī)則確定錯(cuò)誤所在位置并予以糾正。實(shí)現(xiàn)時(shí)需要根據(jù)硬件平臺(tái)設(shè)計(jì)合理的編碼方式。

003.jpg

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

3 包含容錯(cuò)特性的寫(xiě)均衡設(shè)計(jì)


004.jpg

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

  每個(gè)參數(shù)數(shù)據(jù)塊包含所有需要保存的參數(shù),以及重要參數(shù)的糾錯(cuò)編碼,數(shù)據(jù)校驗(yàn)碼,用于判斷最新有效參數(shù)的數(shù)據(jù)塊流水號(hào),數(shù)據(jù)塊寫(xiě)入標(biāo)志。保存時(shí),需要先完成糾錯(cuò)編碼、校驗(yàn)編碼,寫(xiě)入指定的當(dāng)前存儲(chǔ)地址。更新該地址指針,指向下一個(gè)存儲(chǔ)地址,該地址為:

  nParAddr=BaseAddr+n×(M×PARSIZE)+m×PARSIZE

  (2)

  式中:m=0,1,2…M-1,n=0,1,2…N-1。

4 功能驗(yàn)證

  STM32系列單片機(jī)是一種典型的基于Flash技術(shù)的主流微處理器,其片內(nèi)集成Flash容量從16 KB~1 MB不等,128 KB以下頁(yè)面大小為1 KB,而128 KB以上頁(yè)面大小為2 KB[3]。片內(nèi)Flash都有IAP能力,不僅可以用來(lái)存儲(chǔ)程序,也可以用于存儲(chǔ)數(shù)據(jù)。

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

005.jpg

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

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

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

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

5 結(jié)論

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

  參考文獻(xiàn)

  [1] 鄭文靜,李明強(qiáng),舒繼武.Flash存儲(chǔ)技術(shù)[J].計(jì)算機(jī)研究與發(fā)展,2010,47(4):716-726.

  [2] 劉源楊,馬建輝,莊汝科,等.基于嵌入式MCU數(shù)據(jù)Flash的數(shù)據(jù)存儲(chǔ)及管理方法研究與實(shí)現(xiàn)[J].電子產(chǎn)品世界,2013(10):57-60.

  [3] 李寧.基于MDK的STM32處理器開(kāi)發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2008.

  [4] 康旺,張有光,金令旭,等.Flash存儲(chǔ)中的糾錯(cuò)編碼[J].北京航空航天大學(xué)學(xué)報(bào),2012,38(9):1176-1180.

  [5] 陳峰,尹寒.嵌入式系統(tǒng)中的Flash存儲(chǔ)管理[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2003(2):19-21,25.


此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。