文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2014)11-0009-03
0 引言
在嵌入式系統(tǒng)設(shè)計(jì)中,,經(jīng)常需要存儲(chǔ)一些關(guān)鍵參數(shù),,系統(tǒng)在復(fù)位或掉電后依賴于保存的這些參數(shù)才能正常運(yùn)行。這些數(shù)據(jù)通常保存在EEPROM存儲(chǔ)器中,。隨著半導(dǎo)體技術(shù)發(fā)展,,基于Flash技術(shù)的單片機(jī)越來越多,片內(nèi)集成的Flash容量也越來越大,,處理器片內(nèi)存儲(chǔ)數(shù)據(jù)已經(jīng)成為常規(guī)選擇,,不僅可以節(jié)約成本,也可以起到較好的保密作用,。
保存數(shù)據(jù)需要考慮產(chǎn)品生命周期內(nèi)存儲(chǔ)器件的讀寫次數(shù),,EEPROM可以承受百萬(wàn)次數(shù)量級(jí)的擦除/寫入操作,NOR Flash存儲(chǔ)器擦寫次數(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ò)編碼來確保數(shù)據(jù)的可靠以及延長(zhǎng)Flash擦除和寫操作壽命,。本文首先介紹基于寫均衡原理的Flash擦除設(shè)計(jì),,基于冗余存儲(chǔ)和糾錯(cuò)編碼的容錯(cuò)設(shè)計(jì),集成寫均衡的容錯(cuò)存儲(chǔ),,最后在STM32F103硬件平臺(tái)進(jìn)行驗(yàn)證[1],。
1 片內(nèi)Flash擦寫延壽
參數(shù)保存的一般方式是為每個(gè)參數(shù)分配固定的存儲(chǔ)地址,可以相互獨(dú)立進(jìn)行訪問,。由于Flash在進(jìn)行寫操作時(shí)需要先擦除數(shù)據(jù)所在的整個(gè)扇區(qū),,故對(duì)一個(gè)參數(shù)進(jìn)行寫操作便會(huì)造成對(duì)扇區(qū)內(nèi)其他參數(shù)的擦除。由于擦除操作耗時(shí)較長(zhǎng),,需要考慮對(duì)系統(tǒng)實(shí)時(shí)性的影響,,而且為了避免丟失其他參數(shù),對(duì)微處理器RAM容量也有一定的要求,,至少能保存一個(gè)扇區(qū)數(shù)據(jù)內(nèi)容,。
通過在Flash上建立多個(gè)數(shù)據(jù)塊,,避免對(duì)Flash單個(gè)扇區(qū)的反復(fù)擦除,同時(shí)通過數(shù)據(jù)讀寫方法的設(shè)計(jì)和數(shù)據(jù)塊的管理,,避免對(duì)Flash扇區(qū)的不必要擦除,,提高Flash的使用壽命,這就是寫均衡算法的基本原理,。
寫均衡算法可以分為靜態(tài)寫均衡與動(dòng)態(tài)寫均衡兩種類型,。靜態(tài)寫均衡主要針對(duì)只讀數(shù)據(jù)和極少被更新的數(shù)據(jù),算法會(huì)強(qiáng)行搬移這些數(shù)據(jù)到擦寫次數(shù)相對(duì)較多的的塊中去,。該類算法優(yōu)點(diǎn)是可以有效增加可靠性和使用壽命,,缺點(diǎn)是會(huì)造成寫入數(shù)據(jù)的速度下降,而且可能會(huì)造成額外的不必要的擦除操作,。動(dòng)態(tài)寫均衡則只限于未使用的空間和經(jīng)常被更新的數(shù)據(jù)(即動(dòng)態(tài)數(shù)據(jù)),。該類算法每次把要寫入的數(shù)據(jù)寫入到擦寫次數(shù)最少的塊中去,這樣就達(dá)到了使寫Flash各個(gè)塊的擦寫次數(shù)近似相等的目的,。
動(dòng)態(tài)寫均衡算法用備用區(qū)塊列表中的塊替換舊的塊,。當(dāng)系統(tǒng)準(zhǔn)備改寫某個(gè)數(shù)據(jù)塊時(shí),備用區(qū)塊列表中的第一個(gè)塊將被用于替換該塊,,該塊將被擦除并放入備用區(qū)塊列表,。動(dòng)態(tài)寫均衡中區(qū)塊和頁(yè)的更新與回收只發(fā)生在空前或者被經(jīng)常更新的數(shù)據(jù)占用的塊上。如果系統(tǒng)持續(xù)對(duì)某個(gè)塊寫入數(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)次擦除/寫入循環(huán),,即每個(gè)單元可以擦除并編程 100 000 次。那么如果不使用寫均衡技術(shù),,100天就接近Flash的使用壽命,。
而如圖1所示,,采用簡(jiǎn)單的寫均衡處理,假設(shè)產(chǎn)品有10年生命周期,,設(shè)頁(yè)面大小為2 KB,,由:
則n=12,即只需要12個(gè)2 KB頁(yè)面,,循環(huán)存儲(chǔ)64 B參數(shù),,就可以滿足10年產(chǎn)品生命周期內(nèi)擦寫次數(shù)要求。
2 片內(nèi)Flash容錯(cuò)存儲(chǔ)
關(guān)鍵參數(shù)容錯(cuò)存儲(chǔ)的常規(guī)方法主要通過數(shù)據(jù)多次備份,。例如常用的三模冗余(Triple Modular Redundancy,,TMR)方法,即對(duì)需要保存的參數(shù)存儲(chǔ)3次,,讀出時(shí)兩兩進(jìn)行比較,,以比較結(jié)果來決定記錄結(jié)果正確與否。只有當(dāng)至少兩個(gè)記錄結(jié)果相同時(shí),,系統(tǒng)才能以此為正確參數(shù),否則給出出錯(cuò)信號(hào),。通過多次存儲(chǔ)能有效地避免單次記錄可能造成的錯(cuò)誤,,并能有效地彌補(bǔ)存儲(chǔ)器因部分單元物理?yè)p壞而造成的數(shù)據(jù)記錄結(jié)果錯(cuò)誤,提高系統(tǒng)的可靠性,。
讀出操作需要校驗(yàn)數(shù)據(jù)有效性,,有多種方法可以驗(yàn)證數(shù)據(jù)被正確寫入,例如在完成寫操作后,,寫入完成標(biāo)志到數(shù)據(jù)塊特定位置,,這個(gè)標(biāo)志可以用于在電源恢復(fù)后判斷上次寫入是否正常完成,如果沒有就需要采取適當(dāng)?shù)牟僮鳌?/p>
2.1 數(shù)據(jù)多頁(yè)冗余存儲(chǔ)
由于片內(nèi)Flash只能按頁(yè)面擦除,,對(duì)一個(gè)數(shù)據(jù)進(jìn)行寫操作同樣會(huì)造成對(duì)頁(yè)面內(nèi)其他數(shù)據(jù)的擦除,,對(duì)微處理器的RAM容量也有一定的要求,至少能保存讀出一個(gè)頁(yè)面數(shù)據(jù),。如果寫入數(shù)據(jù)失敗,,會(huì)造成所寫入數(shù)據(jù)的丟失,如果在擦除頁(yè)面后發(fā)生掉電,,便會(huì)造成頁(yè)面內(nèi)所有數(shù)據(jù)的丟失,。為了解決這一問題,本文設(shè)計(jì)了多頁(yè)冗余存儲(chǔ)模式,。該模式在進(jìn)行存儲(chǔ)寫操作時(shí),,并非跟隨上次存儲(chǔ)地址在頁(yè)面內(nèi)連續(xù)存儲(chǔ),而是在另一個(gè)頁(yè)面內(nèi)執(zhí)行寫操作,。這樣不僅當(dāng)前參數(shù)數(shù)據(jù)被完整保存,,而之前的參數(shù)也被完整保存在不同的頁(yè)面,,可以根據(jù)需要選擇相應(yīng)頁(yè)面數(shù),這就是n′,。
如圖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ì)合理的編碼方式,。
一種較為簡(jiǎn)單有效的冗余糾錯(cuò)校驗(yàn)編碼如圖3所示。P0為4 B原始數(shù)據(jù),,~P0為4 B補(bǔ)碼,,CRC32為前面12 B的循環(huán)校驗(yàn)碼。
3 包含容錯(cuò)特性的寫均衡設(shè)計(jì)
根據(jù)前面寫均衡延長(zhǎng)Flash擦除壽命以及數(shù)據(jù)冗余存儲(chǔ),,編碼糾錯(cuò)原理,,結(jié)合兩者設(shè)計(jì)包含容錯(cuò)特性的寫均衡存儲(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ù)塊寫入標(biāo)志。保存時(shí),,需要先完成糾錯(cuò)編碼,、校驗(yàn)編碼,寫入指定的當(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能力,,不僅可以用來存儲(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ù),。
初始化函數(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)算法帶來的延遲,。讀函數(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ǔ)功能,,為了減少寫操作次數(shù),寫之前比較要保存的數(shù)據(jù)與當(dāng)前已經(jīng)存儲(chǔ)地參數(shù)是否有變化,,無(wú)變化則直接返回,,否則寫入當(dāng)前存儲(chǔ)地址,并更新該地址到下一數(shù)據(jù)塊地址,。
為了測(cè)試系統(tǒng)參數(shù)儲(chǔ)存設(shè)計(jì),,增加了流水日志方式存儲(chǔ)每次參數(shù)存儲(chǔ)的塊地址。在測(cè)試過程中多次人為造成掉電復(fù)位,,地址記錄統(tǒng)計(jì)顯示系統(tǒng)完好地恢復(fù)參數(shù),,參數(shù)寫操作均勻地分布在容錯(cuò)數(shù)據(jù)區(qū)[5]。
5 結(jié)論
利用微處理器片內(nèi)Flash存儲(chǔ)系統(tǒng)參數(shù),,片內(nèi)Flash存在必須按塊擦除,、寫壽命有限的問題。通過合理設(shè)計(jì)寫均衡算法,,以空間換壽命,,同時(shí)利用多塊存儲(chǔ)以及編碼糾錯(cuò)實(shí)現(xiàn)容錯(cuò)儲(chǔ)存,可以有效解決寫壽命和可靠性問題,。實(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處理器開發(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.