亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

一種數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端與流程

文檔序號(hào):11514832閱讀:266來源:國(guó)知局
一種數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端與流程

本發(fā)明涉及數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端。



背景技術(shù):

目前存儲(chǔ)器通常使用一個(gè)計(jì)數(shù)器計(jì)數(shù)一個(gè)存儲(chǔ)區(qū)域的擦寫次數(shù),當(dāng)擦寫次數(shù)計(jì)數(shù)值大于擦寫壽命表示該區(qū)域失效,選擇下一存儲(chǔ)區(qū)域繼續(xù)操作。但是如果在寫這個(gè)計(jì)數(shù)值時(shí)出現(xiàn)掉電,該計(jì)數(shù)值錯(cuò)亂,最終導(dǎo)致該存儲(chǔ)區(qū)域的數(shù)據(jù)都不可靠。

因而現(xiàn)有技術(shù)還有待改進(jìn)和提高。



技術(shù)實(shí)現(xiàn)要素:

鑒于上述現(xiàn)有技術(shù)的不足之處,本發(fā)明的目的在于提供一種數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端,通過將存儲(chǔ)區(qū)域進(jìn)行劃分并設(shè)置標(biāo)志區(qū),在每個(gè)區(qū)域?qū)懭霐?shù)據(jù)后更新其狀態(tài)標(biāo)志,當(dāng)發(fā)生掉電情況時(shí),重新上電后能根據(jù)所有區(qū)域的狀態(tài)標(biāo)志恢復(fù)至掉電前正在進(jìn)行擦寫數(shù)據(jù)的區(qū)域,確保數(shù)據(jù)存儲(chǔ)的正確性不受掉電的影響。

為了達(dá)到上述目的,本發(fā)明采取了以下技術(shù)方案:

一種數(shù)據(jù)存儲(chǔ)方法,其包括如下步驟:

a、將存儲(chǔ)區(qū)域劃分為n個(gè)block區(qū)域,記為block1、block2、...、blockn,每個(gè)block區(qū)域包括用于保存數(shù)據(jù)的數(shù)據(jù)區(qū)和用于保存狀態(tài)標(biāo)志的標(biāo)志區(qū);

b、按預(yù)設(shè)順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并在寫入數(shù)據(jù)后更新每個(gè)block區(qū)域中標(biāo)志區(qū)的狀態(tài)標(biāo)志;

c、當(dāng)擦寫過程發(fā)生掉電時(shí),重新上電后根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks或block(s-1),繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)或blocks中,其中blocks為掉電時(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟a中:所述狀態(tài)標(biāo)志用于表示該block區(qū)域數(shù)據(jù)的新舊,其包括m種有效狀態(tài),記為state1、state2、...、statem,其中statem新于state(m-1),state(m-1)新于state(m-2),...,state2新于state1,state1新于statem。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟b具體包括:按照block1-block2-...-blockn-block1-...的順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),在每個(gè)block區(qū)域的數(shù)據(jù)區(qū)寫入數(shù)據(jù)后將其狀態(tài)標(biāo)志更新為statek,且在block1-...-blockn循環(huán)寫入一輪后,下一輪循環(huán)在每個(gè)block區(qū)域的數(shù)據(jù)區(qū)寫入數(shù)據(jù)后將其狀態(tài)標(biāo)志更新為state(k+1)。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟c包括步驟:

c1、上電后讀取所有block區(qū)域的狀態(tài)標(biāo)志;

c2、當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入時(shí),根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks,并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中;

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至block(s-1),并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟c2具體包括:

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入時(shí),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在兩種有效狀態(tài)時(shí),選擇相鄰兩種有效狀態(tài)對(duì)應(yīng)的block區(qū)域中數(shù)據(jù)最新的block區(qū)域作為blocks;若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志僅有一種有效狀態(tài)時(shí),則令blockn作為blocks;之后繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中;

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在有效狀態(tài)和無效狀態(tài)時(shí),選擇無效狀態(tài)對(duì)應(yīng)的block區(qū)域的前一個(gè)區(qū)域作為block(s-1);若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在兩種有效狀態(tài)時(shí),選擇相鄰兩種有效狀態(tài)對(duì)應(yīng)的block區(qū)域中數(shù)據(jù)最新的block區(qū)域作為block(s-1),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志僅有一種有效狀態(tài)時(shí),則令blockn作為block(s-1);之后繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟a中,每個(gè)block區(qū)域分別位于相互獨(dú)立的不同扇區(qū)。

所述的數(shù)據(jù)存儲(chǔ)方法中,所述步驟a中,狀態(tài)標(biāo)志被擦除后的默認(rèn)值為無效狀態(tài)。

所述的數(shù)據(jù)存儲(chǔ)方法中,n≥2,m≥3。

