本發(fā)明屬于電子技術(shù)領(lǐng)域,具體涉及一種提高flash參數(shù)保存次數(shù)的實現(xiàn)方法。
背景技術(shù):
flash存儲器(可編程只讀存儲器,以下簡稱flash)是intel公司于1988年推出的一種新型半導(dǎo)體存儲器,具有非揮發(fā)存儲特性,簡稱閃存,該類只讀存儲器具有集成度高、讀取速度快、單一供電、再編程次數(shù)多等顯著優(yōu)點,flash存儲器作為非易失數(shù)據(jù)存儲設(shè)備,被廣泛地應(yīng)用于嵌入式系統(tǒng)中。單片機(jī)片內(nèi)的flash可以在線編程,也可以存儲程序運行時的數(shù)據(jù)。
由于flash在寫入時,只能把其位由1變?yōu)?,每位寫之前必須先變?yōu)?,也即是進(jìn)行擦除;且flash擦除由最小區(qū)域限制,即一次至多要擦除一個扇區(qū),如fm28335的flash容量為256k,分8個扇區(qū),每次至多擦除32k;因此,基于這些特點,flash芯片在使用時,需要進(jìn)行多次擦除,但是,flash芯片的壽命是由擦除次數(shù)限制,如fm28335可承受的擦除次數(shù)為10萬次,那么,當(dāng)擦寫次數(shù)過多時,會導(dǎo)致整個flash芯片損壞掉,進(jìn)而降低flash芯片的使用壽命。
隨著電子技術(shù)的發(fā)展,dsp本身自帶的flash容量也越做越大,除保存程序代碼外往往還能剩很大空間,為了避免在flash存儲器并未存滿,仍然進(jìn)行一次擦除,因擦寫次數(shù)過多而導(dǎo)致falsh芯片損壞,壽命降低的問題,急需一種提高flash芯片的使用壽命的方法。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供一種提高flash參數(shù)保存次數(shù)的實現(xiàn)方法,用以解決現(xiàn)有flash因并未存滿而仍然進(jìn)行多次擦寫而導(dǎo)致flash芯片損壞的問題。
為實現(xiàn)上述目的,本發(fā)明采用一種提高flash參數(shù)保存次數(shù)的實現(xiàn)方法,包括以下步驟:
(1)在flash保存區(qū)劃分出至少2個虛擬分區(qū);
(2)通過查看flash保存區(qū)起始地址的寄存器中的數(shù)值,判斷虛擬分區(qū)是否已寫過;若數(shù)值為0xffff,則虛擬分區(qū)未寫過,否則已寫過;
(3)若虛擬分區(qū)未寫過,則將數(shù)值為0xffff寫進(jìn)以flash保存區(qū)起始地址為地址的寄存器中;
(4)若虛擬分區(qū)已寫過,則判斷虛擬分區(qū)是否已寫完;若所有虛擬分區(qū)已寫完畢,則一次性擦除整個flash保存區(qū),并將數(shù)值為0xffff寫進(jìn)以flash保存區(qū)起始地址為地址的寄存器中;若虛擬分區(qū)未寫完,則繼續(xù)寫入?yún)?shù),并將參數(shù)按順序地保存在與最近一次保存虛擬分區(qū)相連的一個虛擬分區(qū)內(nèi)。
所述步驟(4)中:比較當(dāng)前參數(shù)起始地址與最后一個虛擬分區(qū)的起始地址,若當(dāng)前參數(shù)起始地址大于等于最后一個虛擬分區(qū)的起始地址,則flash虛擬區(qū)已寫完畢,否則虛擬分區(qū)還未寫完。
所述的當(dāng)前參數(shù)起始地址和最后一個虛擬分區(qū)的起始地址分別為:
pst=fps
pfp=fps+floor((fps-fpn)/spl)
其中fps指flash的起始地址,初始設(shè)定為fps=0x*******,fpn指flash尾或結(jié)束地址,初始設(shè)定為fpn=0x******,spl指所要保存的參數(shù)個數(shù),floor指取小于或等于給定實數(shù)的最大整數(shù)。
在flash中的零虛擬分區(qū)建立索引區(qū),所述索引區(qū)包括索引地址。
當(dāng)虛擬分區(qū)未寫過或已寫完且虛擬分區(qū)中的參數(shù)已擦拭完畢,則執(zhí)行
pst=fps+spl
indexl=0
indexr=0;
并把0xfffe寫進(jìn)以flash起始地址為地址的寄存器中,然后把參數(shù)寫入以當(dāng)前參數(shù)起始地址為首地址的寄存器里面;
其中,pst為當(dāng)前參數(shù)起始地址,fps指flash起始地址,spl指所要保存的參數(shù)個數(shù),indexl指行索引,indexr指列索引。
若虛擬分區(qū)還未寫完,則判斷列索引的指向,若列索引指向sml-1位,執(zhí)行
indexr=0
indexl++
tempt=0xfffe;
則計算虛擬分區(qū)首地址,執(zhí)行
pst=fps+(indexl*sml+indexr+1)*spl
把tempt值寫進(jìn)地址為fps+indexl的寄存器,然后把參數(shù)寫入以當(dāng)前參數(shù)起始地址為首地址的寄存器里面;
若列索引未指向sml-1位,執(zhí)行
indexr++
tempt=1
tempt=*(fps+indexl)-(tempt<<indexr);
則計算虛擬分區(qū)首地址,執(zhí)行
pst=fps+(indexl*sml+indexr+1)*spl
把tempt值寫進(jìn)地址為fps+indexl的寄存器,然后把參數(shù)寫入以當(dāng)前參數(shù)起始地址為首地址的寄存器里面;
其中,indexl指行索引,indexr指列索引,tempt指無標(biāo)識位的16位進(jìn)制數(shù),*指取內(nèi)容,<<indexr指左移列索引位,pst為當(dāng)前參數(shù)起始地址,fps指flash的起始地址,初始設(shè)定為fps=0x*******,sml指單個寄存器所包含的位數(shù),spl指所要保存的參數(shù)個數(shù),fps+indexl指從flash的起始地址向下數(shù)indexl個的地址。
本發(fā)明提出一種提高flash參數(shù)保存次數(shù)的實現(xiàn)方法,其不需要任何硬件變更,參數(shù)保存次數(shù)由原來的flash的可擦寫次數(shù)提高到虛擬分區(qū)的個數(shù)乘以flash可擦寫次數(shù),在參數(shù)保存次數(shù)不變的前提下,大大的延長了flash使用壽命。
本發(fā)明還通過零虛擬分區(qū)的索引地址可以快速的查找到參數(shù)保存的寄存器首地址,提高了設(shè)備運行速率,同時,便于在虛擬分區(qū)未寫完時,繼續(xù)寫入。
附圖說明
圖1是本發(fā)明中flash參數(shù)保存次數(shù)的實現(xiàn)方法示意圖;
圖2是本發(fā)明中flash參數(shù)保存次數(shù)的實現(xiàn)方法流程圖。
具體實施方式
下面將結(jié)合附圖及實施例對本發(fā)明作進(jìn)一步說明。
本發(fā)明提出了一種提高flash參數(shù)保存次數(shù)的實現(xiàn)方法,包括如下步驟:
(1)在flash保存區(qū)劃分出至少2個虛擬分區(qū);
(2)通過查看flash保存區(qū)起始地址的寄存器中的數(shù)值,判斷虛擬分區(qū)是否已寫過;若數(shù)值為0xffff,則虛擬分區(qū)未寫過,否則已寫過;
(3)若虛擬分區(qū)未寫過,則將數(shù)值為0xffff寫進(jìn)以flash保存區(qū)起始地址為地址的寄存器中;
(4)若虛擬分區(qū)已寫過,則判斷虛擬分區(qū)是否已寫完;若所有虛擬分區(qū)已寫完畢,則一次性擦除整個flash保存區(qū),并將數(shù)值為0xffff寫進(jìn)以flash保存區(qū)起始地址為地址的寄存器中;若虛擬分區(qū)未寫完,則繼續(xù)寫入?yún)?shù),并將參數(shù)按順序地保存在與最近一次保存虛擬分區(qū)相連的一個虛擬分區(qū)內(nèi)。
本發(fā)明在保存參數(shù)次數(shù)不變的前提下,可以有效的延長flash使用壽命。
本發(fā)明中包括初始參數(shù)的設(shè)定、flash初次寫的識別、虛擬分區(qū)已寫完的識別、索引地址的計算、虛擬分區(qū)首地址的計算。
首先,初始參數(shù)的設(shè)定為:
fps=0x*******
fpn=0x*******
sml=0x**
spl=0x**
pst=fps
pfp=fps+floor((fps-fpn)/spl)
其中fps指flash起始(或首)地址,fpn指flash結(jié)束(或尾)地址,sml指單個寄存器所包含的位數(shù)(默認(rèn)為16位),spl指所要保存的參數(shù)個數(shù),floor指取小于或等于給定實數(shù)的最大整數(shù),pfp指所保存參數(shù)最后一個虛擬分區(qū)起始地址。
其次,通過查看地址為flash起始地址fps的寄存器中的數(shù)值,若此數(shù)值為
0xffff,則flash寄存器未寫過,若此數(shù)值不為0xffff,則flash寄存器已寫過;同時,通過對比當(dāng)前參數(shù)起始地址pst與最后一個虛擬分區(qū)的起始地址pfp,若
pst>=pfp,則flash虛擬區(qū)已寫完畢,擦除flash參數(shù)所在的扇區(qū),否則虛擬分區(qū)還未寫完。
當(dāng)flash未寫過或flash虛擬分區(qū)已寫完且參數(shù)所在的扇區(qū)已擦拭完畢,并令
pst=fps+spl
indexl=0
indexr=0
把0xfffe寫進(jìn)以flash起始地址fps為地址的寄存器中,然后就可以將參數(shù)數(shù)據(jù)寫入以當(dāng)前參數(shù)起始地址pst為首地址的寄存器里面;
其中,pst為當(dāng)前參數(shù)起始地址,fps指flash起始地址,spl指所要保存的參數(shù)個數(shù),indexl指行索引,indexr指列索引。
若flash虛擬分區(qū)未寫完,則判斷列索引的指向。若列索引指向sml-1位,執(zhí)行
indexr=0
indexl++
tempt=0xfffe
若列索引未指向sml-1位,執(zhí)行
indexr++
tempt=1
tempt=*(fps+indexl)-(tempt<<indexr)
其中,indexl指行索引,indexr指列索引,tempt指無標(biāo)識位的16位進(jìn)制數(shù),*指取內(nèi)容,<<indexr指左移indexr位;
最后,計算虛擬分區(qū)首地址,執(zhí)行
pst=fps+(indexl*sml+indexr+1)*spl
并把tempt值寫進(jìn)地址為fps+indexl的寄存器中,然后將把參數(shù)寫入以pst為首地址的寄存器里面。其中,pst為當(dāng)前參數(shù)起始地址,fps指flash的起始地址,初始設(shè)定為fps=0x*******,sml指單個寄存器所包含的位數(shù),spl指所要保存的參數(shù)個數(shù),fps+indexl指從flash的起始地址向下數(shù)indexl個的地址。
下面對本發(fā)明的工作過程作詳細(xì)說明,所述工作過程以本發(fā)明技術(shù)方案為前提進(jìn)行實施,給出了具體的實施方式和操作過程。
如圖1所示,本方法根據(jù)參數(shù)長度大小,自動在flash保存區(qū)劃分出n+1個虛擬分區(qū),包括索引區(qū)和數(shù)據(jù)保存區(qū),其中零虛擬分區(qū)即為索引區(qū),數(shù)據(jù)保存區(qū)依次分為第一虛擬分區(qū)、第二虛擬分區(qū)…第n虛擬分區(qū)。
本方法中每次參數(shù)按順序地保存在與最近一次保存虛擬分區(qū)相連的一個虛擬分區(qū)內(nèi),直到所有虛擬分區(qū)用完,一次性的擦除整個flash保存區(qū),重新從第一虛擬分區(qū)開始順序地往虛擬分區(qū)中保存參數(shù)。另外,本方法在零虛擬分區(qū)建立索引區(qū),通過索引區(qū)中的索引地址能夠快速的查找到當(dāng)前參數(shù)要保存的寄存器的起始地址。
具體的實現(xiàn)過程,如圖2所示,包括初始參數(shù)設(shè)定、flash初次寫的識別、虛擬分區(qū)已寫完的識別、索引地址的計算、虛擬分區(qū)首地址的計算等10個模塊。
在初始參數(shù)設(shè)定模塊1中,不但要設(shè)定flash起始(或首)地址fps,flash尾(或結(jié)束)地址fpn,單個寄存器所包含的位數(shù)(默認(rèn)為16位)sml,所要保存的參數(shù)個數(shù)spl,而且要通過以下公式計算出所保存參數(shù)最后一個虛擬分區(qū)起始地址pfp
pfp=fps+floor((fps-fpn)/spl)
在以上完成后進(jìn)入模塊2。
通過查看地址為fps的寄存器中的數(shù)值完成flash初次寫識別模塊2,若此數(shù)值為0xffff,則flash寄存器未寫過,若此數(shù)值不為0xffff,則flash寄存器已寫過。
若flash已寫過,則進(jìn)入虛擬分區(qū)已寫完的識別模塊3中。通過對比當(dāng)前參數(shù)起始地址pst與最后一個虛擬分區(qū)的起始地址pfp,若大于等于,則flash參數(shù)區(qū)已寫完畢,并進(jìn)入模塊4擦除flash參數(shù)所在的扇區(qū),否則虛擬分區(qū)還未寫完。
若flash寄存器未寫過或模塊4已執(zhí)行完成,則進(jìn)入模塊5。令
pst=fps+spl
indexl=0
indexr=0
并把0xfffe寫進(jìn)以fps為地址的寄存器中,也即進(jìn)行初始化后,把零虛擬分區(qū)(索引區(qū))跳過,寫數(shù)據(jù)時會自動在第一個虛擬分區(qū)寫入。
若模塊3判斷虛擬分區(qū)未寫完,則進(jìn)入模塊6判斷列索引的指向。若列索引指向sml-1位,則進(jìn)入模塊8,執(zhí)行
indexr=0
indexl++
tempt=0xfffe
若列索引未指向sml-1位,則進(jìn)入模塊7,執(zhí)行
indexr++
tempt=1
tempt=*(fps+indexl)-(tempt<<indexr)
其中tempt指無標(biāo)識位的16位進(jìn)制數(shù),*指取內(nèi)容,<<indexr指左移indexr位。
若執(zhí)行完模塊7或模塊8,則進(jìn)入模塊9計算虛擬分區(qū)首地址,執(zhí)行
pst=fps+(indexl*sml+indexr+1)*spl
若模塊5或模塊9執(zhí)行完畢,則進(jìn)入模塊10,把參數(shù)寫進(jìn)以pst為首地址的寄存器里面。
若模塊10執(zhí)行完畢,則進(jìn)入下一個周期,重新從模塊2開始執(zhí)行。
本發(fā)明通過增加參數(shù)可寫次數(shù)達(dá)到延長flash使用壽命的目的,本領(lǐng)域技術(shù)人員應(yīng)當(dāng)明白,在不脫離本發(fā)明范圍的情況下,還可以對本發(fā)明進(jìn)行各種變換及等同替代。因此,本發(fā)明不局限于所公開的具體實施例和示意圖,而應(yīng)當(dāng)包括落入本發(fā)明權(quán)利要求范圍內(nèi)的全部實施方式。