一種實現(xiàn)程序備份的方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及嵌入式軟件領(lǐng)域,尤其涉及一種利用單片機片內(nèi)FLASH實現(xiàn)程序備份的方法。
【背景技術(shù)】
[0002]嵌入式設(shè)備中往往使用FLASH存儲設(shè)備來存儲程序,一旦當FLASH存儲的程序被破壞,嵌入式設(shè)備將無法正常運行。為了提高嵌入式設(shè)備的可靠性,絕大多數(shù)廠商都把存儲在FLASH中的程序進行了備份,當其中一份程序被破壞時、可以使用備份程序繼續(xù)運行,提高設(shè)備的可靠性。
[0003]在傳統(tǒng)技術(shù)中,申請?zhí)枮?01310034458.4,名稱為《基于單個flash存儲芯片的雙啟動方法》的專利提供了一種利用主備BOOT提高設(shè)備可靠性的方法,在FLASH存儲芯片的不同位置上分別存儲主用BOOT和備用B00T,CPU的地址線通過CPLD邏輯模塊與FLASH存儲芯片的地址線連接;CPLD邏輯模塊上設(shè)有啟動成功標志寄存器,所述啟動成功標志寄存器根據(jù)主用BOOT或備用BOOT啟動是否成功進行相應(yīng)的職位;CPLD邏輯模塊根據(jù)所述啟動成功標志寄存器的狀態(tài)進行主用BOOT和備用BOOT輪轉(zhuǎn),如果需要從主用BOOT啟動,則將CPU地址信息透傳給FLASH存儲芯片,并從主用BOOT引導系統(tǒng)啟動;如果需要從備用BOOT啟動,則根據(jù)備用BOOT程序在FLASH存儲器中的位置鎖住響應(yīng)的地址線,并從備用BOOT引導啟動。
[0004]上述專利通過CPLD來屏蔽主備程序存儲在不同位置帶來的對啟動程序的影響。啟動程序就好像兩次在同一個位置去加載啟動程序。但是對于單片機來說、往往CPU自帶片內(nèi)FLASH,并且為了節(jié)約成本,也不會為單片機外掛FLASH芯片。
[0005]申請?zhí)枮?01210225631.4,名稱為《一種實現(xiàn)自動雙FLASH啟動CPU系統(tǒng)的方法》的專利提供了一種實現(xiàn)自動雙FLASH啟動CPU系統(tǒng)的方法,采用兩片F(xiàn)LASH啟動CPU,當其中主FLASH啟動失敗后,CPLD將備份FLASH選中并輸出復(fù)位信號到CPU,讓CPU啟動。該專利使用兩片F(xiàn)LASH、成本較高。
【發(fā)明內(nèi)容】
[0006]本發(fā)明所要解決的技術(shù)問題是:提出一種實現(xiàn)程序備份的方法,解決傳統(tǒng)技術(shù)中無法在單片機片內(nèi)FLASH實現(xiàn)程序備份,采用雙FLASH進行程序備份成本高的問題。
[0007]本發(fā)明解決上述技術(shù)問題所采用的方案是,一種實現(xiàn)程序備份的方法,包括:
[0008]a.在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序;
[0009]b.在程序啟動的時候判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序,并檢測程序代碼是否發(fā)生故障;
[0010]c.若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,切換至備份分區(qū)運行程序。
[0011]進一步的,步驟a中,所述在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份相同的可執(zhí)行程序的方法是:
[0012]使用兩個鏈接腳本將嵌入式源代碼編譯成兩個執(zhí)行邏輯相同但代碼段的起始地址不同的可執(zhí)行程序,然后將兩個可執(zhí)行程序分別放于片內(nèi)FLASH的主備分區(qū)中,所述代碼段的起始地址分別為片內(nèi)FLASH主備分區(qū)的起始地址。
[0013]進一步的,步驟a中還包括:將需要對FLASH進行擦除、寫入、讀取操作的函數(shù)鏈接到RAM地址空間。
[0014]進一步的,步驟b中,在程序啟動的時候通過異常向量表中的值判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序。
[0015]上述具體判斷方法為:如果異常向量表中的值小于0x10000,則判定當前執(zhí)行的是主分區(qū)中的程序;如果異常向量表中的值大于0x10000,則判定當前執(zhí)行的是備份分區(qū)中的程序。
[0016]進一步的,步驟b中,通過CRC校驗來檢測程序代碼是否發(fā)生故障。
[0017]進一步的,步驟b中,若檢測到程序代碼未發(fā)生故障,則繼續(xù)執(zhí)行該分區(qū)內(nèi)的程序代碼。
[0018]進一步的,步驟c中若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,通過修改異常向量表后并重啟單片機切換至備份分區(qū)運行程序。
[0019]具體的,所述修改異常向量表的方法為:
[0020]將異常向量表中的地址修改為當前地址加上備份分區(qū)的起始地址。
[0021]進一步的,步驟c中還包括:
[0022]若檢測到執(zhí)行的為備份分區(qū)中的程序且程序代碼發(fā)生故障時,則告警程序遭到破壞,并掛起單片機。
[0023]本發(fā)明的有益效果是:可以實現(xiàn)單片機片內(nèi)FLASH主備程序切換:在片內(nèi)FLASH的主分區(qū)程序出現(xiàn)故障時,自動檢測并切換至備份分區(qū)執(zhí)行,可以延長單片機使用壽命;由于只需要一個FLASH即可實現(xiàn)主備程序切換,也節(jié)約了硬件成本。
【附圖說明】
[0024]圖1為本發(fā)明實現(xiàn)程序備份方法流程圖;
[0025]圖2為程序鏈接后在FLASH中存儲結(jié)構(gòu)圖。
【具體實施方式】
[0026]本發(fā)明旨在提出一種利用單片機片內(nèi)FLASH實現(xiàn)程序備份的方法,解決傳統(tǒng)技術(shù)中無法在單片機片內(nèi)FLASH實現(xiàn)程序備份,采用雙FLASH進行程序備份成本高的問題。
[0027]如圖1所示,本發(fā)明中的利用單片機片內(nèi)FLASH實現(xiàn)程序備份的方法,包括以下實現(xiàn)步驟:
[0028]a.在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序;
[0029]b.在程序啟動的時候判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序,并檢測程序代碼是否發(fā)生故障;
[0030]c.若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,切換至備份分區(qū)運行程序。
[0031]在具體實現(xiàn)上,步驟a中,所述在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序的方法是:
[0032]使用兩個鏈接腳本將嵌入式源代碼編譯成兩個執(zhí)行邏輯相同但代碼段的起始地址不同的可執(zhí)行程序,然后將兩個可執(zhí)行程序分別放于片內(nèi)FLASH的主備分區(qū)中,所述代碼段的起始地址分別為片內(nèi)FLASH主備分區(qū)的起始地址。
[0033]此外,將需要對FLASH進行擦除、寫入、讀取操作的函數(shù)鏈接到RAM地址空間,以防止對FLASH進行擦除操作時,擦除掉正在執(zhí)行擦除操作的代碼,導致系統(tǒng)異常;程序鏈接后在FLASH中存儲結(jié)構(gòu)如圖2所示,在程序運行時,這部分代碼會拷貝到RAM中。
[0034]步驟b中,在程序啟動的時候通過異常向量表中的值判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序:
[0035]具體為:如果異常向量表中的值小于0x10000,則判定當前執(zhí)行的是主分區(qū)中的程序;如果異常向量表中的值大于0x10000,則判定當前執(zhí)行的是備份分區(qū)中的程序。
[0036]此外,步驟b中是通過CRC校驗來檢測程序代碼是否發(fā)生故障。
[0037]步驟c中若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,通過修改FLASH起始地址處的異常向量表后并重啟單片機切換至備份分區(qū)運行程序。修改異常向量表的方法為:將異常向量表中的地址修改為當前地址加上備份分區(qū)的起始地址。
[0038]如果主分區(qū)中的程序代碼未遭到破壞,則繼續(xù)執(zhí)行主分區(qū)中的程序代碼。若檢測到執(zhí)行的為備份分區(qū)中的程序且程序代碼發(fā)生故障時,則告警程序遭到破壞,并掛起單片機。
[0039]如果檢測到當前執(zhí)行的是備份分區(qū)中的程序代碼,而程序代碼未發(fā)生破壞,則繼續(xù)執(zhí)行備份分區(qū)中的程序代碼。
[0040]通過上述手段,在片內(nèi)FLASH的主分區(qū)程序出現(xiàn)故障時,自動檢測并切換至備份分區(qū)執(zhí)行,可以延長單片機使用壽命。
【主權(quán)項】
1.一種實現(xiàn)程序備份的方法,其特征在于,包括: a.在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序; b.在程序啟動的時候判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序,并檢測程序代碼是否發(fā)生故障; c.若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,切換至備份分區(qū)運行程序。2.如權(quán)利要求1所述的方法,其特征在于,步驟a中,所述在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序的方法是: 使用兩個鏈接腳本將嵌入式源代碼編譯成兩個執(zhí)行邏輯相同但代碼段的起始地址不同的可執(zhí)行程序,然后將兩個可執(zhí)行程序分別放于片內(nèi)FLASH的主備分區(qū)中,所述代碼段的起始地址分別為片內(nèi)FLASH主備分區(qū)的起始地址。3.如權(quán)利要求1所述的方法,其特征在于,步驟a中還包括:將需要對FLASH進行擦除、寫入、讀取操作的函數(shù)鏈接到RAM地址空間。4.如權(quán)利要求1所述的方法,其特征在于,步驟b中,在程序啟動的時候通過異常向量表中的值判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序。5.如權(quán)利要求4所述的方法,其特征在于,如果異常向量表中的值小于0x10000,則判定當前執(zhí)行的是主分區(qū)中的程序;如果異常向量表中的值大于0x10000,則判定當前執(zhí)行的是備份分區(qū)中的程序。6.如權(quán)利要求1所述的方法,其特征在于,步驟b中,通過CRC校驗來檢測程序代碼是否發(fā)生故障。7.如權(quán)利要求1所述的方法,其特征在于,步驟b中,若檢測到程序代碼未發(fā)生故障,則繼續(xù)執(zhí)行該分區(qū)內(nèi)的程序代碼。8.如權(quán)利要求1所述的方法,其特征在于,步驟c中若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,通過修改異常向量表后并重啟單片機切換至備份分區(qū)運行程序。9.如權(quán)利要求8所述的方法,其特征在于,所述修改異常向量表的方法為: 將異常向量表中的地址修改為當前地址加上備份分區(qū)的起始地址。10.如權(quán)利要求1-9任意一項所述的方法,其特征在于,步驟c中還包括: 若檢測到執(zhí)行的為備份分區(qū)中的程序且程序代碼發(fā)生故障時,則告警程序遭到破壞,并掛起單片機。
【專利摘要】本發(fā)明涉及嵌入式軟件領(lǐng)域,其公開了一種實現(xiàn)程序備份的方法解決傳統(tǒng)技術(shù)中無法在單片機片內(nèi)FLASH實現(xiàn)程序備份,采用雙FLASH進行程序備份成本高的問題。該方法包括:a.在單片機片內(nèi)FLASH的主、備分區(qū)中存入兩份執(zhí)行邏輯相同的可執(zhí)行程序;b.在程序啟動的時候判斷當前執(zhí)行的是主分區(qū)中的程序,還是執(zhí)行的備份分區(qū)中的程序,并檢測程序代碼是否發(fā)生故障;c.若檢測到執(zhí)行的為主分區(qū)中的程序且程序代碼發(fā)生故障時,切換至備份分區(qū)運行程序。本發(fā)明適用于單片機程序備份。
【IPC分類】G06F11/14
【公開號】CN105589765
【申請?zhí)枴緾N201510955701
【發(fā)明人】湛松濤, 郭峰, 張曉東
【申請人】邁普通信技術(shù)股份有限公司
【公開日】2016年5月18日
【申請日】2015年12月17日