一種存儲(chǔ)裝置,其中,所述存儲(chǔ)裝置存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序適于被執(zhí)行以實(shí)現(xiàn)如上所述的數(shù)據(jù)存儲(chǔ)方法。

一種智能終端,其包括處理器、與所述處理器通信連接的存儲(chǔ)器,所述存儲(chǔ)器存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序被處理器執(zhí)行以實(shí)現(xiàn)如上所述的數(shù)據(jù)存儲(chǔ)方法;

所述處理器用于調(diào)用所述存儲(chǔ)器中的計(jì)算機(jī)程序,以執(zhí)行如上所述的數(shù)據(jù)存儲(chǔ)方法。

相較于現(xiàn)有技術(shù),本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端中,所述數(shù)據(jù)存儲(chǔ)方法通過將存儲(chǔ)區(qū)域劃分為n個(gè)block區(qū)域,記為block1、block2、...、blockn,每個(gè)block區(qū)域包括用于保存數(shù)據(jù)的數(shù)據(jù)區(qū)和用于保存狀態(tài)標(biāo)志的標(biāo)志區(qū);按預(yù)設(shè)順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并在寫入數(shù)據(jù)后更新每個(gè)block區(qū)域中標(biāo)志區(qū)的狀態(tài)標(biāo)志;當(dāng)擦寫過程發(fā)生掉電時(shí),重新上電后根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks或block(s-1),繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)或blocks中,其中blocks為掉電時(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域,通過將存儲(chǔ)區(qū)域進(jìn)行劃分并設(shè)置標(biāo)志區(qū),在每個(gè)區(qū)域?qū)懭霐?shù)據(jù)后更新其狀態(tài)標(biāo)志,當(dāng)發(fā)生掉電情況時(shí),重新上電后能根據(jù)所有區(qū)域的狀態(tài)標(biāo)志恢復(fù)至掉電前正在進(jìn)行擦寫數(shù)據(jù)的區(qū)域,確保數(shù)據(jù)存儲(chǔ)的正確性不受掉電的影響。

附圖說明

圖1為本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法的流程圖。

圖2為本發(fā)明提供的智能終端的結(jié)構(gòu)框圖。

圖3為本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法的應(yīng)用實(shí)施例的流程圖。

具體實(shí)施方式

鑒于現(xiàn)有技術(shù)中存儲(chǔ)器在掉電時(shí)容易發(fā)生數(shù)據(jù)存儲(chǔ)錯(cuò)誤等缺點(diǎn),本發(fā)明的目的在于提供一種數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端,通過將存儲(chǔ)區(qū)域進(jìn)行劃分并設(shè)置標(biāo)志區(qū),在每個(gè)區(qū)域?qū)懭霐?shù)據(jù)后更新其狀態(tài)標(biāo)志,當(dāng)發(fā)生掉電情況時(shí),重新上電后能根據(jù)所有區(qū)域的狀態(tài)標(biāo)志恢復(fù)至掉電前正在進(jìn)行擦寫數(shù)據(jù)的區(qū)域,確保數(shù)據(jù)存儲(chǔ)的正確性不受掉電的影響。

為使本發(fā)明的目的、技術(shù)方案及效果更加清楚、明確,以下參照附圖并舉實(shí)施例對(duì)本發(fā)明進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。

請(qǐng)參閱圖1,本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法包括如下步驟:

s100、將存儲(chǔ)區(qū)域劃分為n個(gè)block區(qū)域,記為block1、block2、...、blockn,每個(gè)block區(qū)域包括用于保存數(shù)據(jù)的數(shù)據(jù)區(qū)和用于保存狀態(tài)標(biāo)志的標(biāo)志區(qū);

s200、按預(yù)設(shè)順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并在寫入數(shù)據(jù)后更新每個(gè)block區(qū)域中標(biāo)志區(qū)的狀態(tài)標(biāo)志;

