專利名稱:一種可延長(zhǎng)flash使用壽命的數(shù)據(jù)存儲(chǔ)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)存儲(chǔ)方法技術(shù)領(lǐng)域,尤其涉及一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法。
背景技術(shù):
嵌入式系統(tǒng)具有功耗低、便攜等特點(diǎn),常常用于各種工業(yè)產(chǎn)品及民用產(chǎn)品中,如各種工業(yè)生產(chǎn)、消防和安防系統(tǒng)中都用到嵌入式系統(tǒng)。嵌入式系統(tǒng)通常脫離個(gè)人電腦或工業(yè)主機(jī)(如工控機(jī)),自成獨(dú)立系統(tǒng)。由于尺寸要求等原因,嵌入式系統(tǒng)的存儲(chǔ)空間往往有限,又因?yàn)榍度胧较到y(tǒng)常常應(yīng)用于各種安全性要求比較高的場(chǎng)合,因此該系統(tǒng)的數(shù)據(jù)操作可靠性變得十分重要。以嵌入式考勤系統(tǒng)或門禁系統(tǒng)為例,當(dāng)用戶考勤時(shí),如果考勤成功,則系統(tǒng)產(chǎn)生考勤成功記錄,并把考勤記錄存儲(chǔ)于FLASH等非易失性存儲(chǔ)器中,方便日后查詢和考核。另一個(gè)例子是工業(yè)安防系統(tǒng),如分布式光纖振動(dòng)測(cè)量系統(tǒng),系統(tǒng)在線監(jiān)測(cè)時(shí),當(dāng)振動(dòng)事件發(fā)生后,系統(tǒng)通過模式識(shí)別算法判斷,如果判定事件為某一類特定事件,則產(chǎn)生報(bào)警記錄,并把報(bào)警記錄保存于FLASH等非易失性存儲(chǔ)器中,便于將來查詢。上述兩個(gè)嵌入式系統(tǒng)代表了此類系統(tǒng)的應(yīng)用特性,即它們都頻繁產(chǎn)生記錄數(shù)據(jù),并且記錄數(shù)據(jù)都需要保存于FLASH等非易失性存儲(chǔ)器中,而且需要保存相當(dāng)長(zhǎng)一段時(shí)間(比如3個(gè)月)。盡管單個(gè)記錄數(shù)據(jù)量小(只有幾個(gè)到幾十個(gè)字節(jié)),但由于長(zhǎng)時(shí)間保存,因此累積的數(shù)據(jù)量也比較大。FLASH存儲(chǔ)器是一種容量大且價(jià)格低廉的非易失性存儲(chǔ)器,因此,嵌入式系統(tǒng)中通常采用FLASH存儲(chǔ)器來保存數(shù)據(jù),用來存儲(chǔ)數(shù)據(jù)庫(kù)、特征數(shù)據(jù)、操作系統(tǒng)程序及系統(tǒng)產(chǎn)生的各種實(shí)時(shí)記錄等需要掉電保存的數(shù)據(jù)。FLASH—般都分為很多個(gè)SECTOR,每個(gè)SECTOR包括一定數(shù)量的存儲(chǔ)單元。對(duì)于大容量的FLASH,還分為不同的BANK,每個(gè)BANK還包括一定數(shù)目的SECTOR。FLASH的擦除操作一般都是以SECT0R、BANK或者是整片F(xiàn)LASH為單位的。在對(duì)FLASH進(jìn)行寫操作的時(shí)候,每個(gè)B工T可以通過編程由I編為0,但不可以由O修改為I。為了保證寫操作的正確性,在執(zhí)行寫操作前,都要執(zhí)行擦除操作。擦除操作會(huì)把FLASH的一個(gè)SECTOR、一個(gè)BANK或者是整片F(xiàn)LASH的值都修改為OxFF。這樣寫操作才可以正確完成。但是FLASH有其自身缺陷,一是FLASH有擦除次數(shù)(即壽命)限制,一般是10萬次擦除操作,所以不宜對(duì)FLASH進(jìn)行頻繁寫操作。二是FLASH寫操作速度很慢,因?yàn)閷懖僮髑氨仨毾炔脸?,然后再寫,最后?yàn)證,整個(gè)過程速度很慢,因此對(duì)于頻繁產(chǎn)生的實(shí)時(shí)數(shù)據(jù),實(shí)時(shí)將之保存于FLASH也不太適合。FRAM是一種比FLASH更加可靠的存儲(chǔ)器,它的讀寫速度很快,而且?guī)缀鯖]有擦除次數(shù)限制。但是其容量比較小,因而只適合存儲(chǔ)一些數(shù)據(jù)量比較小的數(shù)據(jù),比如幾K的數(shù)據(jù)量。當(dāng)系統(tǒng)必須頻繁或者快速地寫入數(shù)據(jù)時(shí),上述這些優(yōu)點(diǎn)對(duì)于寫操作密集型應(yīng)用的系統(tǒng)來說非常適合,如考勤或報(bào)警記錄的保存正屬于這種應(yīng)用。SDRAM(或者DDR)是一種大容量高速度的存儲(chǔ)器,適合用來運(yùn)行操作系統(tǒng)、算法處理等需要高速運(yùn)行的操作,但SDRAM(或者DDR)是易失性存儲(chǔ)器,即系統(tǒng)掉電后其內(nèi)部數(shù)據(jù)丟失無法恢復(fù)。因此,一般系統(tǒng)上電后,先把操作系統(tǒng)由FLASH自動(dòng)導(dǎo)入到SDRAM中,然后自動(dòng)運(yùn)行操作系統(tǒng)。一般的記錄保存方法是系統(tǒng)產(chǎn)生一條記錄后,把這條記錄寫入FLASH(添加記錄)中。但是,如前所述,每寫一次FLASH,都需要先把要寫入的SECTOR擦除后方可寫入。這種方法的缺陷是FLASH頻繁被擦除,其使用壽命必然大大縮短;而且,擦除操作使得SECTOR里面的舊的數(shù)據(jù)有被丟失的危險(xiǎn)。
發(fā)明內(nèi)容
為了解決現(xiàn)有技術(shù)中存在的問題,本發(fā)明提供一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法,既能實(shí)時(shí)存儲(chǔ)記錄數(shù)據(jù),又可長(zhǎng)期保存大量記錄數(shù)據(jù),同時(shí)又可大大延長(zhǎng)FLASH的使用壽命。 為了達(dá)到上述目的,本發(fā)明采用一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法,所述數(shù)據(jù)存儲(chǔ)方法是利用FLASH、FRAM及SDRAM三部分組合成的數(shù)據(jù)存儲(chǔ)系統(tǒng)完成的,該方法包括以下步驟步驟一系統(tǒng)初始化在系統(tǒng)設(shè)計(jì)時(shí),把FLASH劃分成如特征數(shù)據(jù)區(qū)、記錄數(shù)據(jù)區(qū)、操作系統(tǒng)區(qū)、數(shù)據(jù)庫(kù)區(qū)等多個(gè)空間,每個(gè)區(qū)包括至少一個(gè)SECTOR ;進(jìn)一步的,對(duì)FLASH所有的SECTOR進(jìn)行編號(hào),特別地,保留一個(gè)SECTOR,用來作為數(shù)據(jù)轉(zhuǎn)儲(chǔ)(數(shù)據(jù)備份)區(qū),以進(jìn)行數(shù)據(jù)轉(zhuǎn)儲(chǔ)(數(shù)據(jù)備份)操作;進(jìn)一步的,預(yù)留出能滿足系統(tǒng)設(shè)計(jì)指標(biāo)中的記錄保存時(shí)間的η個(gè)SECTOR作為記錄數(shù)據(jù)保存區(qū),編號(hào)從j+Ι開始到j(luò)+n結(jié)束;進(jìn)一步的,把記錄數(shù)據(jù)區(qū)的每個(gè)SECTOR都劃分為Y個(gè)記錄數(shù)據(jù)塊,依次編號(hào)為1,2,··· , Y-1, Y;在FRAM中開辟一個(gè)記錄數(shù)據(jù)暫存區(qū),一個(gè)數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作的標(biāo)記區(qū)及一個(gè)數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記區(qū);進(jìn)一步的,F(xiàn)RAM中記錄數(shù)據(jù)暫存區(qū)的空間大小為記錄數(shù)據(jù)區(qū)的一個(gè)SECTOR中的一個(gè)記錄數(shù)據(jù)塊的大??;進(jìn)一步的,數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作的標(biāo)記區(qū)存放數(shù)據(jù)轉(zhuǎn)儲(chǔ)標(biāo)記A及發(fā)生轉(zhuǎn)儲(chǔ)操作的FLASH的SECTOR編號(hào)兩個(gè)字節(jié)型的數(shù)據(jù);進(jìn)一步的,數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記區(qū)存放數(shù)據(jù)轉(zhuǎn)移標(biāo)記B、記錄數(shù)據(jù)塊的編號(hào)及發(fā)生轉(zhuǎn)移操作的FLASH的SECTOR編號(hào)三個(gè)字節(jié)型數(shù)據(jù);步驟二 數(shù)據(jù)添加系統(tǒng)把新記錄寫入到FRAM的記錄數(shù)據(jù)暫存區(qū)的尾部,形成舊記錄在前新記錄在后的順序,把記錄逐條保存起來,直至將FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿;步驟三數(shù)據(jù)轉(zhuǎn)移當(dāng)FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿之后,就需要做數(shù)據(jù)轉(zhuǎn)移操作,把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FLASH中,具體操作步驟細(xì)化如下第一步,讀取FRAM中的數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記B、記錄數(shù)據(jù)塊編號(hào)i (I < i < Y)、FLASH 的 SECTOR 編號(hào)為 k(j+l 彡 k 彡 j+n);第二步,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)儲(chǔ)標(biāo)記A = 0,設(shè)置FLASH中SECTOR編號(hào)=k ;第三步,擦除FLASH中用于數(shù)據(jù)備份的SECTOR ;第四步,讀取FLASH中編號(hào)為k的SECTOR中的全部數(shù)據(jù)到SDRAM的數(shù)據(jù)暫存區(qū),然后把這部分?jǐn)?shù)據(jù)寫入FLASH中用于數(shù)據(jù)備份的SECTOR中,并做校驗(yàn),這一步叫做轉(zhuǎn)儲(chǔ);第五步,如果轉(zhuǎn)儲(chǔ)成功,則設(shè)置FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記A = 1,如果系統(tǒng)發(fā)生異常,則FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記不會(huì)改變?nèi)詾锳 = O;第六步,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記B = O;第七步,擦除FLASH中編號(hào)為k的SECTOR ;
第八步,把FRAM中的記錄數(shù)據(jù)塊讀出,并添加到SDRAM中由上述第四步得到的數(shù)據(jù)塊的尾部,然后把這個(gè)數(shù)據(jù)塊寫回編號(hào)為k的SECTOR中,并作校驗(yàn);第九步,如果第八步寫入成功,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記B = I ;第十步,經(jīng)過第九步之后,再根據(jù)第一步得到的i判斷編號(hào)為k的SECTOR是否寫滿;如果尚未寫滿,則修改FRAM中數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記的記錄數(shù)據(jù)塊編號(hào)為i+Ι,而SECTOR編號(hào)不變?nèi)詾閗;如果已經(jīng)寫滿,則記錄數(shù)據(jù)塊編號(hào)改為I (即下次從第一個(gè)數(shù)據(jù)塊開始寫),而設(shè)置SECTOR編號(hào)=k+Ι (即下次從下一個(gè)SECTOR寫入);如果(k+Ι)超出FLASH的記錄數(shù)據(jù)區(qū)(即k+1 > j+n),則設(shè)置SECTOR編號(hào)=j+Ι (即循環(huán)回到記錄數(shù)據(jù)區(qū)起始位置);第十一步,清空FRAM中的記錄數(shù)據(jù)暫存區(qū),新的記錄又可以從頭寫入這個(gè)空間;步驟四數(shù)據(jù)恢復(fù)若系統(tǒng)在上述步驟三中的第四步或第八步操作時(shí)發(fā)生異常故障,導(dǎo)致數(shù)據(jù)丟失,則數(shù)據(jù)恢復(fù)步驟如下第一步,讀取備份SECTOR中的數(shù)據(jù)到SDRAM中,獲得備份數(shù)據(jù),此時(shí)FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記沒有改變,即A = 1,SECTOR編號(hào)=k,但B = 0,表明數(shù)據(jù)轉(zhuǎn)移沒有成功;第二步,擦除FLASH中編號(hào)為k的SECTOR ;第三步,把SDRAM中第一步獲取的備份數(shù)據(jù)寫入FLASH中編號(hào)為k的SECTOR中,并做校驗(yàn);第四步,如果第三步寫入成功,則設(shè)置FRAM中的轉(zhuǎn)移標(biāo)記,即B = 1,轉(zhuǎn)到第五步,如果系統(tǒng)發(fā)生異常,則FRAM中的標(biāo)記A = 1,B = 0, SECTOR編號(hào)=k,不會(huì)改變;第五步,按數(shù)據(jù)轉(zhuǎn)移操作方法把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FASLH中。采用本發(fā)明所述的技術(shù)方案優(yōu)點(diǎn)在于采用數(shù)據(jù)轉(zhuǎn)移操作,由于實(shí)時(shí)產(chǎn)生的記錄保存在FRAM記錄數(shù)據(jù)暫存區(qū),只有暫存區(qū)記錄滿時(shí),才把記錄轉(zhuǎn)移到FLASH中,這樣操作不僅提高了數(shù)據(jù)的保存速度,更重要的是大大降低了對(duì)FLASH的寫操作次數(shù),也是減少了對(duì)FLASH的擦除次數(shù),從而盡可能地延長(zhǎng)了 FLASH的使用壽命;同時(shí),數(shù)據(jù)轉(zhuǎn)移操作采用先轉(zhuǎn)儲(chǔ),再轉(zhuǎn)移的步驟,保證了在數(shù)據(jù)轉(zhuǎn)移操作過程中,即使系統(tǒng)發(fā)生異常故障,也能保證系統(tǒng)恢復(fù)到數(shù)據(jù)轉(zhuǎn)移操作前的狀態(tài),達(dá)到了數(shù)據(jù)安全可靠操作的目的。
圖I為本發(fā)明工作原理示意圖。
具體實(shí)施式下面結(jié)合附圖進(jìn)一步說明本發(fā)明的具體實(shí)施步驟。為了便于更加清晰描述所述方法,本發(fā)明以對(duì)嵌入式系統(tǒng)中記錄數(shù)據(jù)操作為例。記錄數(shù)據(jù)指的是考勤記錄或報(bào)警記錄,或相類似的數(shù)據(jù),記錄數(shù)據(jù)是系統(tǒng)在使用過程中實(shí)時(shí)產(chǎn)生的。例如考勤記錄是在考勤過程中產(chǎn)生的,當(dāng)考勤成功時(shí),產(chǎn)生考勤成功記錄,通常包括考勤人姓名(或流水號(hào)或工號(hào))和考勤時(shí)間;而報(bào)警記錄,通常是系統(tǒng)在使用過程中,發(fā)生事件引發(fā)報(bào)警(如火警,振動(dòng)事件等),此時(shí)產(chǎn)生報(bào)警信息,通常包括發(fā)生事件的類型,發(fā)生時(shí)間和發(fā)生地點(diǎn)位置等。記錄數(shù)據(jù)的特點(diǎn)是實(shí)時(shí)產(chǎn)生,有時(shí)頻繁 發(fā)生,數(shù)據(jù)量小(通常為幾個(gè)字到幾十個(gè)字節(jié));但通常要求系統(tǒng)能保存一段時(shí)間的記錄數(shù)據(jù)(考勤數(shù)據(jù)或報(bào)警信息),例如3個(gè)月等,方便日后考核或查詢。盡管每條記錄數(shù)據(jù)的數(shù)據(jù)量小,但由于要求系統(tǒng)能長(zhǎng)時(shí)間保存,因此總的記錄數(shù)據(jù)量有時(shí)候會(huì)很大。由于記錄數(shù)據(jù)產(chǎn)生頻繁,產(chǎn)生次數(shù)多等特點(diǎn),因此需要頻繁向存儲(chǔ)器寫入記錄數(shù)據(jù)。如上所述,F(xiàn)LASH容量大但擦除次數(shù)有限,故不宜頻繁寫入(需要擦除),而FRAM沒有擦除次數(shù)限制,可以頻繁寫入,但其容量小,不能存放大量數(shù)據(jù)。因此,利用FRAM讀寫速度快、沒有擦除次數(shù)限制且可靠性高的特點(diǎn)以及FLASH容量大且價(jià)格低廉的特點(diǎn),將二者組合成一個(gè)非易失性存儲(chǔ)器系統(tǒng)。另外,采用SDRAM作為系統(tǒng)常規(guī)內(nèi)存,用來運(yùn)行操作系統(tǒng),算法處理等需要高速運(yùn)行的操作。本方法取三種存儲(chǔ)器的優(yōu)點(diǎn),互相補(bǔ)充。一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法,所述數(shù)據(jù)存儲(chǔ)方法是利用FLASH、FRAM及SDRAM三部分組合成的數(shù)據(jù)存儲(chǔ)系統(tǒng)完成的,該方法包括以下步驟步驟一系統(tǒng)初始化在系統(tǒng)設(shè)計(jì)時(shí),把FLASH空間劃分成多個(gè)區(qū),比如有特征數(shù)據(jù)區(qū),記錄數(shù)據(jù)區(qū),操作系統(tǒng)區(qū),數(shù)據(jù)庫(kù)區(qū)等等,每個(gè)區(qū)包括至少一個(gè)SECTOR ;進(jìn)一步地,對(duì)FLASH所有的SECTOR進(jìn)行編號(hào),如FLASH —共有M個(gè)SECTOR,那么其SECTOR依次編號(hào)1,2. . . M ;特別地,保留一個(gè)SECTOR,用來作為數(shù)據(jù)轉(zhuǎn)儲(chǔ)(數(shù)據(jù)備份)操作。所謂數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作就是把數(shù)據(jù)從FLASH的一個(gè)SECTOR轉(zhuǎn)存到另一個(gè)用于備份的SECTOR。轉(zhuǎn)儲(chǔ)操作是所述數(shù)據(jù)可靠操作方法的一個(gè)重要步驟。預(yù)留的FLASH記錄數(shù)據(jù)空間,應(yīng)該能滿足不同應(yīng)用場(chǎng)合下系統(tǒng)設(shè)計(jì)指標(biāo)中的記錄保存時(shí)間。如附圖I所示,假設(shè)系統(tǒng)保留了 η個(gè)SECTOR作為記錄數(shù)據(jù)保存區(qū),編號(hào)從j+1開始到j(luò)+n結(jié)束。在FRAM中開辟一個(gè)記錄數(shù)據(jù)暫存區(qū),其存儲(chǔ)空間大小應(yīng)合理設(shè)計(jì)(主要在系統(tǒng)設(shè)計(jì)時(shí)考慮)。假設(shè)此空間大小為T個(gè)字節(jié)(如T = 1K),而FLASH每個(gè)SECTOR的大小為X個(gè)字節(jié)(如X = 64K),假設(shè)Y = X/T,對(duì)Y取整數(shù)。那么把FLASH的記錄數(shù)據(jù)空間的每個(gè)SECTOR都劃分為Y個(gè)記錄數(shù)據(jù)塊,依次編號(hào)為1,2,... ,Y-LY0在FRAM中開辟一個(gè)區(qū)作為數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作的標(biāo)記,在此區(qū)內(nèi)存放兩個(gè)字節(jié)型的數(shù)據(jù),即數(shù)據(jù)轉(zhuǎn)儲(chǔ)標(biāo)記A和發(fā)生轉(zhuǎn)儲(chǔ)操作的FLASH的SECTOR編號(hào)。所謂數(shù)據(jù)轉(zhuǎn)儲(chǔ),是指把數(shù)據(jù)從一個(gè)SECTOR搬移到另一個(gè)SECTOR,通常做數(shù)據(jù)備份用。在FRAM中再開辟一個(gè)區(qū)作為數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記,在此區(qū)內(nèi)存放三個(gè)字節(jié)型數(shù)據(jù),即數(shù)據(jù)轉(zhuǎn)移標(biāo)記B、記錄數(shù)據(jù)塊編號(hào)和發(fā)生轉(zhuǎn)移操作的FLASH的SECTOR編號(hào)。所謂數(shù)據(jù)轉(zhuǎn)移指的是當(dāng)FRAM記錄數(shù)據(jù)暫存區(qū)存滿數(shù)據(jù)時(shí),需要把這個(gè)記錄數(shù)據(jù)塊轉(zhuǎn)移到FLASH中。轉(zhuǎn)移操作是指把FRAM中的記錄數(shù)據(jù)添加到FLASH中的記錄數(shù)據(jù)區(qū),添加是按順序添加到記錄數(shù)據(jù)區(qū)的尾部,也就是舊的記錄數(shù)據(jù)在前新的記錄數(shù)據(jù)在后,依次添加。那么系統(tǒng)必須記住,當(dāng)前記錄數(shù)據(jù)已經(jīng)添加到了哪一個(gè)SECTOR中的哪一個(gè)記錄數(shù)據(jù)塊,因此需要知道當(dāng)前SECTOR的編號(hào)和當(dāng)前要寫入的記錄數(shù)據(jù)塊在SECTOR中的編號(hào)。步驟二 數(shù)據(jù)添加數(shù)據(jù)添加是指當(dāng)系統(tǒng)產(chǎn)生新的記錄時(shí),需要把新記錄保存起來,并保留一段時(shí)間。具體做法是,系統(tǒng)把新記錄寫入到FRAM的記錄數(shù)據(jù)暫存區(qū)的尾部,這樣形成了舊記錄在前新記錄在后的順序,把記錄逐條保存起來,直至將FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿。因?yàn)镕RAM是非易失性存儲(chǔ)器,即便系統(tǒng)掉電或發(fā)生其他異常后,記錄依然能保存在FRAM存儲(chǔ)器中。由于單條記錄數(shù)據(jù)量小,而且產(chǎn)生頻繁,故不宜直接把記錄寫入FLASH中,而是暫存在記錄數(shù)據(jù)暫存區(qū)。步驟三數(shù)據(jù)轉(zhuǎn)移 當(dāng)FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿之后,就需要做數(shù)據(jù)轉(zhuǎn)移操作,把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FLASH中。具體操作步驟細(xì)化如下第一步,讀取FRAM中的數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記B,假設(shè)此時(shí)記錄數(shù)據(jù)塊編號(hào)為
i(I 彡 i 彡 Y),F(xiàn)LASH 的 SECTOR 編號(hào)為 k(j+l 彡 k 彡 j+n);第二步,設(shè)置FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記,其中設(shè)置A = 0,設(shè)置FLASH中SECTOR編號(hào)=k ;第三步,擦除FLASH中用于數(shù)據(jù)備份的SECTOR ;第四步,讀取FLASH中編號(hào)為k的SECTOR中的全部數(shù)據(jù)到SDRAM的數(shù)據(jù)暫存區(qū),然后把這部分?jǐn)?shù)據(jù)寫入FLASH中用于數(shù)據(jù)備份的SECTOR中,并做校驗(yàn),這一步叫做轉(zhuǎn)儲(chǔ);第五步,如果轉(zhuǎn)儲(chǔ)成功,則設(shè)置FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記A = I ;如果系統(tǒng)發(fā)生異常,則FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記不會(huì)改變?nèi)詾锳 = O;第六步,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記B = O;第七步,擦除FLASH中編號(hào)為k的SECTOR ;第八步,把FRAM中的記錄數(shù)據(jù)塊讀出,并添加到SDRAM中由第四步得到的數(shù)據(jù)塊(一個(gè)SECTOR大小)的尾部(即舊記錄數(shù)據(jù)塊在前,新的記錄數(shù)據(jù)塊在后,依次添加到FLASH中),然后把這個(gè)數(shù)據(jù)塊(一個(gè)SECTOR大小)寫回編號(hào)為k的SECTOR中,并作校驗(yàn);第九步,如果第八步寫入成功,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記B = I ;第十步,經(jīng)過第九步之后,再根據(jù)第一步得到的i判斷編號(hào)為k的SECTOR是否寫滿;如果尚未寫滿,則修改FRAM中數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記的記錄數(shù)據(jù)塊編號(hào)為i+Ι,而SECTOR編號(hào)不變?nèi)詾閗;如果已經(jīng)寫滿,則記錄數(shù)據(jù)塊編號(hào)改為I (即下次從第一個(gè)數(shù)據(jù)塊開始寫),而設(shè)置SECTOR編號(hào)=k+Ι (即下次從下一個(gè)SECTOR寫入);如果(k+Ι)超出FLASH的記錄數(shù)據(jù)區(qū)(即k+1 > j+n),則設(shè)置SECTOR編號(hào)=j+Ι (即循環(huán)回到記錄數(shù)據(jù)區(qū)起始位置);第十一步,清空FRAM中的記錄數(shù)據(jù)暫存區(qū),新的記錄又可以從頭寫入這個(gè)空間;第十步實(shí)現(xiàn)了記錄數(shù)據(jù)的循環(huán)存儲(chǔ),即當(dāng)FLASH記錄數(shù)據(jù)區(qū)存滿記錄時(shí),下一次記錄數(shù)據(jù)轉(zhuǎn)移操作會(huì)把FRAM中的記錄數(shù)據(jù)塊寫入到FLASH中記錄數(shù)據(jù)區(qū)的最開始的位置,把最老的記錄覆蓋掉,這樣,F(xiàn)LASH中始終保存了最新的記錄數(shù)據(jù)。
當(dāng)用戶查詢記錄時(shí),系統(tǒng)把FLASH中的所有記錄以及FRAM中的記錄都都讀入內(nèi)存中,供系統(tǒng)查詢算法調(diào)用。所述步驟三由于把記錄數(shù)據(jù)暫時(shí)存儲(chǔ)在FRAM中,只有等到FRAM中的記錄數(shù)據(jù)區(qū)寫滿之后再把整個(gè)記錄數(shù)據(jù)塊轉(zhuǎn)移到FLASH中,因此大大降低了對(duì)FLASH的寫操作(同時(shí)也是減少了對(duì)FLASH的擦除),從而提高了 FLASH的使用壽命。步驟四數(shù)據(jù)恢復(fù)所述方法采用數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作,實(shí)現(xiàn)了數(shù)據(jù)可靠存儲(chǔ),不會(huì)出現(xiàn)由于數(shù)據(jù)轉(zhuǎn)移時(shí)擦除FLASH而導(dǎo)致舊的記錄丟失。例如,當(dāng)數(shù)據(jù)轉(zhuǎn)移第四步操作時(shí)系統(tǒng)發(fā)生異常故障,導(dǎo)致記錄數(shù)據(jù)備份不成功,此時(shí)系統(tǒng)復(fù)位或重新上電后,讀取FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記,得到的結(jié)果是A=0,表明數(shù)據(jù)備份不成功,而此時(shí)編號(hào)為k的SECTOR尚未被擦除,F(xiàn)RAM中的舊記錄數(shù)據(jù)也尚未被清空,所以舊的記錄數(shù)據(jù)是安全的。如果所述數(shù)據(jù)轉(zhuǎn)移操作第八步做數(shù)據(jù)轉(zhuǎn)移操作時(shí)系統(tǒng)發(fā)生異常故障,這將導(dǎo)致編號(hào)為k的SECTOR內(nèi)的數(shù)據(jù)丟失,但是由于在這之前數(shù)據(jù)已經(jīng)備份過了,系統(tǒng)復(fù)位或重新上電后,就可以從備份的SECTOR讀出數(shù)據(jù),恢復(fù)系統(tǒng)做轉(zhuǎn)移操作前的狀態(tài)。數(shù)據(jù)恢復(fù)步驟如下第一步,讀取備份SECTOR的數(shù)據(jù)到SDRAM中,獲得備份數(shù)據(jù)。此時(shí)FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記沒有改變,即A = 1,SECTOR編號(hào)=k。但B = 0,表明數(shù)據(jù)轉(zhuǎn)移不成功。第二步,擦除FLASH中編號(hào)為k的SECTOR。第三步,把SDRAM中第一步獲取的備份數(shù)據(jù)寫入FLASH中編號(hào)為k的SECTOR中,并做校驗(yàn)。第四步,如果第三步寫入成功,則設(shè)置FRAM中的轉(zhuǎn)移標(biāo)記,即B = 1,轉(zhuǎn)到第五步。如果系統(tǒng)發(fā)生異常,則FRAM中的標(biāo)記A = 1,B = 0, SECTOR編號(hào)=k,不會(huì)改變。第五步,按數(shù)據(jù)轉(zhuǎn)移操作把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FASLH中。所述數(shù)據(jù)轉(zhuǎn)移操作,由于實(shí)時(shí)產(chǎn)生的記錄保存在FRAM記錄數(shù)據(jù)暫存區(qū),只有暫存區(qū)記錄滿時(shí),才把記錄轉(zhuǎn)移到FLASH中,這樣操作不僅提高了記錄的保存的速度,更重要的是大大減少了 FLASH擦除的次數(shù),從而盡可能地延長(zhǎng)了 FLASH的使用壽命;同時(shí),數(shù)據(jù)轉(zhuǎn)移操作采用先轉(zhuǎn)儲(chǔ),再轉(zhuǎn)移的步驟,保證了在數(shù)據(jù)轉(zhuǎn)移操作過程中,即使系統(tǒng)發(fā)生異常故障,也能保證系統(tǒng)能恢復(fù)到數(shù)據(jù)轉(zhuǎn)移操作前的狀態(tài),達(dá)到了數(shù)據(jù)安全可靠操作的目的。
權(quán)利要求
1 . 一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法,所述數(shù)據(jù)存儲(chǔ)方法是利用FLASH、FRAM及SDRAM三部分組合成的數(shù)據(jù)存儲(chǔ)系統(tǒng)完成的,其特征在于該方法包括以下四個(gè)步驟步驟一系統(tǒng)初始化 在系統(tǒng)設(shè)計(jì)時(shí),把FLASH劃分成如特征數(shù)據(jù)區(qū)、記錄數(shù)據(jù)區(qū)、操作系統(tǒng)區(qū)、數(shù)據(jù)庫(kù)區(qū)等多個(gè)空間,每個(gè)區(qū)包括至少一個(gè)SECTOR ; 進(jìn)一步的,對(duì)FLASH所有的SECTOR進(jìn)行編號(hào),特別地,保留一個(gè)SECTOR,用來作為數(shù)據(jù)轉(zhuǎn)儲(chǔ)(數(shù)據(jù)備份)區(qū),以進(jìn)行數(shù)據(jù)轉(zhuǎn)儲(chǔ)(數(shù)據(jù)備份)操作; 進(jìn)一步的,預(yù)留出能滿足系統(tǒng)設(shè)計(jì)指標(biāo)中的記錄保存時(shí)間的η個(gè)SECTOR作為記錄數(shù)據(jù)保存區(qū),編號(hào)從j+Ι開始到j(luò)+n結(jié)束; 進(jìn)一步的,把記錄數(shù)據(jù)區(qū)的每個(gè)SECTOR都劃分為Y個(gè)記錄數(shù)據(jù)塊,依次編號(hào)為1,2,··· , Y-1, Y ; 在FRAM中開辟一個(gè)記錄數(shù)據(jù)暫存區(qū),一個(gè)數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作的標(biāo)記區(qū)及一個(gè)數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記區(qū); 進(jìn)一步的,F(xiàn)RAM中記錄數(shù)據(jù)暫存區(qū)的空間大小為記錄數(shù)據(jù)區(qū)的一個(gè)SECTOR中的一個(gè)記錄數(shù)據(jù)塊的大小; 進(jìn)一步的,數(shù)據(jù)轉(zhuǎn)儲(chǔ)操作的標(biāo)記區(qū)存放數(shù)據(jù)轉(zhuǎn)儲(chǔ)標(biāo)記A及發(fā)生轉(zhuǎn)儲(chǔ)操作的FLASH的SECTOR編號(hào)兩個(gè)字節(jié)型的數(shù)據(jù); 進(jìn)一步的,數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記區(qū)存放數(shù)據(jù)轉(zhuǎn)移標(biāo)記B、記錄數(shù)據(jù)塊的編號(hào)及發(fā)生轉(zhuǎn)移操作的FLASH的SECTOR編號(hào)三個(gè)字節(jié)型數(shù)據(jù); 步驟二 數(shù)據(jù)添加 系統(tǒng)把新記錄寫入到FRAM的記錄數(shù)據(jù)暫存區(qū)的尾部,形成舊記錄在前新記錄在后的順序,把記錄逐條保存起來,直至將FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿; 步驟三數(shù)據(jù)轉(zhuǎn)移 當(dāng)FRAM中的記錄數(shù)據(jù)暫存區(qū)寫滿之后,就需要做數(shù)據(jù)轉(zhuǎn)移操作,把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FLASH中,具體操作步驟細(xì)化如下 第一步,讀取FRAM中的數(shù)據(jù)轉(zhuǎn)移操作的標(biāo)記B、記錄數(shù)據(jù)塊編號(hào)i (I < i < Y)、FLASH的SECTOR編號(hào)為k(j+l彡k彡j+n); 第二步,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)儲(chǔ)標(biāo)記A = 0,設(shè)置FLASH中SECTOR編號(hào)=k ; 第三步,擦除FLASH中用于數(shù)據(jù)備份的SECTOR ; 第四步,讀取FLASH中編號(hào)為k的SECTOR中的全部數(shù)據(jù)到SDRAM的數(shù)據(jù)暫存區(qū),然后把這部分?jǐn)?shù)據(jù)寫入FLASH中用于數(shù)據(jù)備份的SECTOR中,并做校驗(yàn),這一步叫做轉(zhuǎn)儲(chǔ); 第五步,如果轉(zhuǎn)儲(chǔ)成功,則設(shè)置FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記A = i,如果系統(tǒng)發(fā)生異常,則FRAM中的轉(zhuǎn)儲(chǔ)標(biāo)記不會(huì)改變?nèi)詾锳 = O; 第六步,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記B = O; 第七步,擦除FLASH中編號(hào)為k的SECTOR ; 第八步,把FRAM中的記錄數(shù)據(jù)塊讀出,并添加到SDRAM中由上述第四步得到的數(shù)據(jù)塊的尾部,然后把這個(gè)數(shù)據(jù)塊寫回編號(hào)為k的SECTOR中,并作校驗(yàn); 第九步,如果第八步寫入成功,設(shè)置FRAM中的數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記B = I ; 第十步,經(jīng)過第九步之后,再根據(jù)第一步得到的i判斷編號(hào)為k的SECTOR是否寫滿;如果尚未寫滿,則修改FRAM中數(shù)據(jù)轉(zhuǎn)移操作標(biāo)記的記錄數(shù)據(jù)塊編號(hào)為i+Ι,而SECTOR編號(hào)不變?nèi)詾閗 ;如果已經(jīng)寫滿,則記錄數(shù)據(jù)塊編號(hào)改為I (即下次從第一個(gè)數(shù)據(jù)塊開始寫),而設(shè)置SECTOR編號(hào)=k+Ι (即下次從下一個(gè)SECTOR寫入);如果(k+Ι)超出FLASH的記錄數(shù)據(jù)區(qū)(即k+l> j+n),則設(shè)置SECTOR編號(hào)=j+l (即循環(huán)回到記錄數(shù)據(jù)區(qū)起始位置); 第十一步,清空FRAM中的記錄數(shù)據(jù)暫存區(qū),新的記錄又可以從頭寫入這個(gè)空間; 步驟四數(shù)據(jù)恢復(fù) 若系統(tǒng)在上述步驟三中的第四步或第八步操作時(shí)發(fā)生異常故障,導(dǎo)致數(shù)據(jù)丟失,則數(shù)據(jù)恢復(fù)步驟如下 第一步,讀取備份SECTOR中的數(shù)據(jù)到SDRAM中,獲得備份數(shù)據(jù),此時(shí)FRAM中的轉(zhuǎn)儲(chǔ)標(biāo) 記沒有改變,即A = 1,SECTOR編號(hào)=k,但B = 0,表明數(shù)據(jù)轉(zhuǎn)移沒有成功; 第二步,擦除FLASH中編號(hào)為k的SECTOR ; 第三步,把SDRAM中第一步獲取的備份數(shù)據(jù)寫入FLASH中編號(hào)為k的SECTOR中,并做校驗(yàn); 第四步,如果第三步寫入成功,則設(shè)置FRAM中的轉(zhuǎn)移標(biāo)記,即B = 1,轉(zhuǎn)到第五步,如果系統(tǒng)發(fā)生異常,則FRAM中的標(biāo)記A = 1,B = 0, SECTOR編號(hào)=k,不會(huì)改變; 第五步,按數(shù)據(jù)轉(zhuǎn)移操作方法把FRAM中的記錄數(shù)據(jù)轉(zhuǎn)移到FASLH中。
全文摘要
本發(fā)明公開了一種可延長(zhǎng)FLASH使用壽命的數(shù)據(jù)存儲(chǔ)方法,所述數(shù)據(jù)存儲(chǔ)方法是利用FLASH、FRAM及SDRAM三部分組合成的數(shù)據(jù)存儲(chǔ)系統(tǒng)完成的,該方法主要包括系統(tǒng)初始化、數(shù)據(jù)添加、數(shù)據(jù)轉(zhuǎn)移及數(shù)據(jù)恢復(fù)四個(gè)步驟。采用本發(fā)明所述的技術(shù)方案優(yōu)點(diǎn)在于采用數(shù)據(jù)轉(zhuǎn)移操作,不僅提高了數(shù)據(jù)的保存速度,更重要的是大大降低了對(duì)FLASH的擦除次數(shù),從而盡可能地延長(zhǎng)了FLASH的使用壽命;同時(shí),數(shù)據(jù)轉(zhuǎn)移操作采用先轉(zhuǎn)儲(chǔ),再轉(zhuǎn)移的步驟,保證了在數(shù)據(jù)轉(zhuǎn)移操作過程中,即使系統(tǒng)發(fā)生異常故障,也能保證系統(tǒng)恢復(fù)到數(shù)據(jù)轉(zhuǎn)移操作前的狀態(tài),達(dá)到了數(shù)據(jù)安全可靠操作的目的。
文檔編號(hào)G06F12/08GK102981977SQ20111025965
公開日2013年3月20日 申請(qǐng)日期2011年9月5日 優(yōu)先權(quán)日2011年9月5日
發(fā)明者黃正 申請(qǐng)人:上海華魏光纖傳感技術(shù)有限公司