石東新,柴劍平
(中國傳媒大學(xué)信息工程學(xué)院,北京 100024)
隨著手機(jī)無線網(wǎng)絡(luò)的迅速發(fā)展,在其數(shù)據(jù)通信網(wǎng)絡(luò)上滋生了許多新的需求和應(yīng)用,尤其是數(shù)據(jù)和圖像的遠(yuǎn)程監(jiān)測,涉及了電力、交通、航運(yùn)、安防等眾多行業(yè)領(lǐng)域,形成了一個(gè)具有相當(dāng)規(guī)模的產(chǎn)業(yè)鏈。隨著第二代 GSM到第三代數(shù)字手機(jī)網(wǎng)絡(luò)的鋪開,帶寬進(jìn)一步提升,這方面的需求和應(yīng)用前景越來越廣闊。
本文以 NXP公司的 ARM Cortex-M3型LPC17xx系列 MCU中的 LPC1754為核心處理器,采用GPRS傳輸模塊,基于 uCOS開發(fā)了具有空中在線升級(jí)功能的嵌入式數(shù)據(jù)遠(yuǎn)程監(jiān)控終端。本文著重論述在 NXP LPC17xx為核心處理器的應(yīng)用系統(tǒng)中如何實(shí)現(xiàn)代碼的在線升級(jí),討論了兩種典型的實(shí)現(xiàn)方案并加以了比較。需要說明的是,本文闡述的兩種遠(yuǎn)程在線升級(jí)的方法與本文例舉系統(tǒng)所涉及的GPRS通信方式和 uCOS都無關(guān),并且某些實(shí)現(xiàn)細(xì)節(jié)經(jīng)過適當(dāng)修改也適用于其它類型的 MCU。
實(shí)現(xiàn)遠(yuǎn)程在線升級(jí)的嵌入式應(yīng)用系統(tǒng)應(yīng)當(dāng)具備以下兩個(gè)基本功能。
一、系統(tǒng)需要有遠(yuǎn)程的通信信道。如數(shù)字電視的機(jī)頂盒通過有線電視網(wǎng)絡(luò)進(jìn)行升級(jí),目前具有非常成熟的代碼在線升級(jí)應(yīng)用;又如本系統(tǒng)用到的GPRS傳輸方式,當(dāng)然也可以是其它如 3G或者藍(lán)牙提供的無線數(shù)據(jù)通信信道。
二、嵌入式系統(tǒng)的核心處理器具備 Flash存儲(chǔ)器在應(yīng)用的數(shù)據(jù)擦寫功能。簡單的處理器,如 51單片機(jī)的 C8051Fxx系列就具備 Flash的在應(yīng)用擦寫功能,如果滿足條件,也可以勝任遠(yuǎn)程代碼的在線升級(jí)。ARM系列提供了劃分更加細(xì)致的 FLASH存儲(chǔ)器數(shù)據(jù)擦寫功能:JTAG,ISP(In System Programming:在系統(tǒng)編程)和 IAP(In Application Programming:在應(yīng)用編程)三種方式。JTAG編程主要用于產(chǎn)品開發(fā)期的調(diào)試;ISP需要提供一定的硬件資源和中止應(yīng)用軟件的運(yùn)行,適用于便攜式設(shè)備的升級(jí);IAP與ISP非常相似,主要區(qū)別是 IAP允許在應(yīng)用程序正常運(yùn)行的情況下,對(duì) FLASH存儲(chǔ)器中另外一段程序進(jìn)行讀/寫操作,控制對(duì)某段、某頁的讀 /寫操作。例如:在程序運(yùn)行中產(chǎn)生 1k字節(jié)的數(shù)據(jù)表,為了避免占用 SRAM空間,可以使用 IAP技術(shù)將此表寫入片內(nèi) Flash中。本文論述的在線升級(jí)涉及到 ARM的IAP功能。
圖 1是兩種遠(yuǎn)程在線升級(jí)方案系統(tǒng)的綜合框圖。方案一在硬件電路上比方案二多了一個(gè)虛線框標(biāo)示的外部擴(kuò)展 Flash存儲(chǔ)器。