s300、當(dāng)擦寫過程發(fā)生掉電時(shí),重新上電后根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks或block(s-1),繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)或blocks中,其中blocks為掉電時(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域。

本發(fā)明通過將可擦寫存儲(chǔ)區(qū)域劃分為n個(gè)block區(qū)域,其中n≥2,分別記為block1、block2、...、blockn,每個(gè)block區(qū)域分別位于相互獨(dú)立的不同扇區(qū),即不同扇區(qū)之間的擦除是相互獨(dú)立的,燒寫也是相互獨(dú)立的,擦寫任意扇區(qū)內(nèi)的任意地址,其他扇區(qū)均不被影響,其中每個(gè)block區(qū)域的大小可小于一個(gè)扇區(qū)或者包含多個(gè)扇區(qū),具體可根據(jù)實(shí)際需求進(jìn)行選擇,且每個(gè)block區(qū)域均包括用于保存數(shù)據(jù)的數(shù)據(jù)區(qū)和用于保存狀態(tài)標(biāo)志的標(biāo)志區(qū),其中數(shù)據(jù)區(qū)和標(biāo)志區(qū)可設(shè)置在相同的扇區(qū)或者不同的扇區(qū),本發(fā)明對(duì)此不作限定。

進(jìn)行區(qū)域劃分后,擦寫數(shù)據(jù)時(shí)按預(yù)設(shè)順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并且在寫入數(shù)據(jù)后更新每個(gè)block區(qū)域中標(biāo)志區(qū)的狀態(tài)標(biāo)志,即在進(jìn)行數(shù)據(jù)擦寫時(shí),先擦除數(shù)據(jù)區(qū),將數(shù)據(jù)寫入數(shù)據(jù)區(qū)中,再擦除標(biāo)志區(qū),將更新后的狀態(tài)標(biāo)志寫入標(biāo)志區(qū)中,以表示該區(qū)域的數(shù)據(jù)已更新。具體來說,所述狀態(tài)標(biāo)志用于表示該block區(qū)域數(shù)據(jù)的新舊,其包括m種有效狀態(tài),m≥3,分別記為state1、state2、...、statem,狀態(tài)標(biāo)志存在非遞移性,其中statem新于state(m-1),state(m-1)新于state(m-2),...,state2新于state1,state1又新于statem。

特別地,本發(fā)明不采用狀態(tài)標(biāo)志被擦除后的默認(rèn)值作為m種有效狀態(tài)之一,即狀態(tài)標(biāo)志被擦除后的默認(rèn)值為無效狀態(tài),例如,假設(shè)狀態(tài)標(biāo)志位寬是2個(gè)bit,若存儲(chǔ)器中狀態(tài)標(biāo)志被擦除后的默認(rèn)值為1,則2’b11為無效狀態(tài),若存儲(chǔ)器中狀態(tài)標(biāo)志被擦除后的默認(rèn)值為0,則2’b00為無效狀態(tài),后續(xù)根據(jù)每個(gè)block區(qū)域狀態(tài)標(biāo)志的新舊對(duì)比來搜尋掉電前最后一次進(jìn)行擦寫操作的區(qū)域,避免因掉電導(dǎo)致的數(shù)據(jù)錯(cuò)誤。

具體地,步驟s200中,本發(fā)明按照預(yù)設(shè)順序:block1-block2-...-blockn-block1-...的順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),在每個(gè)block區(qū)域的數(shù)據(jù)區(qū)寫入數(shù)據(jù)后將其狀態(tài)標(biāo)志更新為statek,并且,在block1-...-blockn循環(huán)寫入一輪后,下一輪循環(huán)在每個(gè)block區(qū)域的數(shù)據(jù)區(qū)寫入數(shù)據(jù)后將其狀態(tài)標(biāo)志更新為state(k+1),需說明的是,當(dāng)k=m時(shí),k+1=1。

即假設(shè)第一使用時(shí),所有bit均處于擦除狀態(tài),此時(shí)無有效數(shù)據(jù),當(dāng)需要寫入新數(shù)據(jù)時(shí),先在block1的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并將block1的狀態(tài)標(biāo)志更新為state1,再在block2的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并將block2的狀態(tài)標(biāo)志更新為state1,以此類推,在第n次寫入新數(shù)據(jù)時(shí),先在blockn的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并將blockn的狀態(tài)標(biāo)志更新為state1,此時(shí)完成block1到blockn的第一輪循環(huán)寫入,開始下一輪循環(huán)后,即第n+1次寫入新數(shù)據(jù)時(shí),先在block1的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并將block1的狀態(tài)標(biāo)志更新為state2,以此類推完成第二輪循環(huán)寫入,當(dāng)完成第m輪循環(huán)后,開始下一輪循環(huán)后,即第m*n+1次寫入新數(shù)據(jù)時(shí),又重復(fù)第一輪循環(huán)寫入的過程,先在block1的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并將block1的狀態(tài)標(biāo)志更新為state1,以此類推繼續(xù)循環(huán)寫入數(shù)據(jù)和狀態(tài)更新的過程。

