
本發(fā)明涉及數(shù)據(jù)存儲(chǔ)領(lǐng)域,特別涉及一種flash數(shù)據(jù)讀寫方法及系統(tǒng)。
背景技術(shù):
:針對(duì)嵌入式系統(tǒng)領(lǐng)域的相關(guān)設(shè)備,用戶要求實(shí)時(shí)保存設(shè)備運(yùn)行的數(shù)據(jù),連續(xù)記錄時(shí)間不少于5分鐘,每分鐘數(shù)據(jù)不少于60條記錄,且有足夠存儲(chǔ)空間,數(shù)據(jù)掉電不丟失,存儲(chǔ)器的使用壽命不小于20年。每條記錄長(zhǎng)度20byte(8bit/byte),前面14byte存放的是設(shè)備的狀態(tài)及各種信息,后面6byte存放的是實(shí)時(shí)的年、月、日、時(shí)、分、秒。目前,保存數(shù)據(jù)的方法有:硬盤、電子盤、ram外加電池、flash閃存等。其中,硬盤、電子盤成本高、體積大;ram外加電池的方法由于使用了電池,電池壽命短,不能滿足要求;flash閃存由于其存儲(chǔ)空間大、價(jià)格低廉等優(yōu)勢(shì),被廣泛的應(yīng)用到各類的嵌入式系統(tǒng)中。傳統(tǒng)的flash內(nèi)部分為多個(gè)存儲(chǔ)單元頁(yè)(page),存儲(chǔ)單元頁(yè)是可擦除的最小單位,字節(jié)或字是寫入數(shù)據(jù)的最小單位。flash存儲(chǔ)器的寫操作和一般的存儲(chǔ)器不同,flash的寫操作必須先將存儲(chǔ)單元擦除,然后再寫入。由于flash擦寫次數(shù)有限,頻繁的對(duì)flash存儲(chǔ)器進(jìn)行擦寫會(huì)影響其使用壽命,若不采取特殊處理,壽命不能滿足要求。技術(shù)實(shí)現(xiàn)要素:本發(fā)明主要解決的技術(shù)問(wèn)題是提供一種嵌入式系統(tǒng)(或單片機(jī)內(nèi)置)內(nèi)置flash數(shù)據(jù)存儲(chǔ)、快速查找方法,該發(fā)明可以避免使用ram外加電池降低使用壽命,也可以避免使用硬盤、電子盤增加成本、增大體積,也不需要增加片外存儲(chǔ)器、減小產(chǎn)品單板面積和降低成本。既降低flash的擦寫次數(shù),解決使用壽命問(wèn)題,也解決上電能快速查找到上次關(guān)機(jī)時(shí)最后存儲(chǔ)記錄的位置。針對(duì)上述存在的問(wèn)題,本發(fā)明提供了一種flash數(shù)據(jù)讀寫方法,其特征在于:在flash中分配n頁(yè)為數(shù)據(jù)存儲(chǔ)區(qū),用于存放數(shù)據(jù)記錄,其中一頁(yè)作為索引區(qū),其余n-1頁(yè)作為記錄區(qū),所述方法包括:步驟s101:判斷所述目標(biāo)頁(yè)nm是否寫滿,若未寫滿執(zhí)行s102,若寫滿則轉(zhuǎn)到如下步驟s1a~s1c;步驟s102:將所述待寫入數(shù)據(jù)順序?qū)懭胨鲇涗泤^(qū)的目標(biāo)頁(yè)nm中;步驟s1a:擦除所述記錄區(qū)的頁(yè)nm+2的信息即將該頁(yè)內(nèi)容全部置為0xff的標(biāo)識(shí)信息;步驟s1b:將所述數(shù)據(jù)記錄區(qū)中所述待寫入數(shù)據(jù)的頁(yè)nm+1的頁(yè)碼號(hào)順序?qū)懭胨鏊饕齾^(qū);步驟s1c:將所述待寫入數(shù)據(jù)順序?qū)懭胨鲇涗泤^(qū)的頁(yè)nm+1中;所述步驟s1b之前還包括如下步驟:步驟s201:判斷所述索引區(qū)是否寫滿,若寫滿則執(zhí)行步驟s202;若未寫滿執(zhí)行步驟s1b;步驟s202:擦除所述索引區(qū)所有存儲(chǔ)單元信息即將該頁(yè)內(nèi)容全部置為0xff的標(biāo)識(shí)信息;步驟s203:頁(yè)nm+1的頁(yè)碼號(hào)寫入所述索引區(qū)第一個(gè)存儲(chǔ)單元;所述記錄區(qū)的n-1頁(yè)為一個(gè)循環(huán)隊(duì)列的存儲(chǔ)區(qū)。進(jìn)一步地,所述方法還包括如下步驟,在所述flash啟動(dòng)時(shí),在所述步驟s101之前還執(zhí)行如下步驟:步驟s301:從所述索引區(qū)的最后存儲(chǔ)單元開(kāi)始逆向查找,查找有無(wú)存儲(chǔ)單元中的信息是否等于0xff的標(biāo)識(shí)信息,若不是,則執(zhí)行步驟s302;步驟s302:讀取所述索引區(qū)存儲(chǔ)的頁(yè)碼信息nm,nm即為最后存入的數(shù)據(jù)記錄所在頁(yè)碼;步驟s303:從所述記錄區(qū)第nm頁(yè)中的最后存儲(chǔ)單元開(kāi)始逆向查找,查找存儲(chǔ)單元中的信息是否等于0xff的標(biāo)識(shí)信息,若不是,該字節(jié)所處的地址w是最后存入數(shù)據(jù)記錄的存儲(chǔ)位置;步驟s304:判斷是寫數(shù)據(jù)還是讀數(shù)據(jù),若是寫數(shù)據(jù),則轉(zhuǎn)到步驟s305;若是讀數(shù)據(jù)則轉(zhuǎn)到讀數(shù)據(jù)子程序p1,所述子程序p1為從m頁(yè)w地址開(kāi)始逆向往前讀取記錄,根據(jù)給定的參數(shù)計(jì)算讀取數(shù)據(jù)的長(zhǎng)度,進(jìn)而讀取數(shù)據(jù)相應(yīng)flash的數(shù)據(jù)直到讀取結(jié)束;步驟s305:將所述待寫入數(shù)據(jù)寫入所述的nm頁(yè)的地址w之后的存儲(chǔ)單元。進(jìn)一步地,所述步驟s305之前還包括:步驟s401:判斷地址w是否在頁(yè)nm的最后位置,如是即表示頁(yè)nm已存滿數(shù)據(jù),則轉(zhuǎn)至步驟s1a,若不是,則執(zhí)行步驟s305。進(jìn)一步地,步驟s301之后進(jìn)一步包括:步驟s501:若所述索引區(qū)及記錄區(qū)為0xff的標(biāo)識(shí)信息,則執(zhí)行步驟s502,若不是,則轉(zhuǎn)到步驟s302;步驟s502:所述索引區(qū)第一個(gè)單元寫入所述待寫入數(shù)據(jù)的目標(biāo)頁(yè)的頁(yè)碼信息;步驟s503:按步驟s102執(zhí)行。進(jìn)一步地,所述索引區(qū)為所述數(shù)據(jù)存儲(chǔ)區(qū)的第一頁(yè)或最后一頁(yè)。另外一方面本發(fā)明還公開(kāi)了一種flash數(shù)據(jù)讀寫系統(tǒng),其特征在于:該系統(tǒng)包括:存儲(chǔ)區(qū)劃分模塊,用于在flash中分配n頁(yè)為數(shù)據(jù)存儲(chǔ)區(qū)用于存放數(shù)據(jù)記錄,且每頁(yè)含有相同存儲(chǔ)單元,其中用一頁(yè)作為索引區(qū),其余n-1頁(yè)作為記錄區(qū),所述系統(tǒng)還包括:數(shù)據(jù)寫入模塊:含索引區(qū)寫入模塊和記錄區(qū)寫入模塊,索引區(qū)寫入模塊將數(shù)據(jù)記錄區(qū)待寫入數(shù)據(jù)的目標(biāo)頁(yè)nm的頁(yè)碼號(hào)寫入索引區(qū)存儲(chǔ)單元;記錄區(qū)寫入模塊:將數(shù)據(jù)順序?qū)懭胗涗泤^(qū)的目標(biāo)頁(yè)nm中;第一判斷模塊:判斷數(shù)據(jù)記錄區(qū)的目標(biāo)頁(yè)nm是否寫滿,寫滿后到待寫目標(biāo)頁(yè)由nm頁(yè)變?yōu)閚m+1頁(yè);第一擦除模塊:擦除記錄區(qū)的目標(biāo)頁(yè)nm后第二頁(yè)nm+2的信息即將該頁(yè)內(nèi)容全部置為為特定標(biāo)識(shí)信息。進(jìn)一步地,該系統(tǒng)還包括:第二判斷模塊:判斷所述索引區(qū)的是否寫滿,寫滿后則轉(zhuǎn)至第二擦除模塊;第二擦除模塊:擦除所述索引區(qū)的信息,即將該頁(yè)內(nèi)容全部置為所述特定標(biāo)識(shí)信息;進(jìn)一步地,該系統(tǒng)還包括:記錄查詢模塊:在系統(tǒng)掉電重啟后查詢掉電前記錄所在的位置,先查詢所述索引區(qū)記錄所在的頁(yè)碼,然后到相應(yīng)頁(yè)碼中找到記錄的具體位置。本發(fā)明還公開(kāi)了一種flash數(shù)據(jù)讀寫系統(tǒng),其特征在于,所述系統(tǒng)包括:存儲(chǔ)單元陣列、控制位線以及處理器,其中所述處理器執(zhí)行如權(quán)利要求1-5中任意一項(xiàng)所述的權(quán)利要求的步驟完成數(shù)據(jù)讀寫。進(jìn)一步地,所述索引區(qū)和所述記錄區(qū)每頁(yè)含有相同存儲(chǔ)單元。按照本發(fā)明實(shí)現(xiàn)的flash數(shù)據(jù)讀寫方法和系統(tǒng),其索引號(hào)不是固定在一個(gè)存儲(chǔ)單元,而是在一個(gè)頁(yè)內(nèi)順序存儲(chǔ),指引記錄區(qū)已存入數(shù)據(jù)記錄的頁(yè)碼號(hào),存儲(chǔ)滿后擦除再存儲(chǔ);而數(shù)據(jù)記錄存儲(chǔ)在多個(gè)頁(yè)內(nèi),數(shù)據(jù)記錄每存儲(chǔ)滿一頁(yè)后,即擦除存滿數(shù)據(jù)的頁(yè)的下下頁(yè)的數(shù)據(jù),即只是擦除一頁(yè)數(shù)據(jù),故連續(xù)記錄時(shí)間長(zhǎng),大大降低了flash的擦寫次數(shù),提高了flash的壽命。既解決flash的擦寫使用壽命問(wèn)題,也解決了上電能快速查找到上次關(guān)機(jī)時(shí)最后存儲(chǔ)記錄的位置。附圖說(shuō)明:圖1為本發(fā)明的flash數(shù)據(jù)讀寫方法主程序流程圖;圖2為本發(fā)明的flash數(shù)據(jù)讀寫方法掉電后重啟的程序流程圖一;圖3為本發(fā)明的flash數(shù)據(jù)讀寫方法掉電后重啟的程序流程圖二;圖4為本發(fā)明的嵌入式系統(tǒng)flash數(shù)據(jù)讀寫系統(tǒng)結(jié)構(gòu)框圖一;圖5為本發(fā)明的嵌入式系統(tǒng)flash數(shù)據(jù)讀寫系統(tǒng)結(jié)構(gòu)框圖二;圖6為本發(fā)明的嵌入式系統(tǒng)flash數(shù)據(jù)讀寫系統(tǒng)結(jié)構(gòu)框圖三。具體實(shí)施方式下面結(jié)合實(shí)施例,對(duì)本發(fā)明進(jìn)一步說(shuō)明,下述實(shí)施例是說(shuō)明性的,不是限定性的,不能經(jīng)下述實(shí)施例限定本發(fā)明的保護(hù)范圍。以armcortex-m3核微控制器的內(nèi)置flash為例,詳細(xì)說(shuō)明本發(fā)明的技術(shù)方案的實(shí)現(xiàn)。armcortex-m3核微控制器內(nèi)置flash存儲(chǔ)結(jié)構(gòu)分配如表1。第0—10頁(yè)為程序存儲(chǔ)區(qū),第11頁(yè)至第126頁(yè)即共116頁(yè)為數(shù)據(jù)存放區(qū),其中第11頁(yè)為數(shù)據(jù)存放區(qū)的數(shù)據(jù)索引區(qū),也可第126頁(yè)設(shè)為數(shù)據(jù)索引區(qū),其余115頁(yè)為數(shù)據(jù)記錄區(qū);第127頁(yè)為參數(shù)配置存放區(qū)。表1armcortex-m3核微控制器內(nèi)置flash存儲(chǔ)結(jié)構(gòu)分配在下載程序代碼時(shí),將數(shù)據(jù)存放區(qū)第11~第126頁(yè)的信息擦除,即存儲(chǔ)器單元內(nèi)容全部置為標(biāo)識(shí)信息0xff。設(shè)備投入使用后,根據(jù)要求定時(shí)保存記錄。記錄按要求保存在數(shù)據(jù)存放區(qū)的目標(biāo)頁(yè),先將該目標(biāo)頁(yè)的頁(yè)碼號(hào)寫入索引區(qū),然后將需要記錄的數(shù)據(jù)按先后順序?qū)懭朐撃繕?biāo)頁(yè)中。如圖1所示,為按照本發(fā)明實(shí)現(xiàn)的flash數(shù)據(jù)讀寫方法的主要程序流程示意圖,具體為:步驟s101:判斷所述目標(biāo)頁(yè)nm是否寫滿,若未寫滿執(zhí)行s102,若寫滿則轉(zhuǎn)到如下步驟s1a~s1c;步驟s102:產(chǎn)品投入首次上電后,記錄區(qū)第一頁(yè)即第12頁(yè)的頁(yè)碼號(hào)寫入索引區(qū)即數(shù)據(jù)存放區(qū)第11頁(yè)的第一個(gè)存儲(chǔ)單元,步驟s103:需要記錄的數(shù)據(jù)按先后順序?qū)懭胗涗泤^(qū)的第一頁(yè)即第12頁(yè)中;步驟s104:第一頁(yè)即第12頁(yè)寫滿時(shí),采用如下步驟:步驟s1a:擦除記錄區(qū)的第三頁(yè)即第14頁(yè)的信息即為0xff的標(biāo)識(shí)信息;步驟s1b:將記錄區(qū)第二頁(yè)即第13頁(yè)的頁(yè)碼號(hào)按順序?qū)懭胨饕齾^(qū)第二個(gè)存儲(chǔ)單元;步驟s1c:需要記錄的數(shù)據(jù)順序?qū)懭胗涗泤^(qū)的第二頁(yè)即頁(yè)13中;記錄區(qū)的n-1頁(yè)即第12與第126頁(yè)之間為一個(gè)列隊(duì)循環(huán)的存儲(chǔ)區(qū),頁(yè)碼號(hào)順序存儲(chǔ)在索引區(qū)。flash只能從偶數(shù)地址開(kāi)始存儲(chǔ)信息,所以索引區(qū)有1k字節(jié)的存儲(chǔ)量,而記錄區(qū)每一個(gè)循環(huán)的頁(yè)碼量是115,故循近9次索引區(qū)才能被寫滿。步驟s1b之前還包括:步驟s202:預(yù)先判斷索引區(qū)存儲(chǔ)單元是否寫滿,若寫滿則執(zhí)行步驟202;若未寫滿執(zhí)行步驟s1b;步驟s202:擦除索引區(qū)所有存儲(chǔ)單元信息即將該頁(yè)內(nèi)容全部置為0xff的標(biāo)識(shí)信息;步驟s203:頁(yè)nm+1的頁(yè)碼號(hào)寫入索引區(qū)第一個(gè)存儲(chǔ)單元。本發(fā)明的技術(shù)方案在設(shè)備使用中掉電后重新啟動(dòng)時(shí),首先查找上次關(guān)機(jī)時(shí)最后寫入記錄的存儲(chǔ)位置。然后根據(jù)上述方法繼續(xù)在上次存放記錄的后面順序存放記錄或根據(jù)設(shè)定讀取記錄。如圖示2所示,具體如下:步驟s301:從頁(yè)11索引區(qū)的最后存儲(chǔ)單元開(kāi)始往回查找,查找某字節(jié)不為0xff示意如表2,其中0x**、nm-2、nm-1、nm(m取值范圍在12~126之間)表示該數(shù)據(jù)不是0xff,步驟s302:讀取索引區(qū)該存儲(chǔ)單元中的存儲(chǔ)的頁(yè)碼信息nm,nm即為最后存入的數(shù)據(jù)記錄所在頁(yè)碼,即表示掉電前最后記錄存放在第nm頁(yè)中。步驟s303:從第nm頁(yè)中的最后存儲(chǔ)單元開(kāi)始往回查找,找到w單元的數(shù)據(jù)內(nèi)容不是0xff,即查找上次關(guān)機(jī)時(shí)最后存入的記錄的存儲(chǔ)位置。示意如表3。步驟s304:新采集數(shù)據(jù)信息按步驟s102寫入所述的nm頁(yè)的地址w之后的存儲(chǔ)單元;或從地址w的存儲(chǔ)單元開(kāi)始,任意讀取前面的n條記錄,即執(zhí)行p1操作。表1索引區(qū)第11頁(yè)中的頁(yè)碼存放示意圖(2k存儲(chǔ)器)0x**0x**0x**0x**0x**0x**0x**0x**…………………………nm-2nm-1nm0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff0xff……………………0xff0xff0xff0xff0xff0xff0xff0xff表2記錄區(qū)第12頁(yè)~第126頁(yè)數(shù)據(jù)存放示意圖步驟s304:存放新的數(shù)據(jù)時(shí),在上次關(guān)機(jī)時(shí)最后存儲(chǔ)位置即nm頁(yè)的地址w之后順序存儲(chǔ)記錄,待nm頁(yè)存滿則按步驟s103執(zhí)行;讀取數(shù)據(jù)時(shí)從最后存儲(chǔ)記錄的位置開(kāi)始,可以任意讀取前面n條記錄(n<11673)。作為本發(fā)明的一個(gè)實(shí)施例,若索引區(qū)頁(yè)11所有單元是0xff,則按如圖3所示流程執(zhí)行。如本發(fā)明按照用戶要求,每秒存儲(chǔ)一條記錄,每條記錄20byte,可以連續(xù)記錄196分鐘的數(shù)據(jù),遠(yuǎn)大于連續(xù)記錄5分鐘的要求。經(jīng)計(jì)算數(shù)據(jù)存儲(chǔ)區(qū)使用壽命為37.34年(其中記錄區(qū)使用壽命為37.34年,索引區(qū)使用壽命為332.5年),滿足20年的使用要求。與上述方法對(duì)應(yīng)的,本發(fā)明提供一種嵌入式系統(tǒng)flash數(shù)據(jù)讀寫系統(tǒng),其結(jié)構(gòu)框圖如圖4、圖5、圖6所示,圖5、圖6所示的讀寫系統(tǒng)分別是對(duì)圖4所示系統(tǒng)的改進(jìn)。具體為一種嵌入式系統(tǒng)(或單片機(jī)內(nèi)置)flash數(shù)據(jù)讀寫系統(tǒng),該系統(tǒng)包括n頁(yè)相同的存儲(chǔ)單元,其中用一頁(yè)作為索引區(qū),其余n-1頁(yè)作為記錄區(qū),該系統(tǒng)還包括:數(shù)據(jù)寫入模塊:包括索引區(qū)寫入單元和記錄區(qū)寫入單元,索引區(qū)寫入單元用于將數(shù)據(jù)記錄區(qū)待寫入的數(shù)據(jù)的目標(biāo)頁(yè)nm的頁(yè)碼號(hào)寫入索引區(qū)存儲(chǔ)單元;記錄區(qū)寫入模塊:將數(shù)據(jù)順序?qū)懭胗涗泤^(qū)存儲(chǔ)單元的目標(biāo)頁(yè)nm中;第一判斷模塊:用于判斷數(shù)據(jù)記錄區(qū)存儲(chǔ)單元中的目標(biāo)頁(yè)nm是否寫滿,寫滿后將待寫目標(biāo)頁(yè)由nm變?yōu)閚m+1;第一擦除模塊:擦除記錄區(qū)存儲(chǔ)單元中的目標(biāo)頁(yè)nm后第二頁(yè)nm+2的信息的內(nèi)容全部置為0xff的標(biāo)識(shí)信息;如圖5所示,按照本發(fā)明的另外一種實(shí)施方式,第二判斷模塊:用于判斷索引區(qū)存儲(chǔ)單元是否寫滿,寫滿后則轉(zhuǎn)至第二擦除模塊;第二擦除模塊:擦除記索引區(qū)存儲(chǔ)單元的信息即將該頁(yè)內(nèi)容全部置為特定標(biāo)識(shí)信息;其中該特定標(biāo)識(shí)信息可以為0xff。如圖6所示,更進(jìn)一步的,本發(fā)明中的系統(tǒng)還包括如下部分:在本系統(tǒng)中,在發(fā)生掉電的情況下,調(diào)用記錄查詢模塊,用于在系統(tǒng)掉電重啟后查詢掉電前記錄所在的位置,其中查找掉電前記錄所在的位置的方式為,先查詢索引區(qū)記錄所在的頁(yè)碼,然后到對(duì)應(yīng)頁(yè)碼中找到記錄信息的具體位置,其中具體為:從第nm頁(yè)中的最后存儲(chǔ)單元開(kāi)始逆向查找,查找存儲(chǔ)單元中的信息是否等于特定標(biāo)識(shí)信息,若不是,該字節(jié)所處的地址w是最后存入數(shù)據(jù)記錄的存儲(chǔ)位置。當(dāng)然,在具體的flash的實(shí)施系統(tǒng)中,具體上述flash系統(tǒng)包括存儲(chǔ)單元陣列、位線以及位線控制器等,并且在上述硬件實(shí)施的基礎(chǔ)上,按照如上述的控制方式來(lái)對(duì)系統(tǒng)中的flash的數(shù)據(jù)的讀寫進(jìn)行控制。本領(lǐng)域的技術(shù)人員容易理解,以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。當(dāng)前第1頁(yè)12