基于Flash的程序分層存儲(chǔ)、運(yùn)行以及升級(jí)的方法和裝置的制造方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及嵌入式系統(tǒng)領(lǐng)域,特別是指一種基于Flash的程序分層存儲(chǔ)、運(yùn)行以 及升級(jí)的方法和裝置。
【背景技術(shù)】
[0002] 對(duì)于現(xiàn)有的嵌入式系統(tǒng),由于其程序都比較大,少則幾十兆,多則幾百兆,其已經(jīng) 遠(yuǎn)遠(yuǎn)超過了 CPU內(nèi)部的存儲(chǔ)空間,所以無論是程序的存儲(chǔ)和運(yùn)行都無法在CPU內(nèi)部的ROM 和RAM中完成。
[0003] 現(xiàn)有技術(shù)是將程序存儲(chǔ)到CPU外部的Flash (閃存)中,運(yùn)行時(shí)將程序讀到CPU外 部的RAM中。Flash主要有Nor Flash和Nand Flash兩種,而Nor Flash由于價(jià)格比較昂 貴,考慮到產(chǎn)品的成本,所以被很少使用,在絕大部分的應(yīng)用中都使用Nand Flash存儲(chǔ)程 序。Nand Flash由于其存儲(chǔ)空間大、價(jià)格低廉等優(yōu)勢(shì)被廣泛的應(yīng)用在各種嵌入式系統(tǒng)中,以 Nand Flash為例,其框圖如圖1所示,其中CPU內(nèi)部的ROM和RAM未示出。
[0004] 對(duì)于程序的存儲(chǔ),現(xiàn)有技術(shù)是將程序作為一個(gè)整體,存儲(chǔ)到Nand Flash中,如圖2 所示,左邊的陰影部分表示程序的存儲(chǔ)區(qū)域。一般將Nand Flash的從第0塊開始的一塊區(qū) 域分配用來存儲(chǔ)這個(gè)程序,這個(gè)區(qū)域的大小一般是程序大小的2至3倍;程序在被寫入到 Nand Flash中的時(shí)候,從第0塊開始順序?qū)懭耄绻麢z測(cè)到壞塊的話,就跳過壞塊,找到下 一個(gè)好塊接著寫入,直至程序?qū)懭胪瓿桑鐖D3所示,其中第1、5、6塊為壞塊。
[0005] 當(dāng)程序被存儲(chǔ)在Nand Flash中后,系統(tǒng)上電后,CPU內(nèi)部ROM中固化的啟動(dòng)程序, 會(huì)將Nand Flash前幾 K或十幾 K的代碼拷貝到CPU內(nèi)部的RAM中執(zhí)行,通過這幾 K或十幾 K的代碼將Nand Flash中完整的代碼拷貝到CPU外部的RAM中執(zhí)行。
[0006] 對(duì)于這種程序的存儲(chǔ)方法,存在以下問題:
[0007] 第一、可靠性差:由于現(xiàn)有Nand Flash制作工藝的問題,Nand Flash在出廠的時(shí) 候,就伴隨有一定的壞塊,并且在使用過程中也會(huì)出現(xiàn)新的壞塊,如果分配用來存儲(chǔ)程序的 區(qū)域內(nèi)的好塊的總存儲(chǔ)大小小于程序的大小的時(shí)候,那寫入的程序就是有問題的,從而不 能正常啟動(dòng)。
[0008] 第二、程序難于維護(hù):當(dāng)程序被存儲(chǔ)到Nand Flash中后,需要對(duì)程序進(jìn)行維護(hù)(如 修復(fù)、升級(jí)、打補(bǔ)丁等),由于程序是作為一個(gè)整體存在,Nand Flash的特性決定了在向其寫 入數(shù)據(jù)的時(shí)候必須先要對(duì)其進(jìn)行擦除操作,所以一旦舊程序被擦除,而新程序又寫入失敗 的話,那整個(gè)程序也就遭到了破壞,無法再啟動(dòng)。
【發(fā)明內(nèi)容】
[0009] 本發(fā)明提供一種可靠性高,便于維護(hù)的基于Flash的程序分層存儲(chǔ)、運(yùn)行以及升 級(jí)的方法和裝置。
[0010] 為解決上述技術(shù)問題,本發(fā)明提供技術(shù)方案如下:
[0011] -種基于Flash的程序分層存儲(chǔ)的方法,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述方法 包括:
[0012] 將所述引導(dǎo)程序?qū)懭隖lash的已知的好塊中;
[0013] 將所述應(yīng)用程序?qū)懭隖lash中;其中,若遇到壞塊,則根據(jù)預(yù)先建立的壞塊列表, 寫入與該壞塊映射的好塊中,所述壞塊列表中存儲(chǔ)有壞塊和好塊的映射關(guān)系。
[0014] 一種基于Flash的程序分層運(yùn)行的方法,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述引導(dǎo) 程序和應(yīng)用程序都存儲(chǔ)在Flash中,所述方法包括:
[0015] 從Flash中已知的好塊中讀出所述引導(dǎo)程序至RAM ;
[0016] 運(yùn)行所述引導(dǎo)程序,初始化程序的運(yùn)行環(huán)境;
[0017] 從Flash中讀出預(yù)先存儲(chǔ)的應(yīng)用程序至RAM ;其中,若遇到壞塊,則根據(jù)預(yù)先存儲(chǔ) 的壞塊列表,讀出與該壞塊映射的好塊中的數(shù)據(jù),所述壞塊列表中存儲(chǔ)有壞塊和好塊的映 射關(guān)系;
[0018] 運(yùn)行所述應(yīng)用程序,實(shí)現(xiàn)程序的功能。
[0019] -種基于Flash的程序分層升級(jí)的方法,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述引導(dǎo) 程序和應(yīng)用程序都存儲(chǔ)在Flash中,所述方法包括:
[0020] 從Flash已知的好塊中讀出所述引導(dǎo)程序至RAM ;
[0021] 運(yùn)行所述引導(dǎo)程序,初始化程序的運(yùn)行環(huán)境;
[0022] 接收升級(jí)后的應(yīng)用程序至RAM ;
[0023] 從Flash中擦除原有的應(yīng)用程序;其中,若遇到壞塊,則根據(jù)預(yù)先存儲(chǔ)的壞塊列 表,擦除與該壞塊映射的好塊中的數(shù)據(jù),所述壞塊列表中存儲(chǔ)有壞塊和好塊的映射關(guān)系;
[0024] 將升級(jí)后的應(yīng)用程序從RAM寫入Flash;其中,若遇到壞塊,則根據(jù)預(yù)先存儲(chǔ)的壞 塊列表,寫入與該壞塊映射的好塊中。
[0025] -種基于Flash的程序分層存儲(chǔ)的裝置,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述裝置 包括:
[0026] 第一寫入模塊,用于將所述引導(dǎo)程序?qū)懭隖lash的已知的好塊中;
[0027] 第二寫入模塊,用于將所述應(yīng)用程序?qū)懭隖lash中;其中,若遇到壞塊,則根據(jù)預(yù) 先建立的壞塊列表,寫入與該壞塊映射的好塊中,所述壞塊列表中存儲(chǔ)有壞塊和好塊的映 射關(guān)系。
[0028] 一種基于Flash的程序分層運(yùn)行的裝置,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述引導(dǎo) 程序和應(yīng)用程序都存儲(chǔ)在Flash中,所述裝置包括:
[0029] 第一讀取模塊,用于從Flash中已知的好塊中讀出所述引導(dǎo)程序至RAM ;
[0030] 第一運(yùn)行模塊,用于運(yùn)行所述引導(dǎo)程序,初始化程序的運(yùn)行環(huán)境;
[0031] 第二讀取模塊,用于從Flash中讀出預(yù)先存儲(chǔ)的應(yīng)用程序至RAM;其中,若遇到壞 塊,則根據(jù)預(yù)先存儲(chǔ)的壞塊列表,讀出與該壞塊映射的好塊中的數(shù)據(jù),所述壞塊列表中存儲(chǔ) 有壞塊和好塊的映射關(guān)系;
[0032] 第二運(yùn)行模塊,用于運(yùn)行所述應(yīng)用程序,實(shí)現(xiàn)程序的功能。
[0033] -種基于Flash的程序分層升級(jí)的裝置,所述程序由引導(dǎo)程序和應(yīng)用程序組成, 所述引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,所述應(yīng)用程序用于實(shí)現(xiàn)程序的功能,所述引導(dǎo) 程序和應(yīng)用程序都存儲(chǔ)在Flash中,所述裝置包括:
[0034] 第三讀取模塊,用于從Flash已知的好塊中讀出所述引導(dǎo)程序至RAM ;
[0035] 第三運(yùn)行模塊,用于運(yùn)行所述引導(dǎo)程序,初始化程序的運(yùn)行環(huán)境;
[0036] 第一接收模塊,用于接收升級(jí)后的應(yīng)用程序至RAM ;
[0037] 第一擦除模塊,從Flash中擦除原有的應(yīng)用程序;其中,若遇到壞塊,則根據(jù)預(yù)先 存儲(chǔ)的壞塊列表,擦除與該壞塊映射的好塊中的數(shù)據(jù),所述壞塊列表中存儲(chǔ)有壞塊和好塊 的映射關(guān)系;
[0038] 第四寫入模塊,用于將升級(jí)后的應(yīng)用程序從RAM寫入Flash ;其中,若遇到壞塊,則 根據(jù)預(yù)先存儲(chǔ)的壞塊列表,寫入與該壞塊映射的好塊中。
[0039] 本發(fā)明具有以下有益效果:
[0040] 本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法中,將程序拆分為引導(dǎo)程序和應(yīng)用程 序,引導(dǎo)程序用于初始化程序的運(yùn)行環(huán)境,應(yīng)用程序用于實(shí)現(xiàn)程序的功能;在存儲(chǔ)時(shí),首先 將引導(dǎo)程序?qū)懭隖lash的已知的好塊中;然后將應(yīng)用程序?qū)懭隖lash中,此時(shí),需要用到壞 塊列表,壞塊列表中存儲(chǔ)有壞塊和好塊的映射關(guān)系,在存儲(chǔ)應(yīng)用程序時(shí),從某一塊開始順序 存儲(chǔ),若遇到壞塊,則通過壞塊列表映射到好塊,將數(shù)據(jù)存儲(chǔ)到好塊中。
[0041] 本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法對(duì)程序進(jìn)行分層存儲(chǔ),保證了在 Flash中程序存儲(chǔ)的可靠性。首先,將引導(dǎo)程序?qū)懭隖lash的已知的好塊中,保證了引導(dǎo)程 序被可靠的存儲(chǔ)到了 Flash中;然后再將應(yīng)用程序?qū)懭氲紽lash中,由于壞塊列表的映射關(guān) 系,保證了寫入到Flash中的應(yīng)用程序可靠性。
[0042] 而且,在存儲(chǔ)時(shí),分配用來存儲(chǔ)程序的區(qū)域內(nèi)的壞塊均已通過壞塊列表映射到了 好塊,實(shí)際上可以看作該區(qū)域內(nèi)每個(gè)塊均為好塊,即該區(qū)域的存儲(chǔ)空間是連續(xù)可靠的,只要 分配用來存儲(chǔ)程序的區(qū)域大于程序的大小,則寫入的程序是可靠的,可靠性高。
[0043] 最后,在對(duì)程序進(jìn)行維護(hù)時(shí),只需要維護(hù)應(yīng)用程序即可,可以不對(duì)引導(dǎo)程序進(jìn)行操 作,這樣即使維護(hù)應(yīng)用程序時(shí)出現(xiàn)了問題,那么引導(dǎo)程序不會(huì)遭到破壞,可以通過引導(dǎo)程序 找出問題原因,并且可以方便的將應(yīng)用程序通過上面的方法重新寫入,便于維護(hù)。
[0044] 故本發(fā)明的基于Flash的程序分層存儲(chǔ)方法可靠性高,便于維護(hù)。
【附圖說明】
[0045] 圖1為嵌入式系統(tǒng)的結(jié)構(gòu)示意圖;
[0046] 圖2為現(xiàn)有的技術(shù)中程序存儲(chǔ)的不意圖一;
[0047] 圖3為現(xiàn)有的技術(shù)中程序存儲(chǔ)的不意圖_.;
[0048] 圖4為Nand Flash的一個(gè)頁的結(jié)構(gòu)示意圖;
[0049] 圖5為本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法對(duì)Flash進(jìn)行操作的示意圖;
[0050] 圖6為本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法中映射后的效果圖;
[0051] 圖7為本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法中的程序存儲(chǔ)位置示意圖;
[0052] 圖8為本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法流程圖一;
[0053] 圖9為本發(fā)明的基于Flash的程序分層存儲(chǔ)的方法流程圖二;
[0054] 圖10為本發(fā)明的基于Flash的程序分層運(yùn)行的方法流程圖;
[0055] 圖11為本發(fā)明的基于Flash的程序分層升級(jí)的方法流程圖;
[0056] 圖12為本發(fā)明的基于Flash的程序分層存儲(chǔ)的裝置結(jié)構(gòu)圖;
[0057] 圖13為本發(fā)明的基于Flash的程序分層存儲(chǔ)的裝置結(jié)構(gòu)圖二;
[0058