本發(fā)明采用上述循環(huán)擦寫以及狀態(tài)更新方式,使得在正常擦寫數(shù)據(jù)時(shí),所有的block區(qū)域中最多只可能同時(shí)出現(xiàn)兩種相鄰的有效狀態(tài),不會(huì)同時(shí)出現(xiàn)第三種有效狀態(tài),且根據(jù)相鄰兩種有效狀態(tài)的新舊也能判斷出當(dāng)前正在進(jìn)行擦寫操作的block區(qū)域,為后續(xù)掉電時(shí)搜尋最新寫入的數(shù)據(jù)區(qū)域提供保證。當(dāng)擦寫過程發(fā)生掉電時(shí),重新上電后根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks或block(s-1),繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)或blocks中,其中blocks為掉電時(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域,需說明的是,當(dāng)s=1時(shí),s-1=n,當(dāng)s=n時(shí),s+1=1。即重新上電后能根據(jù)所有區(qū)域的狀態(tài)標(biāo)志恢復(fù)至掉電前正在進(jìn)行擦寫數(shù)據(jù)的區(qū)域或其前一個(gè)區(qū)域,確保數(shù)據(jù)存儲(chǔ)的正確性不受掉電的影響。

具體地,所述步驟s300包括步驟:

s301、上電后讀取所有block區(qū)域的狀態(tài)標(biāo)志;

s302、當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入時(shí),根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks,并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中;

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至block(s-1),并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中。

本發(fā)明在掉電重新上電后,讀取所有block區(qū)域的狀態(tài)標(biāo)志,根據(jù)不同情況可追蹤至掉電前相應(yīng)的block區(qū)域,當(dāng)?shù)綦姇r(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域blocks的數(shù)據(jù)和狀態(tài)均正常寫入時(shí),根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks,并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中,即此時(shí)掉電并未對(duì)數(shù)據(jù)造成影響,數(shù)據(jù)沒有丟失,上電后可繼續(xù)按預(yù)設(shè)順序循環(huán)進(jìn)行數(shù)據(jù)擦寫;而當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),此時(shí)包括兩種情況,數(shù)據(jù)寫入但狀態(tài)標(biāo)志未寫入,或者數(shù)據(jù)和狀態(tài)標(biāo)志都未寫入,由于數(shù)據(jù)寫入在前,狀態(tài)標(biāo)志寫入在后,因此不會(huì)發(fā)生數(shù)據(jù)未寫入但狀態(tài)標(biāo)志已寫入更新的情況,保證存儲(chǔ)區(qū)域中數(shù)據(jù)新舊標(biāo)志不會(huì)產(chǎn)生混亂,在這兩種情況下,根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至block(s-1),并繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中,即這兩種情況下,由于數(shù)據(jù)和狀態(tài)標(biāo)志中至少一項(xiàng)未寫入,此時(shí)會(huì)導(dǎo)致最后一次寫入的數(shù)據(jù)丟失,即blocks區(qū)域的數(shù)據(jù),但本發(fā)明可通過掉電前的正確狀態(tài)標(biāo)志,追溯到掉電前最新一次且正確的數(shù)據(jù)擦寫區(qū)域,即blocks區(qū)域的前一個(gè)區(qū)域block(s-1),并繼續(xù)將數(shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中,使掉電后重新上電過程僅僅影響了當(dāng)時(shí)的數(shù)據(jù)擦寫過程,而對(duì)后續(xù)其他block區(qū)域的數(shù)據(jù)寫入不會(huì)有影響,數(shù)據(jù)以及狀態(tài)標(biāo)志均不會(huì)發(fā)生混亂,將掉電對(duì)數(shù)據(jù)存儲(chǔ)的影響降到最低。

進(jìn)一步地,所述步驟s302具體包括:

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入時(shí),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在兩種有效狀態(tài)時(shí),選擇相鄰兩種有效狀態(tài)對(duì)應(yīng)的block區(qū)域中數(shù)據(jù)最新的block區(qū)域作為blocks;若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志僅有一種有效狀態(tài)時(shí),則令blockn作為blocks;之后繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中;

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在有效狀態(tài)和無效狀態(tài)時(shí),選擇無效狀態(tài)對(duì)應(yīng)的block區(qū)域作為blocks;若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志僅有一種有效狀態(tài)時(shí),則令blockn作為blocks;之后繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中。

具體來說,當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入時(shí),根據(jù)上述循環(huán)寫入數(shù)據(jù)和狀態(tài)更新的過程,正常擦寫數(shù)據(jù)時(shí),所有block區(qū)域中最多只可能同時(shí)出現(xiàn)兩種相鄰的有效狀態(tài),且相鄰兩種有效狀態(tài)對(duì)應(yīng)的block區(qū)域中,排序在前的block區(qū)域的數(shù)據(jù)會(huì)比排序在后的block區(qū)域的數(shù)據(jù)新,選擇排序在前的block區(qū)域?yàn)閎locks。例如在第二輪中的第二次擦寫數(shù)據(jù)時(shí)發(fā)生掉電,由于掉電時(shí)數(shù)據(jù)和狀態(tài)標(biāo)志均正常寫入,此時(shí)block2的狀態(tài)標(biāo)志更新為state2,而block3的狀態(tài)標(biāo)志還未更新,依然為state1,由于狀態(tài)標(biāo)志state2新于state1,即block2中的數(shù)據(jù)比block3中的數(shù)據(jù)新,因此搜尋到block2為掉電前最后一次擦寫數(shù)據(jù)區(qū)域blocks,繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中,即block3中;或者當(dāng)每一輪循環(huán)的最后一次寫入數(shù)據(jù)完成后,此時(shí)所有block區(qū)域的狀態(tài)標(biāo)志全部相同,即僅有一種有效狀態(tài),例如在第二輪中的第n次擦寫數(shù)據(jù)時(shí)發(fā)生掉電,此時(shí)所有block區(qū)域的狀態(tài)標(biāo)志均為state2,因此判斷掉電前最后一次擦寫數(shù)據(jù)區(qū)域?yàn)閎lockn,將blockn作為blocks,繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)中,即block1中。此時(shí)掉電并未對(duì)數(shù)據(jù)造成影響,數(shù)據(jù)沒有丟失,上電后可繼續(xù)按預(yù)設(shè)順序循環(huán)進(jìn)行數(shù)據(jù)擦寫。

