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