石東新,柴劍平
(中國傳媒大學(xué)信息工程學(xué)院,北京 100024)
隨著手機無線網(wǎng)絡(luò)的迅速發(fā)展,在其數(shù)據(jù)通信網(wǎng)絡(luò)上滋生了許多新的需求和應(yīng)用,尤其是數(shù)據(jù)和圖像的遠程監(jiān)測,涉及了電力、交通、航運、安防等眾多行業(yè)領(lǐng)域,形成了一個具有相當(dāng)規(guī)模的產(chǎn)業(yè)鏈。隨著第二代 GSM到第三代數(shù)字手機網(wǎng)絡(luò)的鋪開,帶寬進一步提升,這方面的需求和應(yīng)用前景越來越廣闊。
本文以 NXP公司的 ARM Cortex-M3型LPC17xx系列 MCU中的 LPC1754為核心處理器,采用GPRS傳輸模塊,基于 uCOS開發(fā)了具有空中在線升級功能的嵌入式數(shù)據(jù)遠程監(jiān)控終端。本文著重論述在 NXP LPC17xx為核心處理器的應(yīng)用系統(tǒng)中如何實現(xiàn)代碼的在線升級,討論了兩種典型的實現(xiàn)方案并加以了比較。需要說明的是,本文闡述的兩種遠程在線升級的方法與本文例舉系統(tǒng)所涉及的GPRS通信方式和 uCOS都無關(guān),并且某些實現(xiàn)細(xì)節(jié)經(jīng)過適當(dāng)修改也適用于其它類型的 MCU。
實現(xiàn)遠程在線升級的嵌入式應(yīng)用系統(tǒng)應(yīng)當(dāng)具備以下兩個基本功能。
一、系統(tǒng)需要有遠程的通信信道。如數(shù)字電視的機頂盒通過有線電視網(wǎng)絡(luò)進行升級,目前具有非常成熟的代碼在線升級應(yīng)用;又如本系統(tǒng)用到的GPRS傳輸方式,當(dāng)然也可以是其它如 3G或者藍牙提供的無線數(shù)據(jù)通信信道。
二、嵌入式系統(tǒng)的核心處理器具備 Flash存儲器在應(yīng)用的數(shù)據(jù)擦寫功能。簡單的處理器,如 51單片機的 C8051Fxx系列就具備 Flash的在應(yīng)用擦寫功能,如果滿足條件,也可以勝任遠程代碼的在線升級。ARM系列提供了劃分更加細(xì)致的 FLASH存儲器數(shù)據(jù)擦寫功能:JTAG,ISP(In System Programming:在系統(tǒng)編程)和 IAP(In Application Programming:在應(yīng)用編程)三種方式。JTAG編程主要用于產(chǎn)品開發(fā)期的調(diào)試;ISP需要提供一定的硬件資源和中止應(yīng)用軟件的運行,適用于便攜式設(shè)備的升級;IAP與ISP非常相似,主要區(qū)別是 IAP允許在應(yīng)用程序正常運行的情況下,對 FLASH存儲器中另外一段程序進行讀/寫操作,控制對某段、某頁的讀 /寫操作。例如:在程序運行中產(chǎn)生 1k字節(jié)的數(shù)據(jù)表,為了避免占用 SRAM空間,可以使用 IAP技術(shù)將此表寫入片內(nèi) Flash中。本文論述的在線升級涉及到 ARM的IAP功能。
圖 1是兩種遠程在線升級方案系統(tǒng)的綜合框圖。方案一在硬件電路上比方案二多了一個虛線框標(biāo)示的外部擴展 Flash存儲器。
圖1 兩種方案的遠程在線升級系統(tǒng)的綜合框圖
本文實現(xiàn)系統(tǒng)采用的MCU是 NXPLPC1754,它是目前基于 ARMv7的最新 ARMCortex M3系列 V2版處理器,面向低成本和低功耗應(yīng)用,具有極高運算能力和中斷響應(yīng)能力。LPC1754為哈弗結(jié)構(gòu),CPU最高可達 100MHz,128KFlash存儲器和 32K數(shù)據(jù)存儲器,基本滿足遠程數(shù)據(jù)監(jiān)測終端設(shè)備的一般需要。而且其性價比高,非常適于替代傳統(tǒng)的 51MCU作為嵌入式系統(tǒng)的開發(fā),是未來低成本嵌入式系統(tǒng)開發(fā)的趨勢。無線模塊我們采用了有方的 M590純GPRS數(shù)據(jù)通信模塊,另外方案一中的外擴 Flash使用了 SPI接口 1MB的 Flash存儲器 MX25L8005。
遠程終端要實現(xiàn)代碼升級功能,在具備 IAP功能和遠程傳輸通道后,需要合理設(shè)計代碼的運行模塊和升級模塊,保證在現(xiàn)有系統(tǒng)運行時升級成功代碼,下次開機能夠運行升級后新的軟件系統(tǒng),當(dāng)然還應(yīng)當(dāng)有代碼升級失敗的解決措施。
對于我們討論的兩種方案,給出如圖 2所示的程序代碼模塊劃分。
圖2 兩種方案的內(nèi)部 Flash存儲器劃分方式
方案一 MCU內(nèi)部 Flash劃分如圖 2(A)所示。內(nèi)部 Flash分為下載區(qū)、跳轉(zhuǎn)區(qū)和代碼運行區(qū)APP1。代碼運行區(qū) APP1由一個工程獨立完成。APP1是一個完整的嵌入式軟件系統(tǒng),只是代碼的啟動地址被指定到了內(nèi)部 Flash高端,并且不含有 IAP功能代碼,即 APP1不需要對 MCU內(nèi)部 Flash進行擦寫。升級代碼的保存通過 GPRS以一定協(xié)議將接收到的升級代碼保存到外部擴展的 Flash存儲器中。下載區(qū)和代碼跳轉(zhuǎn)區(qū)可以由同一個工程實現(xiàn),MCU上電運行,就立即判斷擴展 Flash中是否有下載完畢的待升級代碼。如果有,就將待升級代碼用對應(yīng)的 IAP功能函數(shù)搬移到設(shè)定的高端地址,如果沒有則直接跳轉(zhuǎn)到原有的 APP1處執(zhí)行。若遇斷電等因素,造成代碼搬移失敗,則下次重新啟動后,必須保證代碼重新搬移成功后代碼才能跳轉(zhuǎn)到新的APP1運行。
方案二 MCU內(nèi)部 Flash劃分如圖 2(B)所示,內(nèi)部 Flash分為跳轉(zhuǎn)區(qū)、代碼運行區(qū) APP2A和APP2B。這三個區(qū)都由獨立的工程實現(xiàn)。APP2A和 APP2B交替為當(dāng)前運行代碼和升級更新代碼。代碼跳轉(zhuǎn)區(qū)只需判斷當(dāng)前應(yīng)該執(zhí)行的最新代碼運行區(qū)是 APP2A還是 APP2B,并跳轉(zhuǎn)過去即可。APP2A或 APP2B通過 GPRS獲得的升級代碼用 IAP功能函數(shù)寫到另外一個代碼運行區(qū),當(dāng)然這里數(shù)據(jù)中心發(fā)送的待升級代碼一定要和遠程終端待升級待更新的代碼區(qū)域保持一致,否則會因為代碼中的絕對地址不同而發(fā)生錯誤。
NXP LPC17xx的 IAP功能實現(xiàn)同 NXP之前的ARM系列,如 LPC21xx區(qū)別不大,具體的原理和技術(shù)分析可見文獻[2]。在 NXPLPC17xx實現(xiàn)代碼在線升級使用到 IAP功能時,需要注意以下幾點:
(1)IAP程序會使用片內(nèi) RAM空間的頂部 32個字節(jié),因此,在支持 IAP的場合,用戶程序應(yīng)該避免使用這部分空間。
(2)凡是在運行中對 MCU自身 Flash進行擦寫的操作,必須在關(guān)閉中斷的前提下進行。這樣,在方案 2中,運行程序必須避免因 Flash擦寫關(guān)閉中斷帶來的影響,如對串口接收的數(shù)據(jù)通過建立握手響應(yīng)機制得以保證任務(wù)的協(xié)同工作。
(3)ARM Cortex-M3的運行原理、內(nèi)核機制以及指令集有不同于以往的 ARM7TDMI,即 LPC17xx與 LPC21xx不完全一樣。特別需要注意的是,LPC17xx的主函數(shù)的啟動代碼的位置不是從0x00000000開始。ARM Cortex-M3將 0x00000000~0x000000CB共 204個字節(jié)區(qū)域用來存放含有 16個異常入口地址和 35個外部中斷入口地址的中斷向量表。而實際跳轉(zhuǎn)到主函數(shù) 4字節(jié)指令起始地址為 0x000000CC。因此,無論是方案一還是方案二,從代碼跳轉(zhuǎn)區(qū)要調(diào)到運行區(qū) APP處,應(yīng)該是實際放置 APP的首地址加上偏移量 0xCD。
(4)由上所述,NXP LPC17xx將中斷向量表放置在代碼的起始端,因此,搬移到高端運行的代碼APP必須對中斷向量表進行重映射,一般都將中斷向量表重映射到 SRAM中,這樣無論是方案一還是方案二,無論 APP被搬移到內(nèi)部 Flash的任何位置,都可以正常響應(yīng)中斷。另外,尤其需要注意的是,中斷向量表的重映射一定要在主程序一開始就進行。尤其是在使用像 uCOS這樣的嵌入式操作系統(tǒng)時,OS很可能在中斷重映射之前使用中斷,易造成程序響應(yīng)錯誤,程序跑飛。
為了方便以及靈活的將工程目標(biāo)代碼放置在內(nèi)部 Flash指定的任何位置,或者按需要將指定的代碼加載到SRAM中運行,需要使用 Scatter(分散加載描述)文件來進行描述代碼裝載和運行的位置。本例程序中使用 MDK 3.8的 IED環(huán)境,在配置頁面的“Linker”子頁面中手動加載修改后的 Scatter文件,,并在“Misc controls”欄中輸入“—entry main”。其中 “ main”完成了代碼和數(shù)據(jù)的復(fù)制,并把 ZI數(shù)據(jù)區(qū)清零,這一步對于本應(yīng)用非常重要。接著_main跳進堆和棧等的初始化函數(shù),最后再跳進應(yīng)用程序的入口 main()函數(shù)。scatter文件編寫的對錯,關(guān)系到應(yīng)用程序的正確運行。順便提一下,對于系統(tǒng)資源使用和地址分配的情況,可以查閱 map文件。
方案一和方案二都能很好的實現(xiàn)遠程代碼升級,但是它們有如下區(qū)別:
(1)方案一需要外部擴展 Flash存儲器,硬件成本有所增加。
(2)方案一只需建立 2個工程,一個是 Flash加載任務(wù),另一個是系統(tǒng)應(yīng)用。方案二需要建立 3個工程,一個是負(fù)責(zé)跳轉(zhuǎn)至有效應(yīng)用系統(tǒng)代碼的啟動程序,另外兩個工程則分別是交替更新的系統(tǒng)應(yīng)用程序。這個兩個系統(tǒng)應(yīng)用程序除了自身功能性的更新差別外,對程序員來說唯一的區(qū)別就在于 scatter文件的不同,即指定兩個系統(tǒng)應(yīng)用程序燒寫在內(nèi)部Flash不同的位置。
(3)方案一和方案二的 IAP功能分別在不同的程序內(nèi)部實現(xiàn)。
從以上兩個方案可以看出,方案一增加了硬件成本,但是帶來了系統(tǒng)應(yīng)用程序設(shè)計的簡單,其內(nèi)部不含有 IAP功能代碼,無需考慮關(guān)閉中斷后對其他任務(wù)的影響。方案二無需擴展外部 flash,但系統(tǒng)應(yīng)用程序設(shè)計稍復(fù)雜,內(nèi)含 IAP功能函數(shù),必須考慮關(guān)閉中斷帶來的影響。而且更新的代碼需要分兩個工程交替生成,MCU內(nèi)部 Flash存儲器的使用率相對減小一半,對系統(tǒng)代碼的容量有限制。可以看出,方案一和方案二各有優(yōu)缺點,需要開發(fā)人員對本項目的需求、任務(wù)復(fù)雜度、開發(fā)進度和成本權(quán)衡考慮而定。
本文以 ARM NXPLPC1754為核心的遠程數(shù)據(jù)監(jiān)控終端為例討論了兩種遠程代碼升級的方案。本文沒有關(guān)注太多的實現(xiàn)細(xì)節(jié),而是側(cè)重于兩個方案實現(xiàn)的原理以及方案的優(yōu)缺點。希望本文對打算在嵌入式產(chǎn)品中引入遠程在線升級功能以提升產(chǎn)品品質(zhì)的開發(fā)人員有所幫助。
[1] 彭井花等.基于 GPRS的嵌入式系統(tǒng)軟件的遠程在線升級.現(xiàn)代電子技術(shù)[J].2009(4):47-52.
[2] 姜曉梅等.基于 ARM的 IAP在線及遠程升級技術(shù).計算機應(yīng)用[J].2008,28(2):519-521.
[3] 韋文祥等.基于 ARM和 GPRS的嵌入式遠程IAP在配變監(jiān)控終端上的實現(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.