當(dāng)blocks的數(shù)據(jù)和狀態(tài)標(biāo)志至少一項(xiàng)未寫入時(shí),此時(shí)包括兩種情況:

第一種為數(shù)據(jù)寫入但狀態(tài)標(biāo)志未寫入,此時(shí)理解為狀態(tài)標(biāo)志被擦除,但未寫入,即掉電時(shí)最后一次擦寫數(shù)據(jù)的block區(qū)域中,狀態(tài)標(biāo)志為被擦除后的默認(rèn)值,即無效標(biāo)志,因此當(dāng)所有block區(qū)域的狀態(tài)標(biāo)志存在有效狀態(tài)和無效狀態(tài)時(shí),據(jù)此選擇無效狀態(tài)對(duì)應(yīng)的block區(qū)域作為blocks,無效狀態(tài)對(duì)應(yīng)的block區(qū)域的前一個(gè)區(qū)域即為block(s-1),此時(shí)最新且正確的數(shù)據(jù)在block(s-1)中,因此繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中;

第二種情況為數(shù)據(jù)和狀態(tài)標(biāo)志均未寫入,此時(shí)理解為最后一次擦寫數(shù)據(jù)的block區(qū)域中,狀態(tài)標(biāo)志未被擦除,保留為前一次寫入的值,由于在掉電前數(shù)據(jù)和狀態(tài)標(biāo)志均為正常寫入,因此同樣最多只可能同時(shí)出現(xiàn)兩種相鄰的有效狀態(tài),若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志存在兩種有效狀態(tài)時(shí),選擇相鄰兩種有效狀態(tài)對(duì)應(yīng)的block區(qū)域中數(shù)據(jù)最新的block區(qū)域作為block(s-1),即當(dāng)最后一次擦寫數(shù)據(jù)時(shí),數(shù)據(jù)和狀態(tài)標(biāo)志均未寫入,則blocks的狀態(tài)標(biāo)志保留為上一輪的值,此時(shí)存儲(chǔ)區(qū)域中,數(shù)據(jù)最新且正確的區(qū)域?yàn)閎lock(s-1),因此在相鄰有效狀態(tài)對(duì)應(yīng)的block區(qū)域中,狀態(tài)標(biāo)志更新的區(qū)域?yàn)閎lock(s-1),而狀態(tài)標(biāo)志更舊的區(qū)域?yàn)閎locks。例如在第二輪中的第二次擦寫數(shù)據(jù)時(shí)發(fā)生掉電,由于掉電時(shí)數(shù)據(jù)和狀態(tài)標(biāo)志均未寫入,此時(shí)block2的狀態(tài)標(biāo)志保留為上一輪的state1,而block1的狀態(tài)標(biāo)志已更新為state2,由于狀態(tài)標(biāo)志state2新于state1,即block1中的數(shù)據(jù)比block2中的數(shù)據(jù)新,因此搜尋到block1為最后一次進(jìn)行擦寫數(shù)據(jù)的區(qū)域前一個(gè)區(qū)域,即掉電前數(shù)據(jù)最新、且正確的區(qū)域,由于block1中的數(shù)據(jù)為有效數(shù)據(jù),因此繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中,即block2中。

而若當(dāng)前所有block區(qū)域的狀態(tài)標(biāo)志僅有一種有效狀態(tài)時(shí),即此時(shí)所有block區(qū)域的狀態(tài)標(biāo)志全部相同,此時(shí)發(fā)生的情況為在每一輪中的第一次擦寫數(shù)據(jù)是發(fā)生掉電,例如在第二輪中的第一次擦寫數(shù)據(jù)時(shí)發(fā)生掉電,由于掉電時(shí)數(shù)據(jù)和狀態(tài)標(biāo)志均未寫入,此時(shí)block1的狀態(tài)標(biāo)志保留為上一輪的state1,所有block區(qū)域的狀態(tài)標(biāo)志均為state1,此時(shí)判斷掉電前最后一次擦寫數(shù)據(jù)區(qū)域?yàn)閎lock1,即blocks,而掉電前數(shù)據(jù)最新、且正確的區(qū)域?yàn)閎lockn,即block(s-1),由于blockn中的數(shù)據(jù)為有效數(shù)據(jù),因此繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中,即block1中。

