MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)及方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及小容量數(shù)字信息儲(chǔ)存技術(shù)領(lǐng)域,尤其是一種MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)及方法。
【背景技術(shù)】
[0002]flash閃存是一種非易失性(Non-Volatile)內(nèi)存,在沒(méi)有電流供應(yīng)的條件下也能夠長(zhǎng)久地保持?jǐn)?shù)據(jù),其存儲(chǔ)特性相當(dāng)于硬盤(pán),適合單片機(jī)MCU在緊急狀態(tài)下保存關(guān)鍵數(shù)據(jù)?目息。
[0003]flash閃存一般對(duì)存儲(chǔ)器單元分頁(yè)進(jìn)行擦除操作的。任何flash器件的寫(xiě)入操作只能在空或已擦除的單元內(nèi)進(jìn)行,所以大多數(shù)情況下,在進(jìn)行寫(xiě)入操作之前必須先執(zhí)行擦除。
[0004]但是flash閃存的擦寫(xiě)次數(shù)在十萬(wàn)次?一百萬(wàn)次左右,所以需要采取磨損平衡的策略。在有可能高頻度進(jìn)行擦寫(xiě)的情況下,還需要做延遲寫(xiě)入。因此現(xiàn)有技術(shù)的存儲(chǔ)管理策略無(wú)法提高flash閃存的擦寫(xiě)次數(shù)和寫(xiě)入速度。
【發(fā)明內(nèi)容】
[0005]有鑒于此,本發(fā)明提供一種能夠提高flash閃存的擦寫(xiě)次數(shù)和寫(xiě)入速度的MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)及方法。
[0006]—種MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng),其包括如下單元:
[0007]存儲(chǔ)結(jié)構(gòu)初始單元,用于對(duì)可供使用的flash頁(yè)面分為當(dāng)面頁(yè)面PageO和備用頁(yè)面Pagel ;PageO和Pagel都劃分為若干塊Block,Block為數(shù)據(jù)存儲(chǔ)的基本單元;
[0008]存儲(chǔ)管理系統(tǒng)初始化單元,用于在存儲(chǔ)管理系統(tǒng)上電時(shí)進(jìn)行初始化,依次對(duì)PageO、Pagel進(jìn)行Block寫(xiě)入連續(xù)性檢查,Block使用情況檢查,并根據(jù)使用情況確定修改處理措施;
[0009]讀寫(xiě)策略執(zhí)行單元,用于在存儲(chǔ)管理系統(tǒng)初始化完以后執(zhí)行讀策略或?qū)懖呗浴?br>[0010]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)中,存儲(chǔ)結(jié)構(gòu)初始單元中數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)包括文件名FileName、文件內(nèi)容存放區(qū)域DataArea以及文件屬性的尾注 Footer ;
[0011]Footer的展開(kāi)格式如下:包括,用于表示本Block屬性的BlockProp ;用于表示本文件是否刪除的Deled;用于標(biāo)記是否需要多個(gè)Block進(jìn)行存儲(chǔ)的標(biāo)記號(hào)Idx ;用于表示本Block數(shù)據(jù)域有多少個(gè)有效數(shù)據(jù)的DataLenlnBlock ;用于校驗(yàn)一個(gè)Block寫(xiě)入完整性的CheckSum0
[0012]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)中,所述存儲(chǔ)管理系統(tǒng)初始化單元包括:
[0013]在存儲(chǔ)管理系統(tǒng)上電后對(duì)PageO進(jìn)行連續(xù)性檢查,在PageO存儲(chǔ)不連續(xù)時(shí),擦除PageO和Page 1,并結(jié)束;在PageO存儲(chǔ)是連續(xù)的時(shí),對(duì)Pagel進(jìn)行連續(xù)性檢查;在Pagel存儲(chǔ)不連續(xù)時(shí),擦除PageO和Page 1,并結(jié)束;
[0014]在Pagel存儲(chǔ)是連續(xù)的時(shí),依次對(duì)PageO、Pagel的使用情況進(jìn)行檢查;
[0015]判斷PageO、Pagel是否需要修復(fù)或全部擦除,在需要全部擦除時(shí),擦除PageO和Pagel,并結(jié)束;在PageO和/或Pagel需要修復(fù)時(shí),對(duì)PageO和/或Pagel進(jìn)行修復(fù),并結(jié)束;在PageO和Pagel都不需要修復(fù)時(shí)直接結(jié)束。
[0016]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)中,所述讀寫(xiě)策略執(zhí)行單元中寫(xiě)策略包括:
[0017]將存儲(chǔ)管理系統(tǒng)的狀態(tài)由空閑狀態(tài)改為寫(xiě)狀態(tài);
[0018]判斷存儲(chǔ)管理系統(tǒng)的有效剩余空間是否滿足寫(xiě)入請(qǐng)求,不滿足寫(xiě)入請(qǐng)求時(shí),直接結(jié)束;
[0019]在滿足寫(xiě)入請(qǐng)求時(shí),判斷PageO是否寫(xiě)滿,在PageO寫(xiě)滿時(shí),進(jìn)行Page切換,并執(zhí)行Page切換后的功能;
[0020]在PageO沒(méi)有寫(xiě)滿時(shí),繼續(xù)判斷PageO中的剩余空白Block是否夠?qū)?,在PageO中的剩余空白Block夠?qū)憰r(shí),在PageO中進(jìn)行追寫(xiě)并結(jié)束;在PageO中的剩余空白Block不夠?qū)?,在PageO中的剩余空白Block中寫(xiě)0并進(jìn)行PageO切換,并執(zhí)行Page切換后的功能;
[0021]Page切換后在將Pagel的檢索起點(diǎn)設(shè)為最末尾并Pagel中追寫(xiě)文件;
[0022]在寫(xiě)入文件結(jié)束后在Pagel中向前檢索一個(gè)文件,在檢索到損壞的文件時(shí),繼續(xù)向前檢索直至檢索完成;
[0023]在檢索到有效文件時(shí),判斷該有效文件是否在PageO中存在,在已經(jīng)存在時(shí),重復(fù)在寫(xiě)入文件結(jié)束后在PageO中向前檢索一個(gè)文件,在不存在時(shí),重復(fù)將Pagel的檢索起點(diǎn)設(shè)為最末尾并Pagel中追寫(xiě)文件。
[0024]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理系統(tǒng)中,所述讀寫(xiě)策略執(zhí)行單元中讀策略包括:
[0025]將檢索起點(diǎn)設(shè)置為PageO最后一個(gè)已使用的Block,向前檢索一個(gè)Block ;檢索全部Block后沒(méi)有文件名符合檢索要求,則報(bào)告無(wú)此文件并結(jié)束;在文件名不符合并且所有Block尚未檢索完成時(shí),繼續(xù)向前檢索一個(gè)Block ;
[0026]在檢索到文件名相同的Block時(shí),對(duì)文件進(jìn)行校驗(yàn),在校驗(yàn)不通過(guò)時(shí)結(jié)束;在校驗(yàn)通過(guò)時(shí),如果是第一個(gè)Block或后續(xù)Block,則報(bào)告文件損壞并結(jié)束,如果是結(jié)束B(niǎo)lock,則根據(jù)信息向前跳轉(zhuǎn)到第一個(gè)Block并讀取整個(gè)文件內(nèi)容和長(zhǎng)度,刪除屬性為未刪除并結(jié)束,如果是單Block,則讀取文件內(nèi)容和刪除屬性以及文件長(zhǎng)度并結(jié)束。
[0027]本發(fā)明還提供一種MCU片內(nèi)小容量flash的存儲(chǔ)管理方法,其包括如下步驟:
[0028]S1、對(duì)可供使用的flash頁(yè)面分為當(dāng)面頁(yè)面PageO和備用頁(yè)面Pagel ;Page0和Pagel都劃分為若干塊Block,Block為數(shù)據(jù)存儲(chǔ)的基本單元;
[0029]S2、在存儲(chǔ)管理系統(tǒng)上電時(shí)進(jìn)行初始化,依次對(duì)PageO、Pagel進(jìn)行Block寫(xiě)入連續(xù)性檢查,Block使用情況檢查,并根據(jù)使用情況確定修改處理措施;
[0030]S3、在存儲(chǔ)管理系統(tǒng)初始化完以后執(zhí)行讀策略執(zhí)行單元或?qū)懖呗詧?zhí)行單元。
[0031]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理方法中,S1中數(shù)據(jù)存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)包括文件名FileName、文件內(nèi)容存放區(qū)域DataArea以及文件屬性的尾注Footer ;
[0032]Footer的展開(kāi)格式如下:包括,用于表示本Block屬性的BlockProp ;用于表示本文件是否刪除的Deled;用于標(biāo)記是否需要多個(gè)Block進(jìn)行存儲(chǔ)的標(biāo)記號(hào)Idx ;用于表示本Block數(shù)據(jù)域有多少個(gè)有效數(shù)據(jù)的DataLenlnBlock ;用于校驗(yàn)一個(gè)Block寫(xiě)入完整性的CheckSum0
[0033]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理方法中,所述S2包括:
[0034]在存儲(chǔ)管理系統(tǒng)上電后對(duì)PageO進(jìn)行連續(xù)性檢查,在PageO存儲(chǔ)不連續(xù)時(shí),擦除PageO和Page 1,并結(jié)束;在PageO存儲(chǔ)是連續(xù)的時(shí),對(duì)Pagel進(jìn)行連續(xù)性檢查;在Pagel存儲(chǔ)不連續(xù)時(shí),擦除PageO和Page 1,并結(jié)束;
[0035]在Pagel存儲(chǔ)是連續(xù)的時(shí),依次對(duì)PageO、Pagel的使用情況進(jìn)行檢查;
[0036]判斷PageO、Pagel是否需要修復(fù)或全部擦除,在需要全部擦除時(shí),擦除PageO和Pagel,并結(jié)束;在PageO和/或Pagel需要修復(fù)時(shí),對(duì)PageO和/或Pagel進(jìn)行修復(fù),并結(jié)束;在PageO和Pagel都不需要修復(fù)時(shí)直接結(jié)束。
[0037]在本發(fā)明所述的MCU片內(nèi)小容量flash的存儲(chǔ)管理方法中,所述S3中寫(xiě)策略包括:
[0038]將存儲(chǔ)管理系統(tǒng)的狀態(tài)由空閑狀態(tài)改為寫(xiě)狀態(tài);
[0039]判斷存儲(chǔ)管理系統(tǒng)的有效剩余空間是否滿足寫(xiě)入請(qǐng)求,不滿足寫(xiě)入請(qǐng)求時(shí),直接結(jié)束;
[0040]在滿足寫(xiě)入請(qǐng)求時(shí),判斷PageO是否寫(xiě)滿,在PageO寫(xiě)滿時(shí),進(jìn)行Page切換,并執(zhí)行Page切換后的功能;
[0041]在PageO沒(méi)有寫(xiě)滿時(shí),繼續(xù)判斷PageO中的剩余空白Block是否夠?qū)?,在PageO中的剩余空白Block夠?qū)憰r(shí),在PageO中進(jìn)行追寫(xiě)并結(jié)束;在PageO中的剩余空白Block不夠?qū)?,在PageO中的剩余空白Block中寫(xiě)0并進(jìn)行PageO切換,并執(zhí)行Page切換后的功能;
[0042]Page切換后在將Pagel的檢索起點(diǎn)設(shè)為最末尾并Pagel中追寫(xiě)文件;
[0043]在寫(xiě)入文件結(jié)束后在Pagel中向前檢索一個(gè)文件,在檢索到損壞的文