專利名稱:一種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于嵌入式系統(tǒng)技術(shù)領(lǐng)域,更具體的說是ー種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法。
背景技術(shù):
在嵌入式系統(tǒng)設(shè)計中,經(jīng)常需要存儲ー些非易失性的數(shù)據(jù),如果采用支持對字節(jié)讀寫的EEPROM實現(xiàn)數(shù)據(jù)存儲,操作起來和RAM —樣簡單方便,但同時會在大批量產(chǎn)品的生產(chǎn)中帶來成本問題和維護(hù)問題。在有數(shù)據(jù)Flash的MCU中,采用數(shù)據(jù)Flash代替EEPROM實現(xiàn)非易失性的存儲,便可以節(jié)約成本且無需維護(hù)。用Flash存儲數(shù)據(jù)的傳統(tǒng)方式是為每個數(shù)據(jù)分配固定的存儲地址,由于Flash在進(jìn)行寫操作時需要先擦除數(shù)據(jù)所在的整個扇區(qū),對ー個數(shù)據(jù)進(jìn)行寫操作便會造成對扇區(qū)內(nèi)其他數(shù)據(jù)的擦除,由于擦除操作耗時較長,不僅效率低,影響嵌入式系統(tǒng)的實時性,而且為了避免丟失其他數(shù)據(jù)需要相當(dāng)復(fù)雜的處理,對MCU的RAM空間也有一定的要求。如果寫入數(shù)據(jù)失敗,會造成所寫入數(shù)據(jù)的丟失,如果在擦除扇區(qū)后發(fā)生掉電,便會造成扇區(qū)內(nèi)所有數(shù)據(jù)的丟失。不僅如此,由于每次寫入操作都需要先擦除扇區(qū),以擦除次數(shù)表征的Flash使用壽命也無法滿足產(chǎn)品生命周期的要求。
發(fā)明內(nèi)容
本發(fā)明的目的就是為解決上述問題,提供ー種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,它不僅操作方便,應(yīng)用接ロ簡單,而且可以盡量避免扇區(qū)擦除操作,提高存儲效率,同時提高M(jìn)CU內(nèi)部數(shù)據(jù)Flash的使用壽命。為實現(xiàn)上述目的,本發(fā)明采用如下技術(shù)方案
ー種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,將所有非易失性數(shù)據(jù)條目組織在ー個分區(qū)中,將數(shù)據(jù)Flash的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),不同數(shù)據(jù)分區(qū)存儲數(shù)據(jù)在不同歷史時間的拷貝;當(dāng)前數(shù)據(jù)分區(qū)存儲最新的數(shù)據(jù)拷貝;在數(shù)據(jù)讀操作進(jìn)行時,計算最新數(shù)據(jù)拷貝的Flash存儲位置,直接讀取該地址;在數(shù)據(jù)寫操作進(jìn)行時,判斷數(shù)據(jù)寫入位置是否已經(jīng)被擦除,如果寫入位置未擦除,進(jìn)行分區(qū)拷貝操作,即將數(shù)據(jù)寫入下ー個分區(qū),同時將當(dāng)前分區(qū)中的其他數(shù)據(jù)依次復(fù)制到下ー個分區(qū);如果寫入位置已經(jīng)擦除,直接將數(shù)據(jù)寫入當(dāng)前分區(qū)中,其他數(shù)據(jù)保持不變。本發(fā)明數(shù)據(jù)分區(qū)的存儲結(jié)構(gòu)為分區(qū)狀態(tài)字+data id 1+data 1+data id 2+data2···,每個數(shù)據(jù)都可以很方便地進(jìn)行尋址。按照存儲歷史時間,數(shù)據(jù)均勻地存儲在多個數(shù)據(jù)分區(qū)上,而不是固定的存儲地址,單個數(shù)據(jù)的頻繁存儲操作不會造成對固定扇區(qū)的反復(fù)擦除,這樣便可以提高Flash的使用壽命,以滿足產(chǎn)品生命周期的要求。所述數(shù)據(jù)分區(qū)大小和個數(shù)取值均為2的冪次方,且分區(qū)個數(shù)不大于256,分區(qū)大小、*分區(qū)個數(shù)等于扇區(qū)大小*扇區(qū)個數(shù)。扇區(qū)個數(shù)至少為2,這樣當(dāng)存在分區(qū)拷貝操作需要擦除分區(qū)所在的扇區(qū)時,仍能保留至少ー個扇區(qū)的歷史數(shù)據(jù),這樣可以避免分區(qū)拷貝操作期間發(fā)生掉電而造成所有數(shù)據(jù)的丟失,以滿足實現(xiàn)掉電恢復(fù)功能的需要。所述數(shù)據(jù)分區(qū)設(shè)置有狀態(tài)字,大小為單字節(jié),位置在分區(qū)起始地址,標(biāo)識分區(qū)數(shù)據(jù)的存儲歷史時間,最新數(shù)據(jù)分區(qū)狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū)。數(shù)據(jù)分區(qū)狀態(tài)字在分區(qū)擦除后執(zhí)行完第一次寫操作后更新, 之后本分區(qū)內(nèi)的寫操作不影響分區(qū)狀態(tài)字。當(dāng)發(fā)生分區(qū)拷貝時,最新數(shù)據(jù)分區(qū)狀態(tài)字遞增且不等于Oxff,當(dāng)遞增到Oxff時,設(shè)置狀態(tài)字為O。通過在寫操作完成后進(jìn)行分區(qū)狀態(tài)字的更新,保證了即使在分區(qū)拷貝期間發(fā)生掉電,上電時查找到的最新數(shù)據(jù)仍為掉電之前備份的那個分區(qū),這樣便實現(xiàn)了掉電恢復(fù)功能。當(dāng)存在取值為O的分區(qū)狀態(tài)字吋,小于分區(qū)數(shù)的最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū),當(dāng)不存在取值為O的分區(qū)狀態(tài)字時,最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū)。將所有非易失性數(shù)據(jù)條目組織在ー個分區(qū)中是指數(shù)據(jù)分區(qū)中數(shù)據(jù)條目的組織是以固定序列的形式進(jìn)行的,每個數(shù)據(jù)條目都有固定的偏移地址,數(shù)據(jù)條目地址=分區(qū)起始地址+偏移地址。所述的數(shù)據(jù)條目格式為data id+data, data id,它為單字節(jié)大小,卩隹ー標(biāo)識該數(shù)據(jù),data為數(shù)據(jù)內(nèi)容,長度由所表示的含義決定。所述數(shù)據(jù)條目中的data id,其取值區(qū)間為
的整型數(shù)據(jù),不僅唯一標(biāo)識數(shù)據(jù),同時將其地址作為數(shù)據(jù)條目狀態(tài)字的存儲地址。由于Flash擦除后其數(shù)據(jù)為Oxff,通過限定data id的取值范圍不等于255即Oxff,則可以用于判斷該數(shù)據(jù)條目在當(dāng)前分區(qū)中的地址是否已經(jīng)被擦除。所述數(shù)據(jù)寫入位置是否已經(jīng)被擦除是通過數(shù)據(jù)條目中的數(shù)據(jù)狀態(tài)字進(jìn)行判斷的,首先讀取該數(shù)據(jù)條目的狀態(tài)字,如果狀態(tài)字等于Oxff,則數(shù)據(jù)寫入地址已經(jīng)被擦除,可以進(jìn)行寫操作,如果不等于OxfT,則數(shù)據(jù)寫入地址未被擦除,不能直接進(jìn)行寫操作。通過為每個數(shù)據(jù)建立專屬的狀態(tài)字表示該數(shù)據(jù)在當(dāng)前分區(qū)的存儲位置是否已擦除,保證了各個數(shù)據(jù)的存儲操作互不影響,不會毎次只要有數(shù)據(jù)的寫操作都會造成所有的數(shù)據(jù)在分區(qū)之間的搬移,不僅提高了寫操作的效率,而且會進(jìn)ー步提高Flash的使用壽命。本發(fā)明是通過在MCU數(shù)據(jù)Flash上建立多個數(shù)據(jù)分區(qū),存儲數(shù)據(jù)的多個拷貝,避免對Flash固定地址的反復(fù)擦除,提高Flash的使用壽命。同時通過數(shù)據(jù)讀寫方法的設(shè)計和數(shù)據(jù)分區(qū)的管理,避免對Flash扇區(qū)的不必要擦除,并最終實現(xiàn)和EEPROM讀寫很類似的應(yīng)用接ロ。本發(fā)明的有益效果是
I、對于需要進(jìn)行多個獨立數(shù)據(jù)存儲的嵌入式系統(tǒng)應(yīng)用,通過建立數(shù)據(jù)分區(qū)這樣ー種存儲結(jié)構(gòu),使得對某個數(shù)據(jù)的尋址非常簡單。2、對于單個數(shù)據(jù)的頻繁存儲操作,因為數(shù)據(jù)可以存儲在多個數(shù)據(jù)分區(qū)上,而不是固定的存儲地址,所以不會每次存儲操作都造成對固定扇區(qū)的擦除,這樣便可以提高Flash的使用壽命,以滿足產(chǎn)品生命周期的要求。3、其次,為每個數(shù)據(jù)都建立了狀態(tài)字來表示是否已經(jīng)在當(dāng)前分區(qū)上進(jìn)行了存儲操作,這樣數(shù)據(jù)I的存儲操作不會影響數(shù)據(jù)2的存儲,數(shù)據(jù)2仍然能夠在當(dāng)前分區(qū)上進(jìn)行存儲,而不會毎次只要有數(shù)據(jù)的寫操作都會造成所有的數(shù)據(jù)在分區(qū)之間的搬移,這樣不僅提高了寫操作的效率,而且會進(jìn)ー步提高Flash的使用壽命。4、掉電保護(hù)。通過分區(qū)狀態(tài)字表明數(shù)據(jù)分區(qū)的歷史時間,而且狀態(tài)字更新是在數(shù)據(jù)存儲操作完成后進(jìn)行,這樣如果發(fā)生了掉電,上電時查找到的最新數(shù)據(jù)是掉電之前備份的那個分區(qū)。5、不僅操作方便,應(yīng)用接ロ簡單,而且可以盡量避免扇區(qū)擦除操作,提高存儲效率,同時提高M(jìn)CU內(nèi)部數(shù)據(jù)Flash的使用壽命。
圖I為本發(fā)明方法的軟件設(shè)計流程 圖2為采用本發(fā)明方法進(jìn)行寫操作的流程 圖3為采用本發(fā)明方法進(jìn)行掉電恢復(fù)操作的流程圖。
具體實施例方式下面結(jié)合附圖與實施例對本發(fā)明做進(jìn)ー步說明。圖I中,本發(fā)明首先根據(jù)嵌入式系統(tǒng)的應(yīng)用需求和MCU內(nèi)部數(shù)據(jù)Flash的扇區(qū)大小,合理設(shè)置數(shù)據(jù)分區(qū)大小和個數(shù),其取值均為2的η次冪,分區(qū)以0,I, 2…進(jìn)行編號,個數(shù)不大于256。分區(qū)大小和個數(shù)的設(shè)置和數(shù)據(jù)Flash的扇區(qū)長度匹配起來,即分區(qū)大小*分區(qū)個數(shù)=扇區(qū)大小*扇區(qū)個數(shù)。在每個數(shù)據(jù)分區(qū)的起始地址設(shè)置分區(qū)狀態(tài)字,反映數(shù)據(jù)分區(qū)的存儲歷史時間,在分區(qū)擦除后的第一次寫操作完成后更新。更新算法見數(shù)據(jù)的寫操作流程。然后設(shè)置數(shù)據(jù)條目的格式為data id+data, data id取值區(qū)間為0,254,為姆個數(shù)據(jù)條目的data id和data分配偏移地址,建立數(shù)據(jù)序列,組織數(shù)據(jù)分區(qū),數(shù)據(jù)分區(qū)的格式為
分區(qū)狀態(tài)字+data id 1+data 1+data id 2+data 2···,將數(shù)據(jù)條目的data id存儲地址同時做為數(shù)據(jù)狀態(tài)字的存儲地址,在寫操作時通過數(shù)據(jù)狀態(tài)字判斷該數(shù)據(jù)條目地址是否執(zhí)行過擦除操作,從而避免不必要的分區(qū)拷貝和扇區(qū)擦除操作。降低數(shù)據(jù)寫操作代價,也可以進(jìn)ー步提高M(jìn)CU內(nèi)部數(shù)據(jù)Flash的使用壽命。數(shù)據(jù)的讀取操作在最新數(shù)據(jù)分區(qū)上進(jìn)行,首先通過數(shù)據(jù)條目的data id進(jìn)行偏移地址查表,然后進(jìn)行地址計算,計算公式如下
地址=0號分區(qū)首地址+ (最新數(shù)據(jù)分區(qū)號*分區(qū)大小)+偏移地址;和EEPROM的讀取方式一祥,直接讀取該地址便可以得到數(shù)據(jù)。讀取操作不會改變最新數(shù)據(jù)分區(qū)。圖2中數(shù)據(jù)的寫操作流程如下
首先讀取數(shù)據(jù)狀態(tài)字,判斷該數(shù)據(jù)在當(dāng)前最新數(shù)據(jù)分區(qū)的寫入地址是否已經(jīng)被擦除,如果數(shù)據(jù)狀態(tài)字等于Oxff,表明寫入地址已經(jīng)被擦除,按照Flash的寫操作命令序列在data id地址處寫入data id,在data地址處寫入data。如果數(shù)據(jù)狀態(tài)字不等于Oxff,表明寫入地址未被擦除,需要進(jìn)行分區(qū)拷貝操作。寫操作完成后更新最新分區(qū)狀態(tài)字。下面結(jié)合附圖2說明ー下分區(qū)拷貝操作和最新分區(qū)狀態(tài)字更新算法。分區(qū)拷貝操作
首先備份當(dāng)前最新分區(qū)狀態(tài)字和最新數(shù)據(jù)分區(qū)編號,同時最新數(shù)據(jù)分區(qū)編號++,如果最新數(shù)據(jù)分區(qū)號等于分區(qū)個數(shù),設(shè)置最新數(shù)據(jù)分區(qū)號為O。查看最新數(shù)據(jù)分區(qū)首地址是否是Flash扇區(qū)首地址,如果是,首先擦除這個扇區(qū),然后按照Flash的寫操作命令序列在當(dāng)前最新數(shù)據(jù)分區(qū)的data id地址處寫入data id,在data地址處寫入data,然后將備份數(shù)據(jù)分區(qū)內(nèi)的其他數(shù)據(jù)復(fù)制到當(dāng)前最新數(shù)據(jù)分區(qū)中。最新分區(qū)狀態(tài)字更新算法判斷所備份最新分區(qū)狀態(tài)字是否等于Oxfe,如果等于Oxfe,設(shè) 置最新分區(qū)狀態(tài)字為0,否則最新分區(qū)狀態(tài)字++,然后將最新分區(qū)狀態(tài)字寫入當(dāng)前最新數(shù)據(jù)分區(qū)狀態(tài)字地址。如果嵌入式系統(tǒng)在寫操作期間掉電,由于在發(fā)生掉電時最新數(shù)據(jù)分區(qū)狀態(tài)字還沒有更新,再次上電時查找到的最新數(shù)據(jù)分區(qū)仍然是寫操作進(jìn)行前的那個數(shù)據(jù)分區(qū),通過在寫入操作完成后更新狀態(tài)字的方式保證了即使發(fā)生了掉電,數(shù)據(jù)仍能恢復(fù)為原來的數(shù)據(jù)分區(qū)中的數(shù)據(jù)。上電時通過分區(qū)狀態(tài)字查找最新數(shù)據(jù)分區(qū)的算法如下
當(dāng)存在取值為O的分區(qū)狀態(tài)字時,小于分區(qū)數(shù)的最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分
區(qū);
當(dāng)不存在取值為O的分區(qū)狀態(tài)字時,最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū);該算法實現(xiàn)流程如附圖3所示,上電后經(jīng)過該算法處理后,可以得到最新數(shù)據(jù)分區(qū)編號和最新數(shù)據(jù)分區(qū)狀態(tài)字。
權(quán)利要求
1.ー種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于將所有非易失性數(shù)據(jù)條目組織在ー個分區(qū)中,將數(shù)據(jù)Flash的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),不同數(shù)據(jù)分區(qū)存儲數(shù)據(jù)在不同歷史時間的拷貝;當(dāng)前數(shù)據(jù)分區(qū)存儲最新的數(shù)據(jù)拷貝;在數(shù)據(jù)讀操作進(jìn)行吋,計算最新數(shù)據(jù)拷貝的Flash存儲位置,直接讀取該地址;在數(shù)據(jù)寫操作進(jìn)行吋,判斷數(shù)據(jù)寫入位置是否已經(jīng)被擦除,如果寫入位置未擦除,將數(shù)據(jù)寫入下ー個分區(qū),同時將當(dāng)前分區(qū)中的其他數(shù)據(jù)復(fù)制到下ー個分區(qū);如果寫入位置已經(jīng)擦除,直接將數(shù)據(jù)寫入當(dāng)前分區(qū)中。
2.如權(quán)利要求I所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于所述數(shù)據(jù)分區(qū)大小和個數(shù)取值均為2的冪次方,且分區(qū)個數(shù)不大于256,分區(qū)大小*分區(qū)個數(shù)等于扇區(qū)大小*扇區(qū)個數(shù),扇區(qū)個數(shù)至少為2,以滿足實現(xiàn)掉電恢復(fù)功能的需要。
3.如權(quán)利要求I所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于所述數(shù)據(jù)分區(qū)設(shè)置有狀態(tài)字,大小為單字節(jié),位置在分區(qū)起始地址,標(biāo)識分區(qū)數(shù)據(jù)的存儲歷史時間;數(shù)據(jù)分區(qū)狀態(tài)字在毎次分區(qū)擦除后執(zhí)行的第一次寫入操作后更新,依次遞增且不等于Oxff,當(dāng)遞增到Oxff吋,設(shè)置狀態(tài)字為O。
4.如權(quán)利要求3所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于當(dāng)存在取值為O的分區(qū)狀態(tài)字時,小于分區(qū)數(shù)的最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū),當(dāng)不存在取值為O的分區(qū)狀態(tài)字時,最大狀態(tài)字代表的分區(qū)為最新數(shù)據(jù)分區(qū)。
5.如權(quán)利要求I所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于將所有非易失性數(shù)據(jù)條目組織在ー個分區(qū)中是指數(shù)據(jù)分區(qū)中數(shù)據(jù)條目的組織是以固定序列的形式進(jìn)行的,每個數(shù)據(jù)條目都有固定的偏移地址,數(shù)據(jù)條目地址=分區(qū)起始地址+偏移地址。
6.如權(quán)利要求I或5所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于所述的數(shù)據(jù)條目格式為data id+data, data id,它為單字節(jié)大小,卩隹ー標(biāo)識該數(shù)據(jù),data為數(shù)據(jù)內(nèi)容,長度由所表示的含義決定。
7.如權(quán)利要求6所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在干所述數(shù)據(jù)條目中的data id,其取值區(qū)間為
的整型數(shù)據(jù),不僅標(biāo)識數(shù)據(jù),同時其地址做為數(shù)據(jù)條目的狀態(tài)字存儲地址,表示該數(shù)據(jù)條目在當(dāng)前分區(qū)中的地址是否已經(jīng)被擦除。
8.如權(quán)利要求I所述的利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,其特征在于所述數(shù)據(jù)寫入位置是否已經(jīng)被擦除是通過數(shù)據(jù)條目中的數(shù)據(jù)狀態(tài)字進(jìn)行判斷的,首先讀取該數(shù)據(jù)條目的狀態(tài)字,如果狀態(tài)字等于OxfT,則數(shù)據(jù)寫入地址已經(jīng)被擦除,如果不等于Oxff,則數(shù)據(jù)寫入地址未被擦除。
全文摘要
本發(fā)明公開了一種利用MCU內(nèi)部數(shù)據(jù)Flash存儲非易失性數(shù)據(jù)的方法,不僅操作方便,應(yīng)用接口簡單,而且可以盡量避免扇區(qū)擦除操作,提高存儲效率,同時提高M(jìn)CU內(nèi)部數(shù)據(jù)Flash的使用壽命。它將所有非易失性數(shù)據(jù)條目組織在一個分區(qū)中,將數(shù)據(jù)Flash的若干扇區(qū)劃分為多個數(shù)據(jù)分區(qū),不同數(shù)據(jù)分區(qū)存儲數(shù)據(jù)在不同歷史時間的拷貝;當(dāng)前數(shù)據(jù)分區(qū)存儲最新的數(shù)據(jù)拷貝;在數(shù)據(jù)讀操作進(jìn)行時,計算最新數(shù)據(jù)拷貝的Flash存儲位置,直接讀取該地址;在數(shù)據(jù)寫操作進(jìn)行時,判斷數(shù)據(jù)寫入位置是否已經(jīng)被擦除,如果寫入位置未擦除,將數(shù)據(jù)寫入下一個分區(qū),同時將當(dāng)前分區(qū)中的其他數(shù)據(jù)復(fù)制到下一個分區(qū);如果寫入位置已經(jīng)擦除,直接將數(shù)據(jù)寫入當(dāng)前分區(qū)中。
文檔編號G06F12/06GK102662852SQ20121007445
公開日2012年9月12日 申請日期2012年3月20日 優(yōu)先權(quán)日2012年3月20日
發(fā)明者劉源楊, 李研強, 王知學(xué), 馬建輝 申請人:山東省科學(xué)院自動化研究所