上述兩種情況雖然會(huì)因?yàn)榈綦妼?dǎo)致最后一次寫入的數(shù)據(jù)丟失,但是本發(fā)明可通過掉電前的正確狀態(tài)標(biāo)志,追溯到掉電前最新一次且正確的數(shù)據(jù)擦寫區(qū)域,即blocks區(qū)域的前一個(gè)區(qū)域block(s-1),并繼續(xù)將數(shù)據(jù)和狀態(tài)標(biāo)志寫入blocks中,相當(dāng)于恢復(fù)了掉電前的備份數(shù)據(jù),使掉電后重新上電過程僅僅影響了當(dāng)時(shí)的數(shù)據(jù)擦寫過程,而對(duì)后續(xù)其他block區(qū)域的數(shù)據(jù)寫入不會(huì)有影響,數(shù)據(jù)以及狀態(tài)標(biāo)志均不會(huì)發(fā)生混亂,將掉電對(duì)數(shù)據(jù)存儲(chǔ)的影響降到最低。

基于上述數(shù)據(jù)存儲(chǔ)方法,本發(fā)明還相應(yīng)提供一種存儲(chǔ)裝置,所述存儲(chǔ)裝置存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序適于被執(zhí)行以實(shí)現(xiàn)如上所述的數(shù)據(jù)存儲(chǔ)方法。由于上文已對(duì)所述數(shù)據(jù)存儲(chǔ)方法進(jìn)行了詳細(xì)描述,此處不作詳述,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。

基于上述數(shù)據(jù)存儲(chǔ)方法,本發(fā)明還相應(yīng)提供一種智能終端,如圖2所示,所述智能終端包括處理器10、與所述處理器10通信連接的存儲(chǔ)器20,以及用于信號(hào)傳輸?shù)耐ㄐ沤涌?0,所述處理器10、存儲(chǔ)區(qū)20以及通信接口30均通過通信總線40連接。其中,所述存儲(chǔ)器20存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序被處理器10執(zhí)行以實(shí)現(xiàn)如上所述的數(shù)據(jù)存儲(chǔ)方法;所述處理器10用于調(diào)用所述存儲(chǔ)器20中的計(jì)算機(jī)程序,以執(zhí)行如上所述的數(shù)據(jù)存儲(chǔ)方法。由于上文已對(duì)所述數(shù)據(jù)存儲(chǔ)方法進(jìn)行了詳細(xì)描述,此處不作詳述,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。

為更好地理解本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法的實(shí)施過程,以下結(jié)合圖3,舉具體應(yīng)用實(shí)施例對(duì)本發(fā)明的數(shù)據(jù)存儲(chǔ)方法的數(shù)據(jù)存儲(chǔ)過程進(jìn)行詳細(xì)說明:

如圖3所示,圖中r代表當(dāng)前有效block的標(biāo)號(hào),w代表下一寫入block的標(biāo)號(hào),f代表下一寫入的狀態(tài)標(biāo)志的標(biāo)號(hào),本發(fā)明應(yīng)用實(shí)施例中的數(shù)據(jù)存儲(chǔ)流程具體包括如下步驟:

s11、上電后讀取所有block的狀態(tài)標(biāo)志;

s12、判斷block1的狀態(tài)標(biāo)志是否有效,若是,則執(zhí)行步驟s13,若否,則執(zhí)行步驟s18;

s13、令r=1,w=2;

s14、判斷blockw的狀態(tài)標(biāo)志是否無效或者舊于blockr的狀態(tài)標(biāo)志,若是,則執(zhí)行步驟s20,若否,則執(zhí)行步驟s15;

s15、判斷w是否等于n,若是,則執(zhí)行步驟s16,若否,則執(zhí)行步驟s17;

s16、令r=n,w=1后執(zhí)行步驟s20;

s17、令r=w,w=w+1后跳轉(zhuǎn)至步驟s14;

s18、判斷blockn的狀態(tài)標(biāo)志是否有效,若是,則執(zhí)行步驟s19,若否,則執(zhí)行步驟s25;

s19、令r=n,w=1后執(zhí)行步驟s20;

s20、blockr中的數(shù)據(jù)為有效數(shù)據(jù),且blockr中的狀態(tài)標(biāo)志為statek,令f=k;

s21、判斷r是否等于n,若是,則執(zhí)行步驟s22,若否,則執(zhí)行步驟s26;

s22、判斷f是否等于m,若是,則執(zhí)行步驟s23,若否,則執(zhí)行步驟s24;

s23、令f=1后執(zhí)行步驟s26;

