用于Flash均衡存儲的方法及系統(tǒng)的制作方法
【專利摘要】本發(fā)明涉及一種用于Flash均衡存儲的方法及系統(tǒng),該方法包括如下步驟:步驟11,檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;步驟12,檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG;步驟13,判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInfo.cur_addr;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū);步驟14,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),執(zhí)行步驟11。
【專利說明】用于Flash均衡存儲的方法及系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及一種用于Flash均衡存儲的方法及系統(tǒng)。
【背景技術(shù)】
[0002]當(dāng)今電子技術(shù)飛速發(fā)展,嵌入式微控制技術(shù)在電子測量和工業(yè)控制領(lǐng)域的應(yīng)用也越來越廣泛。通常在監(jiān)測和控制系統(tǒng)中,有一些系統(tǒng)狀態(tài)數(shù)據(jù)、運行參數(shù)或測量數(shù)據(jù)需要保存在非易失性存儲器(Flash)中。
[0003]FLASH存儲器是一種在EPROM (電可擦寫可編程只讀存儲器)和EEPR0M(電可擦可編程只讀存儲器)的制造技術(shù)基礎(chǔ)上發(fā)展起來的一種可擦除、非易失性存儲元件。嵌入式系統(tǒng)中使用的FLASH存儲器有兩種,一種是在MCU (微控制單元)之外擴(kuò)展的FLASH芯片,通常是按照特定時序發(fā)送命令和數(shù)據(jù),實現(xiàn)讀、寫和擦除操作;另外一種是MCU內(nèi)部集成的FLASH存儲器,這類flash的訪問往往是通過調(diào)用MCU提供的庫函數(shù)來完成相應(yīng)操作。
[0004]FLASH存儲器的擦寫次數(shù)是有一定限制的。如果頻繁地擦寫FLASH存儲器的某個固定區(qū)域,就會使該區(qū)域在較短的時間內(nèi)達(dá)到使用壽命而無法擦寫,從而導(dǎo)致系統(tǒng)出錯甚至崩潰。為延長FLASH存儲器使用壽命,軟件設(shè)計時通常會采用某種均衡算法將數(shù)據(jù)平均地寫到Flash存儲區(qū)域。
[0005]在有操作系統(tǒng)的電子產(chǎn)品中,F(xiàn)LASH存儲器作為大容量文件存儲器,可以采用算法較復(fù)雜的文件系統(tǒng)來均衡FLASH存儲器的擦寫來延長它的使用壽命,如磨損均衡算法等。而在嵌入式測量和控制系統(tǒng)中,通常用來存儲數(shù)據(jù)的FLASH存儲器容量比較小,一般只有幾K到幾百K字節(jié),因此不可能采用類似文件系統(tǒng)的方式來管理。
[0006]在非操作系統(tǒng)的嵌入式系統(tǒng)中,通常用兩種方式實現(xiàn)flash存儲管理。對于非連續(xù)寫入的情況,寫入的數(shù)據(jù)有限且有初始默認(rèn)值,同時在內(nèi)存中也備份一遍數(shù)據(jù)。當(dāng)要改變數(shù)據(jù)時,先改變內(nèi)存數(shù)據(jù),然后擦除flash并將內(nèi)存的數(shù)據(jù)復(fù)制到flash。遇到讀寫時突然掉電,flash出錯的情況,只需將flash中的數(shù)據(jù)重新恢復(fù)為初始默認(rèn)值即可。對于連續(xù)寫入的情行,通常需要用FLASH存儲器中幾個固定單元來保存有效數(shù)據(jù)區(qū)的起始地址和結(jié)束地址,其他存儲區(qū)域均衡寫入。在使用過程中出現(xiàn)掉電現(xiàn)象,在重新上電后通過起始地址確定上次正常工作或掉電前寫入的有效數(shù)據(jù)在FLASH存儲器中的存儲位置。
[0007]如上,第一種方案適用情況有限而且一旦數(shù)據(jù)掉電丟失以后是無法找回的,只能用默認(rèn)值。第二種方案的情況的弊端是用于保存地址的單元還是會因頻繁地擦寫而達(dá)到擦寫飽和,從而影響到整個存儲芯片的壽命,不能從根本上解決延長FLASH存儲器使用壽命的問題。而且每次寫入數(shù)據(jù)的都需要在兩個地方更新內(nèi)容(保存地址和數(shù)據(jù)),因而掉電后數(shù)據(jù)的處理上也會復(fù)雜點。
【發(fā)明內(nèi)容】
[0008]基于此,本發(fā)明提供了一種用于Flash均衡存儲的方法及系統(tǒng),實現(xiàn)對FLASH存儲器的全均衡擦寫。[0009]—種用于Flash均衡存儲的方法,該方法包括如下步驟:
[0010]步驟11,檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;
[0011]步驟12,檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ;
[0012]步驟13,判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū);
[0013]步驟14,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),執(zhí)行步驟11。
[0014]優(yōu)選的,在所述步驟12和步驟13之間還包括如下步驟:檢查寫入的數(shù)據(jù)是否合法,如果合法,則執(zhí)行步驟13。
[0015]優(yōu)選的,步驟13和步驟14之間,還包括如下步驟:如果當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū)時,重新回到第一個扇區(qū)進(jìn)行操作,重復(fù)步驟11 一步驟13。
[0016]優(yōu)選的,該方法還包括數(shù)據(jù)存儲的檢測步驟,
[0017]步驟21,確定要寫入的扇區(qū);依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū);
[0018]步驟22,確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址。
[0019]優(yōu)選的,步驟22中,如果找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非空白,則操作地址偏移數(shù)據(jù)塊的大小后,重新執(zhí)行步驟22。
[0020]本發(fā)明還提供了一種用于Flash均衡存儲的系統(tǒng),該系統(tǒng)包括:
[0021]第一檢查判斷裝置,用于檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;
[0022]第二檢查判斷裝置,用于檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ;
[0023]判斷裝置,用于判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,貝Ij跳轉(zhuǎn)到下一個扇區(qū);
[0024]第三檢查判斷裝置,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),由第一檢查判斷裝置工作。
[0025]該系統(tǒng)還包括
[0026]第四檢查判斷裝置,用于在檢查寫入的數(shù)據(jù)是否合法,如果合法,則由第三檢查判斷裝置工作。
[0027]該系統(tǒng)還包括
[0028]第二判斷裝置,用于判斷當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū),如果是,重新回到第一個扇區(qū),由第一檢查判斷裝置進(jìn)行操作。
[0029]該系統(tǒng)還包括[0030]數(shù)據(jù)存儲的檢測裝置,用于
[0031]確定要寫入的扇區(qū),依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū);
[0032]確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址;
[0033]讀出最近一次寫入且校驗通過的數(shù)據(jù)包。
[0034]數(shù)據(jù)存儲的檢測裝置還用于
[0035]依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非空白,則操作地址偏移數(shù)據(jù)塊的大小后,確定要寫入的地址。
[0036]本發(fā)明的有益效果在于:
[0037]1.Flash使用壽命長,合理運用每個扇區(qū),最好地平均每個扇區(qū)的擦寫次數(shù),
[0038]2.可靠性高,在每次讀寫的時候都需要進(jìn)行校驗和的驗證,從而保證在一些特殊情況下(如意外掉電)導(dǎo)致的數(shù)據(jù)丟失的時候,能正確讀取完整數(shù)據(jù)。
[0039]3.支持可變長度數(shù)據(jù)塊的讀寫操作。
【專利附圖】
【附圖說明】
[0040]圖1是本發(fā)明提供的用于Flash均衡擦寫的方法的流程圖;
[0041]圖2是本發(fā)明提供的用于Flash數(shù)據(jù)保護(hù)的方法。
【具體實施方式】
[0042]下面結(jié)合附圖對本發(fā)明做進(jìn)一步說明。
[0043]參見圖1 一 2,本發(fā)明提供的用于Flash均衡存儲的方法,該方法包括如下步驟:
[0044]步驟11,檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;
[0045]步驟12,檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ;
[0046]步驟13,判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū);
[0047]步驟14,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),執(zhí)行步驟11。
[0048]在所述步驟12和步驟13之間還包括如下步驟:檢查寫入的數(shù)據(jù)是否合法,如果合法,則執(zhí)行步驟13。
[0049]步驟13和步驟14之間,還包括如下步驟:如果當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū)時,重新回到第一個扇區(qū)進(jìn)行操作,重復(fù)步驟11 一步驟13。
[0050]該方法還包括數(shù)據(jù)存儲的檢測步驟,該步驟一般情況只在初始化的時候進(jìn)行檢測步驟。檢測的目的是為了讀取最近一次寫入的數(shù)據(jù),或者為寫入數(shù)據(jù)做準(zhǔn)備。
[0051]步驟21,確定要寫入的扇區(qū);依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū);[0052]步驟22,確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址;
[0053]步驟23,讀出最近一次寫入且校驗通過的數(shù)據(jù)包。
[0054]步驟22中,如果找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非空白,則操作地址偏移數(shù)據(jù)塊的大小后,重新執(zhí)行步驟22。
[0055]本發(fā)明還提供了一種用于Flash均衡存儲的系統(tǒng),該系統(tǒng)包括:
[0056]第一檢查判斷裝置,用于檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;
[0057]第二檢查判斷裝置,用于檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ;
[0058]判斷裝置,用于判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū);
[0059]第三檢查判斷裝置,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),由第一檢查判斷裝置工作。
[0060]該系統(tǒng)還包括
[0061]第四檢查判斷裝置,用于在檢查寫入的數(shù)據(jù)是否合法,如果合法,則由第三檢查判斷裝置工作。
[0062]該系統(tǒng)還包括
[0063]第二判斷裝置,用于判斷當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū),如果是,重新回到第一個扇區(qū),由第一檢查判斷裝置進(jìn)行操作。
[0064]該系統(tǒng)還包括
[0065]數(shù)據(jù)存儲的檢測裝置,用于
[0066]確定要寫入的扇區(qū),依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū);
[0067]確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址;
[0068]讀出最近一次寫入且校驗通過的數(shù)據(jù)包。
[0069]數(shù)據(jù)存儲的檢測裝置還用于
[0070]依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非空白,則操作地址偏移數(shù)據(jù)塊的大小后,確定要寫入的地址。
[0071]本發(fā)明中需要維護(hù)的數(shù)據(jù)結(jié)構(gòu)有數(shù)據(jù)包和扇區(qū)信息包,如表I所示。
[0072]表I
【權(quán)利要求】
1.一種用于Flash均衡存儲的方法,其特征在于,該方法包括如下步驟: 步驟11,檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記; 步驟12,檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ; 步驟13,判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū); 步驟14,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),執(zhí)行步驟11。
2.根據(jù)權(quán)利要求1所述的用于Flash均衡存儲的方法,其特征在于,在所述步驟12和步驟13之間還包括如下步驟:檢查寫入的數(shù)據(jù)是否合法,如果合法,則執(zhí)行步驟13。
3.根據(jù)權(quán)利要求1所述的用于Flash均衡存儲的方法,其特征在于,步驟13和步驟14之間,還包括如下步驟:如果當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū)時,重新回到第一個扇區(qū)進(jìn)行操作,重復(fù)步驟11 一步驟13。
4.根據(jù)權(quán)利要求1所述的用于Flash均衡存儲的方法,其特征在于,該方法還包括數(shù)據(jù)存儲的檢測步驟, 步驟21,確定要寫入的扇區(qū);依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū); 步驟22,確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址。
5.根據(jù)權(quán)利要求4所述的用于Flash均衡存儲的方法,其特征在于,步驟22中,如果找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非空白,則操作地址偏移數(shù)據(jù)塊的大小后,重新執(zhí)行步驟22。
6.一種用于Flash均衡存儲的系統(tǒng),其特征在于,該系統(tǒng)包括: 第一檢查判斷裝置,用于檢查當(dāng)前要寫入的扇區(qū)是否有擦除標(biāo)記,如果沒有,則格式化當(dāng)前扇區(qū)并置標(biāo)記;第二檢查判斷裝置,用于檢查當(dāng)前扇區(qū)是否是第一次寫入數(shù)據(jù),如果是,則先格式化當(dāng)前扇區(qū)的下一個扇區(qū)并置擦除標(biāo)記EARSE_FLAG,然后本扇區(qū)置寫入使用標(biāo)記USED_FLAG ;判斷裝置,用于判斷當(dāng)前扇區(qū)的剩余空間是否足夠?qū)懭氘?dāng)前數(shù)據(jù)包,如果空間夠,則寫入數(shù)據(jù)到當(dāng)前位置并更新當(dāng)前操作地址g_SectorInf0.cur_addr ;如果空間不夠,則跳轉(zhuǎn)到下一個扇區(qū); 第三檢查判斷裝置,檢驗寫入的數(shù)據(jù)校驗?zāi)芊裢ㄟ^;如果不能,則移入下一個扇區(qū),由第一檢查判斷裝置工作。
7.根據(jù)權(quán)利要求6所述的用于Flash均衡存儲的系統(tǒng),其特征在于,該系統(tǒng)還包括 第四檢查判斷裝置,用于在檢查寫入的數(shù)據(jù)是否合法,如果合法,則由第三檢查判斷裝置工作。
8.根據(jù)權(quán)利要求6所述的用于Flash均衡存儲的系統(tǒng),其特征在于,該系統(tǒng)還包括 第二判斷裝置,用于判斷當(dāng)前扇區(qū)為規(guī)劃的最后一個扇區(qū),如果是,重新回到第一個扇區(qū),由第一檢查判斷裝置進(jìn)行操作。
9.根據(jù)權(quán)利要求6所述的用于Flash均衡存儲的系統(tǒng),其特征在于,該系統(tǒng)還包括 數(shù)據(jù)存儲的檢測裝置,用于 確定要寫入的扇區(qū),依次檢查標(biāo)記有使用標(biāo)記USED_FLAG的扇區(qū),直到找到最后一個這樣的扇區(qū); 確定要寫入的地址;依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和非法且數(shù)據(jù)空白,則當(dāng)前區(qū)域的地址即為要寫入的地址; 讀出最近一次寫入且校驗通過的數(shù)據(jù)包。
10.根據(jù)權(quán)利要求9所述的用于Flash均衡存儲的系統(tǒng),其特征在于,數(shù)據(jù)存儲的檢測裝置還用于 依次檢查存儲的數(shù)據(jù)包長度以及校驗和的合法性,當(dāng)找到某個區(qū)域校驗和合法或校驗和非法且數(shù)據(jù)非 空白,則操作地址偏移數(shù)據(jù)塊的大小后,確定要寫入的地址。
【文檔編號】G06F12/14GK103823642SQ201410099227
【公開日】2014年5月28日 申請日期:2014年3月17日 優(yōu)先權(quán)日:2014年3月17日
【發(fā)明者】潘相熙, 楊文 , 羅永良, 閆浩, 谷韜 申請人:深圳市道通科技有限公司