圖1 兩種方案的遠(yuǎn)程在線升級(jí)系統(tǒng)的綜合框圖
本文實(shí)現(xiàn)系統(tǒng)采用的MCU是 NXPLPC1754,它是目前基于 ARMv7的最新 ARMCortex M3系列 V2版處理器,面向低成本和低功耗應(yīng)用,具有極高運(yùn)算能力和中斷響應(yīng)能力。LPC1754為哈弗結(jié)構(gòu),CPU最高可達(dá) 100MHz,128KFlash存儲(chǔ)器和 32K數(shù)據(jù)存儲(chǔ)器,基本滿足遠(yuǎn)程數(shù)據(jù)監(jiān)測終端設(shè)備的一般需要。而且其性價(jià)比高,非常適于替代傳統(tǒng)的 51MCU作為嵌入式系統(tǒng)的開發(fā),是未來低成本嵌入式系統(tǒng)開發(fā)的趨勢。無線模塊我們采用了有方的 M590純GPRS數(shù)據(jù)通信模塊,另外方案一中的外擴(kuò) Flash使用了 SPI接口 1MB的 Flash存儲(chǔ)器 MX25L8005。
遠(yuǎn)程終端要實(shí)現(xiàn)代碼升級(jí)功能,在具備 IAP功能和遠(yuǎn)程傳輸通道后,需要合理設(shè)計(jì)代碼的運(yùn)行模塊和升級(jí)模塊,保證在現(xiàn)有系統(tǒng)運(yùn)行時(shí)升級(jí)成功代碼,下次開機(jī)能夠運(yùn)行升級(jí)后新的軟件系統(tǒng),當(dāng)然還應(yīng)當(dāng)有代碼升級(jí)失敗的解決措施。
對(duì)于我們討論的兩種方案,給出如圖 2所示的程序代碼模塊劃分。