s24、令f=f+1后執(zhí)行步驟s26

s25、此時(shí)無有效數(shù)據(jù),令r=null,w=1,f=1后執(zhí)行步驟s26;

s26、檢測(cè)需要寫入新數(shù)據(jù);

s27、將數(shù)據(jù)寫入blockw的數(shù)據(jù)區(qū);

s28、將statef寫入blockw的標(biāo)志區(qū);

s29、令r=w;

s30、判斷w是否等于n,若是,則執(zhí)行步驟s31,若否,則執(zhí)行步驟s32;

s31、令w=1后跳轉(zhuǎn)至步驟s20;

s32、令w=w+1后跳轉(zhuǎn)至步驟s20。

在一個(gè)具體實(shí)例中,假設(shè)存儲(chǔ)器大容量為128x8bit,按byte地址訪問,一個(gè)扇區(qū)為1byte,扇區(qū)擦除后所有bit都為1。

現(xiàn)定義一個(gè)block包含2個(gè)扇區(qū)其中1byte的數(shù)據(jù)區(qū),和1byte的標(biāo)志區(qū)。使用n(n=5)個(gè)block作為循環(huán)存儲(chǔ),定義m(m=4)個(gè)有效狀態(tài)標(biāo)志分別為state1=8’b00000001,state2=8’b00000010,state3=8’b00000100,state4=8’b00001000,其余狀態(tài)為無效狀態(tài),各block的數(shù)據(jù)區(qū)地址和標(biāo)志區(qū)的地址分別為block1(0x00,0x05),block2(0x01,0x06)block3(0x02,0x07)block4(0x03,0x08)block5(0x04,0x09).

假設(shè)第一次使用時(shí)所有bit處于擦除狀態(tài)。第一次上電時(shí)讀出各block的標(biāo)志區(qū)即0x05~0x09的值均為8’b11111111為無效標(biāo)志。因此,無有效數(shù)據(jù),即r=null,w=1,f=1,當(dāng)需要寫新數(shù)據(jù)時(shí),要寫入block1,先擦除0x00,把用戶數(shù)據(jù)寫入0x00,然后擦除0x05,把狀態(tài)標(biāo)志state1=8’b00000001寫入0x05,此時(shí)r和w被重新賦值r=w=1,w=w+1=2,因?yàn)閞不等于n(即5),f依然等于1;當(dāng)再有數(shù)據(jù)需要寫入時(shí),要寫入block2,先擦除0x01,把用戶數(shù)據(jù)寫入0x01,然后擦除0x06,把狀態(tài)標(biāo)志state1=8’b00000001寫入0x06,此時(shí)r和w被重新賦值r=2,w=3,因?yàn)閞不等于n(即5),f依然等于1,如此類推,4次寫入后,假設(shè)r=4,w=5,f=1,當(dāng)需要寫新數(shù)據(jù)時(shí),要寫入block5,先擦除0x04,把用戶數(shù)據(jù)寫入0x04,然后擦除0x09,把狀態(tài)標(biāo)志state1=8’b00000001寫入0x09,此時(shí)完成一輪循環(huán)寫入,r和w被重新賦值r=w=5,w=1,因?yàn)閞=n(即5),f≠m(即4),則f也要重新賦值f=f+1=2,當(dāng)再有數(shù)據(jù)需要寫入時(shí),要寫入block1,先擦除0x00,把用戶數(shù)據(jù)寫入0x00,然后擦除0x05,把狀態(tài)標(biāo)志state2=8’b00000010寫入0x05。

如此類推,經(jīng)過多輪寫入后,例如經(jīng)過3輪寫入后,第4輪第五次寫入時(shí),則當(dāng)前r=4,w=5,f=4,當(dāng)需要寫新數(shù)據(jù)時(shí),要寫入block5,先擦除0x04,把用戶數(shù)據(jù)寫入0x04,然后擦除0x09,把狀態(tài)標(biāo)志state4=8’b00001000寫入0x09,此時(shí)r和w被重新賦值r=5,w=1,因?yàn)閞=n(即5),f=m(即4),則f也要重新賦值f=1,此時(shí)完成4輪寫入,即m*n次寫入,當(dāng)再有數(shù)據(jù)需要寫入時(shí),即第m*n+1次寫入時(shí),要寫入block1,先擦除0x00,把用戶數(shù)據(jù)寫入0x00,然后擦除0x05,把狀態(tài)標(biāo)志state1=8’b00000001寫入0x05。

此時(shí)如果出現(xiàn)掉電,重新上電的情況,即在第m*n+1次擦寫數(shù)據(jù),寫入block1時(shí)出現(xiàn)掉電情況,會(huì)出現(xiàn)以下幾種情況

1、數(shù)據(jù)和標(biāo)志都正常寫入;

