一種單片機(jī)固件升級方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于單片機(jī)設(shè)備固件升級技術(shù)領(lǐng)域,涉及一種單片機(jī)固件升級方法。
【背景技術(shù)】
[0002]無操作系統(tǒng)單片機(jī)設(shè)備的內(nèi)存資源很有限,致使這類設(shè)備的固件升級過程無法像智能設(shè)備的升級方式一樣,將新版本的程序接收完畢后再寫入到Flash中,如何保證這類設(shè)備升級過程的穩(wěn)定性和可靠性成了單片機(jī)程序開發(fā)一大問題。
[0003]目前對單片機(jī)進(jìn)行固件升級的方式主要有兩種,一種是由維護(hù)人員親自到達(dá)設(shè)備現(xiàn)場使用仿真器或者燒寫工具進(jìn)行固件升級,如果設(shè)備分布范圍廣泛,那么這種升級方式將浪費(fèi)大量的人力資源,目前這種升級方式仍然在許多單片機(jī)設(shè)備中被采用。另外一種目前使用的較多的升級方式是在升級過程中不斷地用接收到的新程序覆蓋舊程序,這種升級方式的不足之處在于:
[0004](1) 一旦升級過程出現(xiàn)異常(如斷電、設(shè)備無故重啟)情況將造成設(shè)備崩潰;
[0005](2)無法在新舊程序之間自由切換,當(dāng)然也不支持軟件回滾;
[0006](3)升級完成后必須重新啟動,否則無法繼續(xù)處理當(dāng)前的業(yè)務(wù);
[0007](4)可能造成設(shè)備崩潰的危險(xiǎn)時間較長;
[0008](5)不支持?jǐn)帱c(diǎn)續(xù)傳。
[0009]因此提高單片機(jī)固件升級的可靠性和穩(wěn)定性,從根本上杜絕升級本身造成設(shè)備崩潰的現(xiàn)象發(fā)生,已成為亟待解決的問題。
【發(fā)明內(nèi)容】
[0010]本發(fā)明的目的是為了克服已有技術(shù)的缺陷,為了解決單片機(jī)設(shè)備進(jìn)行固件升級時存在的可靠性差、穩(wěn)定性低的問題,提出了一種單片機(jī)固件升級方法。
[0011]本發(fā)明方法是通過以下技術(shù)方案實(shí)現(xiàn)的:
[0012]—種單片機(jī)固件升級的方法,步驟包括:
[0013]步驟一、將單片機(jī)的Flash分為Boot區(qū)、Flag區(qū)、APP1區(qū)、APP2區(qū),Boot區(qū)用于存儲單片機(jī)上電程序;Flag區(qū)用于存儲升級輔助變量;APP1區(qū)和APP2區(qū)用于存儲升級前固件或升級新固件;所述升級輔助變量包括bootflag變量和breakaddr變量,其中當(dāng)bootflag變量的值為0時,APP1區(qū)為主程序區(qū)、APP2區(qū)為備用升級區(qū),當(dāng)bootflag變量的值為非0時,APP2區(qū)為主程序區(qū)、APP1區(qū)為備用升級區(qū);所述breakaddr變量的值表示固件升級時Flash的位置;
[0014]步驟二、單片機(jī)上電啟動,檢查bootflag變量的值,根據(jù)bootflag變量的值判斷單片機(jī)的主程序區(qū)和備用升級區(qū),并且跳轉(zhuǎn)至主程序區(qū)執(zhí)行程序;
[0015]步驟三、單片機(jī)接收到升級指令后,檢查breakaddr變量的值,將breakaddr變量的值填寫到響應(yīng)報(bào)文對應(yīng)字節(jié)上,響應(yīng)報(bào)文打包完畢,單片機(jī)向升級服務(wù)器發(fā)送響應(yīng)報(bào)文并等待應(yīng)答;
[0016]步驟四、升級服務(wù)器接收到單片機(jī)發(fā)來的響應(yīng)報(bào)文后,根據(jù)響應(yīng)報(bào)文對應(yīng)字節(jié)上的內(nèi)容決定固件升級開始位置,當(dāng)響應(yīng)報(bào)文中對應(yīng)字節(jié)內(nèi)容為0時,升級服務(wù)器從升級新固件的起始位置發(fā)送升級新固件報(bào)文給單片機(jī);當(dāng)響應(yīng)報(bào)文中對應(yīng)字節(jié)內(nèi)容為非0時,升級服務(wù)器從升級新固件的上次升級中斷位置發(fā)送升級新固件報(bào)文給單片機(jī);
[0017]步驟五、單片機(jī)接收到升級新固件報(bào)文后進(jìn)行差錯檢驗(yàn),若檢驗(yàn)結(jié)果為正確,則將接收到的固件升級報(bào)文寫入到備用升級區(qū),同時更新breakaddr變量的值,然后發(fā)送檢驗(yàn)正確的響應(yīng)報(bào)文給升級服務(wù)器;若檢驗(yàn)結(jié)果為錯誤,則發(fā)送請求數(shù)據(jù)重傳響應(yīng)報(bào)文到升級服務(wù)器;
[0018]步驟六、當(dāng)升級服務(wù)器收到檢驗(yàn)正確的響應(yīng)報(bào)文時,則發(fā)送下一包升級新固件報(bào)文給單片機(jī);當(dāng)升級服務(wù)器收到請求數(shù)據(jù)重傳響應(yīng)報(bào)文時,則發(fā)送當(dāng)前升級新固件報(bào)文給單片機(jī);
[0019]步驟七、重復(fù)步驟五和步驟六的過程,直至單片機(jī)接收到最后一包升級新固件報(bào)文并成功寫入到備用升級區(qū);此時breakaddr變量將被置0,并更新bootflag變量的值;
[0020]步驟八、單片機(jī)重新啟動,運(yùn)行升級新固件,升級完成。
[0021]有益效果
[0022](1)本發(fā)明方法將單片機(jī)的Flash進(jìn)行分區(qū),將新舊固件分區(qū)存儲,避免了升級過程燒寫Flash對原固件造成的影響,使原固件不受破壞;同時,通過變量設(shè)置,用戶可根據(jù)實(shí)際情況選擇所需的固件,新舊版本固件切換靈活。
[0023](2)本發(fā)明方法實(shí)現(xiàn)過程中,只要Flash本身不存在問題,就不存在固件升級失敗,即使出現(xiàn)中斷,上電恢復(fù)后升級也將會繼續(xù)即具有斷點(diǎn)續(xù)傳功能,同時,本升級程序不會造成設(shè)備崩潰。
【附圖說明】
[0024]圖1單片機(jī)Flash分區(qū)
[0025]圖2本發(fā)明單片機(jī)固件升級流程圖
【具體實(shí)施方式】
[0026]下面結(jié)合附圖和具體實(shí)施例對本發(fā)明作進(jìn)一步的說明。
[0027]如圖2所示,本發(fā)明單片機(jī)固件升級方法,其具體實(shí)施步驟為:
[0028]步驟一、如圖1所示,將單片機(jī)的Flash按功能分為Boot區(qū)、Flag區(qū)、APP1區(qū)、APP2區(qū)。Boot區(qū)用于存儲單片機(jī)上電程序。Flag區(qū)用于存儲一些升級輔助變量,如bootflag變量決定單片機(jī)的主程序區(qū)和備用升級區(qū),breakaddr變量存放固件升級時Flash的位置。APP1區(qū)和APP2區(qū)用于存儲升級前固件(即升級時單片機(jī)運(yùn)行的固件)或升級新固件,當(dāng)bootflag變量的值為0時,APP1區(qū)存儲升級前固件,此時稱APP1區(qū)為主程序區(qū),APP2區(qū)等待存儲升級新固件,此時稱APP2區(qū)為備用升級區(qū);當(dāng)bootflag變量的值為非0時,APP2區(qū)存儲升級前固件,此時稱APP2區(qū)為主程序區(qū),APP1區(qū)等待存儲升級新固件,此時稱APP1區(qū)為備用升級區(qū);一般情況下,APP1區(qū)和APP2區(qū)大小一致。
[0029]步驟二、單片機(jī)上電啟動,運(yùn)行上電程序,檢查bootflag變量的值,根據(jù)bootflag變量的值判斷單片機(jī)的主程序區(qū)和備用升級區(qū),并且跳轉(zhuǎn)至主程序區(qū)執(zhí)行程