圖2 兩種方案的內(nèi)部 Flash存儲(chǔ)器劃分方式
方案一 MCU內(nèi)部 Flash劃分如圖 2(A)所示。內(nèi)部 Flash分為下載區(qū)、跳轉(zhuǎn)區(qū)和代碼運(yùn)行區(qū)APP1。代碼運(yùn)行區(qū) APP1由一個(gè)工程獨(dú)立完成。APP1是一個(gè)完整的嵌入式軟件系統(tǒng),只是代碼的啟動(dòng)地址被指定到了內(nèi)部 Flash高端,并且不含有 IAP功能代碼,即 APP1不需要對(duì) MCU內(nèi)部 Flash進(jìn)行擦寫。升級(jí)代碼的保存通過 GPRS以一定協(xié)議將接收到的升級(jí)代碼保存到外部擴(kuò)展的 Flash存儲(chǔ)器中。下載區(qū)和代碼跳轉(zhuǎn)區(qū)可以由同一個(gè)工程實(shí)現(xiàn),MCU上電運(yùn)行,就立即判斷擴(kuò)展 Flash中是否有下載完畢的待升級(jí)代碼。如果有,就將待升級(jí)代碼用對(duì)應(yīng)的 IAP功能函數(shù)搬移到設(shè)定的高端地址,如果沒有則直接跳轉(zhuǎn)到原有的 APP1處執(zhí)行。若遇斷電等因素,造成代碼搬移失敗,則下次重新啟動(dòng)后,必須保證代碼重新搬移成功后代碼才能跳轉(zhuǎn)到新的APP1運(yùn)行。
方案二 MCU內(nèi)部 Flash劃分如圖 2(B)所示,內(nèi)部 Flash分為跳轉(zhuǎn)區(qū)、代碼運(yùn)行區(qū) APP2A和APP2B。這三個(gè)區(qū)都由獨(dú)立的工程實(shí)現(xiàn)。APP2A和 APP2B交替為當(dāng)前運(yùn)行代碼和升級(jí)更新代碼。代碼跳轉(zhuǎn)區(qū)只需判斷當(dāng)前應(yīng)該執(zhí)行的最新代碼運(yùn)行區(qū)是 APP2A還是 APP2B,并跳轉(zhuǎn)過去即可。APP2A或 APP2B通過 GPRS獲得的升級(jí)代碼用 IAP功能函數(shù)寫到另外一個(gè)代碼運(yùn)行區(qū),當(dāng)然這里數(shù)據(jù)中心發(fā)送的待升級(jí)代碼一定要和遠(yuǎn)程終端待升級(jí)待更新的代碼區(qū)域保持一致,否則會(huì)因?yàn)榇a中的絕對(duì)地址不同而發(fā)生錯(cuò)誤。
NXP LPC17xx的 IAP功能實(shí)現(xiàn)同 NXP之前的ARM系列,如 LPC21xx區(qū)別不大,具體的原理和技術(shù)分析可見文獻(xiàn)[2]。在 NXPLPC17xx實(shí)現(xiàn)代碼在線升級(jí)使用到 IAP功能時(shí),需要注意以下幾點(diǎn):
(1)IAP程序會(huì)使用片內(nèi) RAM空間的頂部 32個(gè)字節(jié),因此,在支持 IAP的場合,用戶程序應(yīng)該避免使用這部分空間。
(2)凡是在運(yùn)行中對(duì) MCU自身 Flash進(jìn)行擦寫的操作,必須在關(guān)閉中斷的前提下進(jìn)行。這樣,在方案 2中,運(yùn)行程序必須避免因 Flash擦寫關(guān)閉中斷帶來的影響,如對(duì)串口接收的數(shù)據(jù)通過建立握手響應(yīng)機(jī)制得以保證任務(wù)的協(xié)同工作。
(3)ARM Cortex-M3的運(yùn)行原理、內(nèi)核機(jī)制以及指令集有不同于以往的 ARM7TDMI,即 LPC17xx與 LPC21xx不完全一樣。特別需要注意的是,LPC17xx的主函數(shù)的啟動(dòng)代碼的位置不是從0x00000000開始。ARM Cortex-M3將 0x00000000~0x000000CB共 204個(gè)字節(jié)區(qū)域用來存放含有 16個(gè)異常入口地址和 35個(gè)外部中斷入口地址的中斷向量表。而實(shí)際跳轉(zhuǎn)到主函數(shù) 4字節(jié)指令起始地址為 0x000000CC。因此,無論是方案一還是方案二,從代碼跳轉(zhuǎn)區(qū)要調(diào)到運(yùn)行區(qū) APP處,應(yīng)該是實(shí)際放置 APP的首地址加上偏移量 0xCD。
(4)由上所述,NXP LPC17xx將中斷向量表放置在代碼的起始端,因此,搬移到高端運(yùn)行的代碼APP必須對(duì)中斷向量表進(jìn)行重映射,一般都將中斷向量表重映射到 SRAM中,這樣無論是方案一還是方案二,無論 APP被搬移到內(nèi)部 Flash的任何位置,都可以正常響應(yīng)中斷。另外,尤其需要注意的是,中斷向量表的重映射一定要在主程序一開始就進(jìn)行。尤其是在使用像 uCOS這樣的嵌入式操作系統(tǒng)時(shí),OS很可能在中斷重映射之前使用中斷,易造成程序響應(yīng)錯(cuò)誤,程序跑飛。
為了方便以及靈活的將工程目標(biāo)代碼放置在內(nèi)部 Flash指定的任何位置,或者按需要將指定的代碼加載到SRAM中運(yùn)行,需要使用 Scatter(分散加載描述)文件來進(jìn)行描述代碼裝載和運(yùn)行的位置。本例程序中使用 MDK 3.8的 IED環(huán)境,在配置頁面的“Linker”子頁面中手動(dòng)加載修改后的 Scatter文件,,并在“Misc controls”欄中輸入“—entry main”。其中 “ main”完成了代碼和數(shù)據(jù)的復(fù)制,并把 ZI數(shù)據(jù)區(qū)清零,這一步對(duì)于本應(yīng)用非常重要。接著_main跳進(jìn)堆和棧等的初始化函數(shù),最后再跳進(jìn)應(yīng)用程序的入口 main()函數(shù)。scatter文件編寫的對(duì)錯(cuò),關(guān)系到應(yīng)用程序的正確運(yùn)行。順便提一下,對(duì)于系統(tǒng)資源使用和地址分配的情況,可以查閱 map文件。
方案一和方案二都能很好的實(shí)現(xiàn)遠(yuǎn)程代碼升級(jí),但是它們有如下區(qū)別:
(1)方案一需要外部擴(kuò)展 Flash存儲(chǔ)器,硬件成本有所增加。
(2)方案一只需建立 2個(gè)工程,一個(gè)是 Flash加載任務(wù),另一個(gè)是系統(tǒng)應(yīng)用。方案二需要建立 3個(gè)工程,一個(gè)是負(fù)責(zé)跳轉(zhuǎn)至有效應(yīng)用系統(tǒng)代碼的啟動(dòng)程序,另外兩個(gè)工程則分別是交替更新的系統(tǒng)應(yīng)用程序。這個(gè)兩個(gè)系統(tǒng)應(yīng)用程序除了自身功能性的更新差別外,對(duì)程序員來說唯一的區(qū)別就在于 scatter文件的不同,即指定兩個(gè)系統(tǒng)應(yīng)用程序燒寫在內(nèi)部Flash不同的位置。
(3)方案一和方案二的 IAP功能分別在不同的程序內(nèi)部實(shí)現(xiàn)。
從以上兩個(gè)方案可以看出,方案一增加了硬件成本,但是帶來了系統(tǒng)應(yīng)用程序設(shè)計(jì)的簡單,其內(nèi)部不含有 IAP功能代碼,無需考慮關(guān)閉中斷后對(duì)其他任務(wù)的影響。方案二無需擴(kuò)展外部 flash,但系統(tǒng)應(yīng)用程序設(shè)計(jì)稍復(fù)雜,內(nèi)含 IAP功能函數(shù),必須考慮關(guān)閉中斷帶來的影響。而且更新的代碼需要分兩個(gè)工程交替生成,MCU內(nèi)部 Flash存儲(chǔ)器的使用率相對(duì)減小一半,對(duì)系統(tǒng)代碼的容量有限制。可以看出,方案一和方案二各有優(yōu)缺點(diǎn),需要開發(fā)人員對(duì)本項(xiàng)目的需求、任務(wù)復(fù)雜度、開發(fā)進(jìn)度和成本權(quán)衡考慮而定。
本文以 ARM NXPLPC1754為核心的遠(yuǎn)程數(shù)據(jù)監(jiān)控終端為例討論了兩種遠(yuǎn)程代碼升級(jí)的方案。本文沒有關(guān)注太多的實(shí)現(xiàn)細(xì)節(jié),而是側(cè)重于兩個(gè)方案實(shí)現(xiàn)的原理以及方案的優(yōu)缺點(diǎn)。希望本文對(duì)打算在嵌入式產(chǎn)品中引入遠(yuǎn)程在線升級(jí)功能以提升產(chǎn)品品質(zhì)的開發(fā)人員有所幫助。
[1] 彭井花等.基于 GPRS的嵌入式系統(tǒng)軟件的遠(yuǎn)程在線升級(jí).現(xiàn)代電子技術(shù)[J].2009(4):47-52.
[2] 姜曉梅等.基于 ARM的 IAP在線及遠(yuǎn)程升級(jí)技術(shù).計(jì)算機(jī)應(yīng)用[J].2008,28(2):519-521.
[3] 韋文祥等.基于 ARM和 GPRS的嵌入式遠(yuǎn)程IAP在配變監(jiān)控終端上的實(shí)現(xiàn).電氣應(yīng)用[J].2006,25(9):88-92.
[4] LPC17xx User manual,Rev 00-07[EB/OL].http://www.nxp.com,2009,7.