2、數(shù)據(jù)寫入,但標(biāo)志未寫入,理解為標(biāo)志被擦除,但未寫入;

3、數(shù)據(jù)和標(biāo)志都未寫入,理解為標(biāo)志未被擦除,保留為前一次寫入的值。

第1種情況,如果數(shù)據(jù)和標(biāo)志都正常寫入,重新上電時(shí)讀則出block1的標(biāo)志為state1,block2的標(biāo)志為state4,而由于這兩個(gè)相鄰狀態(tài)中state1新于state4,因此步驟s14時(shí)判斷為是,之后跳轉(zhuǎn)至步驟s20,得到r=1,w=2,f=1,繼續(xù)執(zhí)行后續(xù)數(shù)據(jù)擦寫過程。

第2種情況,如果標(biāo)志被擦除,但未寫入,重新上電時(shí)讀出block1的標(biāo)志為8’b11111111,為無效標(biāo)志,而block5的標(biāo)志為state4,由此得出r=5,w=1,f=1,即搜尋到掉電前最新、且正確的數(shù)據(jù)為block5中的數(shù)據(jù),繼續(xù)將數(shù)據(jù)和狀態(tài)標(biāo)志寫入block1中。

第3種情況,如果標(biāo)志未被擦除,保留為前一次寫入的值,重新上電時(shí)則讀出block1~block5的標(biāo)志均為state4,因此沒有無效標(biāo)志且沒有1個(gè)block的標(biāo)志新于其他block,則經(jīng)過步驟s14至步驟s17的循環(huán)后得到r=5,w=1,f=1,同樣可以搜尋到掉電前最新、且正確的數(shù)據(jù)為block5中的數(shù)據(jù),繼續(xù)將數(shù)據(jù)和狀態(tài)標(biāo)志寫入block1中。

從上述三種情況可看出,雖然在發(fā)生數(shù)據(jù)錯(cuò)誤的第2種和第3種情況下,最后一次寫操作時(shí)掉電會(huì)導(dǎo)致最后一次數(shù)據(jù)丟失,但本發(fā)明依然可以通過本發(fā)明追溯掉電前最新一次且正確的數(shù)據(jù)擦寫區(qū)域,相當(dāng)于恢復(fù)了掉電前的備份數(shù)據(jù),將掉電對(duì)數(shù)據(jù)存儲(chǔ)的影響降到最低。

需說明的是,以上僅示出在第m*n+1次擦寫數(shù)據(jù),寫入block1時(shí)出現(xiàn)掉電的情況,在其他任意次數(shù)擦寫時(shí)出現(xiàn)掉電后重新上電的情況均能通過本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法恢復(fù)至掉電前正進(jìn)行擦寫正確數(shù)據(jù)的區(qū)域,具體請(qǐng)參閱上述方法實(shí)施例,此處不作詳述。

綜上所述,本發(fā)明提供的數(shù)據(jù)存儲(chǔ)方法、存儲(chǔ)裝置及智能終端中,所述數(shù)據(jù)存儲(chǔ)方法通過將存儲(chǔ)區(qū)域劃分為n個(gè)block區(qū)域,記為block1、block2、...、blockn,每個(gè)block區(qū)域包括用于保存數(shù)據(jù)的數(shù)據(jù)區(qū)和用于保存狀態(tài)標(biāo)志的標(biāo)志區(qū);按預(yù)設(shè)順序循環(huán)在n個(gè)block區(qū)域的數(shù)據(jù)區(qū)中擦寫數(shù)據(jù),并在寫入數(shù)據(jù)后更新每個(gè)block區(qū)域中標(biāo)志區(qū)的狀態(tài)標(biāo)志;當(dāng)擦寫過程發(fā)生掉電時(shí),重新上電后根據(jù)所有block區(qū)域的狀態(tài)標(biāo)志搜尋至blocks或block(s-1),繼續(xù)按預(yù)設(shè)順序?qū)?shù)據(jù)和狀態(tài)標(biāo)志寫入block(s+1)或blocks中,其中blocks為掉電時(shí)最后一次進(jìn)行擦寫數(shù)據(jù)的block區(qū)域,通過將存儲(chǔ)區(qū)域進(jìn)行劃分并設(shè)置標(biāo)志區(qū),在每個(gè)區(qū)域?qū)懭霐?shù)據(jù)后更新其狀態(tài)標(biāo)志,當(dāng)發(fā)生掉電情況時(shí),重新上電后能根據(jù)所有區(qū)域的狀態(tài)標(biāo)志恢復(fù)至掉電前正在進(jìn)行擦寫數(shù)據(jù)的區(qū)域,確保數(shù)據(jù)存儲(chǔ)的正確性不受掉電的影響。

可以理解的是,對(duì)本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)本發(fā)明的技術(shù)方案及其發(fā)明構(gòu)思加以等同替換或改變,而所有這些改變或替換都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1