關(guān) 峰, 謝曉明
(北京化工大學(xué)研究生院,北京,100029)
目前,通常的嵌入式軟件更新方法是在芯片上手工接跳線并使用專用仿真器,這種方法不僅繁瑣,而且成本高。本文以恩智浦公司的lpc1768為開發(fā)平臺,設(shè)計并實(shí)現(xiàn)了嵌入式設(shè)備軟件更新系統(tǒng)。該系統(tǒng)避免了傳統(tǒng)嵌入式系統(tǒng)升級需要更換芯片或主板等問題,節(jié)約了人力和資金等資源。通過加入二級bootloader程序,對系統(tǒng)升級與否進(jìn)行引導(dǎo);建立備份數(shù)據(jù)區(qū)解決了系統(tǒng)升級過程中掉電問題;引入的傳輸協(xié)議確保傳輸過程中無誤碼。此系統(tǒng)已在實(shí)際中應(yīng)用,并得到了用戶好評。
lpc1768以Cortex-M3為微控制器,器操作頻率可達(dá)100MHz,外圍組件包含高達(dá)512KB的Flash存儲器、64KB的數(shù)據(jù)存儲器,非常適合用于嵌入式開發(fā)。本文將以此平臺為例,對嵌入式軟件設(shè)備更新系統(tǒng)進(jìn)行闡述,系統(tǒng)整體架構(gòu)如圖1所示。
此系統(tǒng)可以為4個主要模塊:bootloader模塊、系統(tǒng)更新模塊、正常工作模塊、上位機(jī)模塊。正常工作模塊是嵌入式設(shè)備主體功能部分,在不需要系統(tǒng)更新情況下,本系統(tǒng)不會對其產(chǎn)生影響。本系統(tǒng)在ARM設(shè)備原有的booloader基礎(chǔ)上,實(shí)現(xiàn)一個簡單的二級bootloader,其通過判斷嵌入式設(shè)備是否與上位機(jī)相連,引導(dǎo)設(shè)備到正常啟動狀態(tài)或是更新模式。系統(tǒng)更新模塊需要通過ARM提供的IAP接口,配合通信協(xié)議,完成對正常模式的更新。更新系統(tǒng)的上位機(jī)采用MFC實(shí)現(xiàn),上位機(jī)需實(shí)現(xiàn)通信協(xié)議中上位機(jī)部分的功能,并且能同步顯示更新過程。
傳統(tǒng)的嵌入式設(shè)備內(nèi)存劃分如圖2(a)所示。這種方式必須借用特定的仿真器,以跳線方式由專業(yè)人員完成程序更新。本文所述機(jī)制對Flash進(jìn)行了重新的設(shè)計,如圖2(b)所示。bootloader存儲區(qū)后面設(shè)計四個鏡像文件存儲區(qū)。其中一個存儲區(qū)用于存放更新模式鏡像文件;另兩個存儲區(qū)存儲工作文件,兩個鏡像文件交替使用,其中一個為另一個的備份鏡像,在更新系統(tǒng)遇到斷電等特殊情況下,啟動備份鏡像;最后一個是參數(shù)配置區(qū),系統(tǒng)根據(jù)其中參數(shù)決定啟動兩個工作模式中的一個以及將新鏡像更新到哪個工作區(qū)。
圖1 嵌入式設(shè)備軟件更新系統(tǒng)總體設(shè)計
圖2(a) 傳統(tǒng)Flash布局 (b) 嵌入式軟件更新系統(tǒng)Flash布局
可以采用分散加載機(jī)制實(shí)現(xiàn)上文所述的Flash分配方案,分散加載文件對嵌入式系統(tǒng)存取器進(jìn)行分別描述,他直接對應(yīng)目標(biāo)硬件存儲器的起始地址和范圍。同時,它在應(yīng)用程序鏈接時用于告訴連接器用戶程序代碼和數(shù)據(jù)的運(yùn)行地址和加載地址,在鏈接時由鏈接器產(chǎn)生相應(yīng)的加載地址和運(yùn)行地址符號,包括代碼和數(shù)據(jù)的加載起始地址、運(yùn)行地址和長度等。
程序在鏈接時可以根據(jù)分散加載文件中指定的存儲器分配方案,將可執(zhí)行鏡像文件分成指定的多個分區(qū),并定位于指定的存儲器物理地址。當(dāng)嵌入式系統(tǒng)在重新上電或復(fù)位時,首先對處理器內(nèi)部寄存器執(zhí)行初始化,然后執(zhí)行ROM存儲器的自舉代碼,根據(jù)鏈接時的存儲器分配方案,將相應(yīng)代碼和數(shù)據(jù)從加載地址復(fù)制到運(yùn)行地址。這樣,定位于RAM存儲器中的代碼和數(shù)據(jù)就在RAM中執(zhí)行,而不再從ROM存儲器中執(zhí)行。
讀書,能提升我們的視野和格局。當(dāng)站在二樓觀景時,我們看到的也許是街角的某處垃圾場,而在二十二樓時,你會將滿城的風(fēng)景,盡收眼底。那些年走過的路,遇到的人,讀過的書,就是我們的格局和視野。這些決定了我們看問題的層次和對事物的判斷。人生閱歷越是豐厚,就越是需要通過讀書去消化內(nèi)心的褶皺和疤痕,和優(yōu)秀的書籍對話,精神自然就往來于天地之間,曲曲折折、隱隱約約、層層疊疊的心境,也漸漸變得柳暗花明,人,就不至于走到山窮水盡的地步。
2.3.1 IAP原理
在應(yīng)用編程(IAP)函數(shù)是固化在微處理器內(nèi)部flash上的一些函數(shù)代碼,最終的用戶程序可以直接通過調(diào)用這些函數(shù)來對內(nèi)部Flash進(jìn)行擦除和編程操作。對于lpc1768來說,IAP命令是Thumb代碼,位于地址0x7FFFFFF。IAP功能的具體使用方法下所示:
(1)定義IAP程序入口地址。由于IAP地址的第0位是1,因此當(dāng)程序計數(shù)器轉(zhuǎn)移到該地址時會引起Thumb指令集的變化。
#define IAP_ADD & 0x7FFFFF1
(2)定義數(shù)據(jù)結(jié)構(gòu)或指針,將IAP命令表和結(jié)果表傳遞給IAP函數(shù)
unsigned long opt[5];
unsigned long ret [2];
用來傳遞函數(shù)調(diào)用時的參數(shù),參數(shù)不同決定了不同的功能,比如寫入或擦除。
(3)定義函數(shù)類型指針
typedef void (*IAP)(unsigned * int, unsigned *int);
IAP iap_in;
(4)設(shè)置函數(shù)類型指針
iap_in = (IAP)IAP_ADD;
(5)調(diào)用IAP
iap_entrance(opt, ret);
在應(yīng)用IAP接口實(shí)現(xiàn)工作鏡像更新時,要順次執(zhí)行以下步驟:準(zhǔn)備操作扇區(qū),刪除扇區(qū),準(zhǔn)備操作扇區(qū),寫扇區(qū)。如果寫扇區(qū)前沒有進(jìn)行準(zhǔn)備上述操作,整個操作將失敗。
2.3.2 更新系統(tǒng)抗誤碼性設(shè)計
可以通過現(xiàn)有的Internet、RS232或者其他任何通信方式將新的程序鏡像傳輸?shù)角度胧皆O(shè)備中。在進(jìn)行升級的過程中,難免會出現(xiàn)傳輸誤碼的情況。由于程序升級過程中傳輸?shù)臄?shù)據(jù)是要運(yùn)行的代碼,所以很小的傳輸錯誤都會造成升級后的系統(tǒng)癱瘓。因此要處理傳輸過程中的誤碼情況,本系統(tǒng)參考XMODEM協(xié)議處理傳輸誤碼情況,實(shí)現(xiàn)一個抗誤碼的通信協(xié)議。本系統(tǒng)將要傳輸?shù)溺R像分成若干信息包傳輸,信息包包含一個標(biāo)題開始字符,一個單字節(jié)包序號,128字節(jié)數(shù)據(jù)字節(jié)和一個雙字節(jié)的CRC16校驗(yàn)位。信息包格式如表2.1所示
表1 通信協(xié)議包格式
整個傳輸過程描述如下:傳輸由接收方啟動,方法是向發(fā)送方發(fā)送開始信號,當(dāng)接受方發(fā)送開始信號到達(dá)發(fā)送方,發(fā)送方認(rèn)為可以發(fā)送第一個數(shù)據(jù)包,傳輸已經(jīng)啟動。發(fā)送方以每次128字節(jié)加上包頭,包序號,末尾加上校驗(yàn)和,打包成數(shù)據(jù)包格式傳送。發(fā)送方發(fā)了第一包后就等待接受方發(fā)送的確認(rèn)字節(jié),如果收到接收方傳來的正確確認(rèn),就認(rèn)為數(shù)據(jù)包被接收方正確接收,發(fā)送方繼續(xù)發(fā)送下一數(shù)據(jù)包;如果發(fā)送方接收到接收方傳來的否定確認(rèn)字節(jié),則表示接收方請求重發(fā)剛才的數(shù)據(jù)包;如果發(fā)送方接收到接收方傳來的停止字節(jié),則表示接收方請求無條件停止傳輸。
2.3.3 更新系統(tǒng)抗掉電性設(shè)計
對于升級過程中突然掉電情況,可以如圖2(b)所示,通過在外存中規(guī)劃備份鏡像來保證系統(tǒng)再次加電的正常運(yùn)行。在參數(shù)鏡像中設(shè)置兩個參數(shù),一個表示啟動鏡像號,另一個表示備份鏡像號。在系統(tǒng)正常啟動時,引導(dǎo)區(qū)會讀取參數(shù)鏡像中的啟動鏡像號,將程序引導(dǎo)到啟動鏡像號標(biāo)志的代碼段。在軟件更新情況下,由引導(dǎo)區(qū)引導(dǎo)程序進(jìn)入更新模式中,讀取備份鏡像號以更新鏡像,如果沒有發(fā)生系統(tǒng)掉電等意外終止,更新完成后系統(tǒng)將交換備份鏡像號與啟動鏡像號。因此,下次啟動時將啟動新鏡像,而原鏡像則成為備份鏡像。如果更新過程中發(fā)生意外,由于啟動鏡像沒有遭到破壞,啟動鏡像號沒有改變,因此下次啟動時系統(tǒng)還是會回到未進(jìn)行軟件更新的狀態(tài),達(dá)到正常啟動的目的。
為了配合整個更新系統(tǒng)實(shí)現(xiàn),需要一個上位機(jī)軟件將要更新的鏡像傳輸?shù)角度胧皆O(shè)備中。本系統(tǒng)選用MFC來實(shí)現(xiàn)上位機(jī)。本文將重點(diǎn)闡述上位機(jī)軟件與下位機(jī)軟件通信部分的具體實(shí)現(xiàn)。 上位機(jī)首先讀取要更新的鏡像文件,計算要發(fā)送的數(shù)據(jù)包個數(shù)。然后根據(jù)表1構(gòu)造數(shù)據(jù)包發(fā)送給下位機(jī)。之后通過嵌入式設(shè)備的返回信號做相應(yīng)的處理,如果發(fā)生異常,上位機(jī)重新發(fā)送剛才的數(shù)據(jù)包,最大嘗試10次。如果上位機(jī)正常傳輸完全部數(shù)據(jù),則發(fā)送結(jié)束字節(jié)通知嵌入式設(shè)備。
本文提出并實(shí)現(xiàn)了嵌入式設(shè)備軟件更新的解決方案。通過設(shè)置備份存儲區(qū),解決了傳輸過程中掉電的問題。通過在傳輸數(shù)據(jù)中加入傳輸協(xié)議,保證傳輸過程的無差錯性。由于需要更多的存儲空間,該方案略微增加了硬件成本,但該方案有操作便捷、不需要對硬件改造、可靠性高等優(yōu)點(diǎn),這個代價是值得的。
[1]黃一平,農(nóng)麗萍,蘇檢德,羅曉曙.ARM微控制器代碼非法復(fù)制技術(shù)研究與應(yīng)用[J].計算機(jī)工程與科學(xué).2011(33)
[2]NXP Semiconductors.LPC17xx user manual Rev.2[Z].2010
[3]夏爽.ARM處理器的分散加載及特殊應(yīng)用研究[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用, 2009(4)
[4]洪占勇.基于XMODEM協(xié)議的在版文件下載軟件設(shè)計[J].微計算機(jī)信息,2008(5)