唐 文, 劉芳伶
(中國(guó)電子科技集團(tuán)第三十研究所,四川 成都610041)
隨著嵌入式軟硬件技術(shù)的發(fā)展,大量的消費(fèi)類(lèi)電子產(chǎn)品開(kāi)始使用該技術(shù)以實(shí)現(xiàn)各種復(fù)雜的功能。嵌入式終端設(shè)備隨著功能的日益完善、終端數(shù)量的不斷攀升,而且嵌入式軟件技術(shù)的應(yīng)用使系統(tǒng)實(shí)現(xiàn)新功能更加方便,這就需要提供一套有效的設(shè)備管理及升級(jí)方案,讓終端維護(hù)人員可以通過(guò)多種方式進(jìn)行升級(jí)維護(hù):如串口、USB口、以太網(wǎng)口[1]、電話線等。
為了實(shí)現(xiàn)軟件升級(jí),嵌入式終端設(shè)備都會(huì)提供引導(dǎo)程序,用于檢測(cè)應(yīng)用程序的開(kāi)始執(zhí)行地址。對(duì)于遠(yuǎn)程維護(hù)工作,需要使用終端與系統(tǒng)提供的通信服務(wù),可以將這部分的維護(hù)功能放在應(yīng)用程序中實(shí)現(xiàn)。對(duì)于本地維護(hù)工作,即維護(hù)人員能夠接觸到終端設(shè)備進(jìn)行維護(hù),則有兩種途徑,可以在引導(dǎo)程序中和應(yīng)用程序中實(shí)現(xiàn)。
方案以TI公司的MSP4302418單片機(jī)為例,通過(guò)片內(nèi)閃存(FLASH)與片外FLASH相結(jié)合的方式,設(shè)計(jì)并驗(yàn)證了一種基于兩階段引導(dǎo)技術(shù)的軟件升級(jí)維護(hù)方案。
兩階段引導(dǎo)是指通過(guò)在單片機(jī)片內(nèi)FLASH里固化一個(gè)引導(dǎo)程序,通過(guò)該程序來(lái)選擇引導(dǎo)應(yīng)用程序。每次上電執(zhí)行時(shí),單片機(jī)從引導(dǎo)程序開(kāi)始執(zhí)行,首先判斷應(yīng)用程序是否有效,若無(wú)效,則啟動(dòng)升級(jí)程序,通過(guò)該程序?qū)崿F(xiàn)在外部存儲(chǔ)空間選擇合適的程序包,寫(xiě)入單片機(jī)片內(nèi)FLASH的應(yīng)用程序空間。當(dāng)應(yīng)用程序正常執(zhí)行時(shí),若收到升級(jí)命令,則由應(yīng)用程序?qū)⑸?jí)數(shù)據(jù)包存儲(chǔ)在片外FLASH中,再跳出執(zhí)行升級(jí)程序。當(dāng)應(yīng)用程序不存在或錯(cuò)誤時(shí)能直接進(jìn)入升級(jí)程序,從而保證升級(jí)不成功可進(jìn)行再次升級(jí)。
其實(shí)現(xiàn)原理是在目標(biāo)芯片中放置3段代碼:一段為引導(dǎo)程序;一段為應(yīng)用程序;一段為本地升級(jí)程序。引導(dǎo)程序,升級(jí)程序?yàn)楣潭ùa,利用FLASH替換程序擦除應(yīng)用程序并寫(xiě)入新的代碼。同時(shí)需要通過(guò)修改鏈接文件來(lái)指定各段代碼的地址空間,具體操作方法參考文獻(xiàn)[2],保證三者的地址段不重疊。
引導(dǎo)基本流程如圖1所示,本地升級(jí)程序執(zhí)行時(shí),與外部通信,先接收擦除指令,擦除應(yīng)用程序空間,再將外部 FLASH的新程序內(nèi)容燒寫(xiě)至片內(nèi)FLASH,跳到新應(yīng)用程序入口。需要注意的是,在升級(jí)時(shí),應(yīng)該關(guān)閉所有中斷,先擦除應(yīng)用程序入口地址空間,最后寫(xiě)入應(yīng)用程序入口地址,可以盡量保證不會(huì)進(jìn)入不完整的程序。應(yīng)用程序是否有效可以通過(guò)檢測(cè)應(yīng)用程序入口地址是否有效來(lái)判斷:若入口地址為0xFFFF則無(wú)效。正常情況下,應(yīng)用程序不會(huì)主動(dòng)退出。
例如文獻(xiàn)[3]基于數(shù)字信號(hào)處理器(DSP,Digital Signal Processor)的在線升級(jí)方案中,將FLASH劃分為2個(gè)存儲(chǔ)區(qū),用于存放升級(jí)程序和應(yīng)用程序。應(yīng)用程序在執(zhí)行過(guò)程中能夠響應(yīng)升級(jí)命令。當(dāng)收到升級(jí)命令時(shí),就自動(dòng)跳轉(zhuǎn)到升級(jí)程序,接收串口發(fā)來(lái)的應(yīng)用程序數(shù)據(jù)并保存到內(nèi)存(RAM,random access memory)中。升級(jí)數(shù)據(jù)接收完畢后,升級(jí)程序再利用TI提供的FLASH操作函數(shù),將RAM中的程序拷貝到FLASH的應(yīng)用程序地址空間,拷貝完成后,在接收到升級(jí)完成命令后跳轉(zhuǎn)到新的應(yīng)用程序地址開(kāi)始執(zhí)行。
在許多嵌入式終端設(shè)備中,都將FLASH作為數(shù)據(jù)和程序文件的存儲(chǔ)部件,提供快速可靠的數(shù)據(jù)管理方式。在嵌入式操作系統(tǒng)的支持下,嵌入式終端設(shè)備利用文件系統(tǒng)訪問(wèn) FLASH,可以實(shí)現(xiàn)多文件、大容量存儲(chǔ)功能[4]。在文獻(xiàn)[5]中,F(xiàn)LASH上保存了用戶(hù)程序和升級(jí)程序各兩份,引導(dǎo)程序根據(jù)升級(jí)向量或引導(dǎo)向量來(lái)決定從FLASH的哪個(gè)地址加載用戶(hù)程序或升級(jí)程序,當(dāng)原始升級(jí)或用戶(hù)程序校驗(yàn)失敗時(shí),自動(dòng)選擇從備份地址開(kāi)始加載。文獻(xiàn)[6]詳細(xì)介紹了 FLASH的存儲(chǔ)操作流程。在拷貝程序數(shù)據(jù)到FLASH時(shí),由位于內(nèi)存中的程序執(zhí)行拷貝操作,提高FLASH寫(xiě)入的可靠性,并在位于FLASH中的引導(dǎo)程序的中斷向量表區(qū)域設(shè)置跳轉(zhuǎn)指令指向自定義的二級(jí)中斷向量表,避免對(duì)原有中斷向量地址區(qū)域進(jìn)行擦除,提高了程序升級(jí)的可靠性與靈活性。文獻(xiàn)[7]提供了2種訪問(wèn)嵌入式終端設(shè)備上的FLASH存儲(chǔ)部件的方式:通過(guò)JTAG接口和UART接口訪問(wèn),這2種方式相結(jié)合,實(shí)現(xiàn)了 windows下超級(jí)終端升級(jí)程序的功能。文獻(xiàn)[8]根據(jù)無(wú)線通信的特點(diǎn),在遠(yuǎn)程升級(jí)數(shù)據(jù)下載協(xié)議中引入校驗(yàn),并提供文件斷點(diǎn)續(xù)傳功能,極大提高了移動(dòng)通信網(wǎng)絡(luò)環(huán)境下遠(yuǎn)程程序升級(jí)的可靠性與成功率。
在文獻(xiàn)[9]中,將引導(dǎo)程序在外部FLASH中進(jìn)行雙備份和支持引導(dǎo)程序遠(yuǎn)程升級(jí),利用處理器同時(shí)支持電可擦除編程只讀存儲(chǔ)器(EEPROM,Electrically Erasable Programmable Read-Only Memory)和FLASH引導(dǎo)的技術(shù),在EEPROM引導(dǎo)階段,啟動(dòng)引導(dǎo)定時(shí)器,等待引導(dǎo)成功。如果定時(shí)器超時(shí),則在復(fù)雜可編程邏輯器件(CPLD,Complex Programmable Logic Device)邏輯中自動(dòng)切換到FLASH的引導(dǎo)程序地址重新引導(dǎo)。
在相關(guān)項(xiàng)目中,嵌入式系統(tǒng)由TI MSP430F2418單片機(jī)、現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA,F(xiàn)ield-Programmable Gate Array)、64 M片外FLASH、8M鐵電存儲(chǔ)器(FRAM)、串口等電路組成。片外FLASH支持最小4 K字節(jié)的擦除單位,可以保存數(shù)據(jù)量大、很少修改的數(shù)據(jù)如接收的程序文件、字庫(kù)、聲音數(shù)據(jù)。FRAM是一款非易失性存儲(chǔ)芯片,可直接讀寫(xiě)不需要擦除,用于保存數(shù)據(jù)量少、隨時(shí)修改的配置信息如程序文件的升級(jí)配置信息。硬件連接示意圖如圖2所示。
根據(jù)文獻(xiàn)[10],在MSP430F2418單片機(jī)內(nèi)部地址空間里,分為3個(gè)部分,最低端的地址空間為RAM;其余一部分地址空間用于存放引導(dǎo)程序;另一部分空間用于存放應(yīng)用程序,如圖3所示。其中單片機(jī)中斷向量地址空間固定為 0xffc0~0xffff,因此將引導(dǎo)程序空間規(guī)劃到該空間附近,應(yīng)用程序空間被分成2個(gè)地址空間。
當(dāng)終端設(shè)備從串口或者遠(yuǎn)程通信連接中接收到程序文件下載數(shù)據(jù)包時(shí),將數(shù)據(jù)保存在片外 FLASH中,待所有的程序文件數(shù)據(jù)接收完成并校驗(yàn)通過(guò)后,等待遠(yuǎn)程軟件升級(jí)維護(hù)終端的程序替換指令。如果收到程序替換指令,則修改FRAM存儲(chǔ)的升級(jí)配置信息,指示有新的應(yīng)用程序文件,然后從應(yīng)用程序空間返回到引導(dǎo)程序空間。引導(dǎo)程序按照上電的執(zhí)行流程進(jìn)行升級(jí)替換。
在遠(yuǎn)程升級(jí)過(guò)程中,設(shè)備意外掉電是導(dǎo)致升級(jí)失敗的主要風(fēng)險(xiǎn),為了避免在升級(jí)程序過(guò)程中設(shè)備掉電的影響,采取了以下3個(gè)措施:①在FRAM中規(guī)劃一片地址空間用于存放升級(jí)進(jìn)度的信息。當(dāng)升級(jí)的應(yīng)用程序正常運(yùn)行時(shí),修改升級(jí)進(jìn)度為已完成狀態(tài)。引導(dǎo)程序通過(guò)檢測(cè)該升級(jí)進(jìn)度的值,進(jìn)一步判斷應(yīng)用程序空間的程序是否有效。為了保證FRAM中該部分?jǐn)?shù)據(jù)的正確性,采用 16位循環(huán)冗余校驗(yàn)碼(CRC16)校驗(yàn)。如果校驗(yàn)失敗,則對(duì)該部分?jǐn)?shù)據(jù)重新初始化,并且按正常方式引導(dǎo)應(yīng)用程序;②中斷向量地址空間規(guī)劃到引導(dǎo)程序空間,不必在替換程序時(shí)擦除中斷向量區(qū)。應(yīng)用程序的中斷服務(wù)程序地址到內(nèi)存指定地址如0x200進(jìn)行存放,在引導(dǎo)程序的中斷服務(wù)程序入口檢測(cè)內(nèi)存該指定地址的值是否有效,有效則直接跳轉(zhuǎn)到應(yīng)用程序的中斷服務(wù)程序,否則繼續(xù)執(zhí)行引導(dǎo)程序中的中斷服務(wù)程序;③在片外FLASH中規(guī)劃兩片地址空間如圖3所示,應(yīng)用程序區(qū) 1和應(yīng)用程序區(qū) 2,這兩個(gè)區(qū)分別是升級(jí)區(qū)和備份區(qū)。從計(jì)算機(jī)端或遠(yuǎn)程通信連接下載得到的升級(jí)程序文件,首先存儲(chǔ)在片外FLASH的升級(jí)區(qū)中。升級(jí)程序文件校驗(yàn)通過(guò)后,修改FRAM的升級(jí)標(biāo)志,并主動(dòng)退出應(yīng)用程序回到引導(dǎo)程序。待引導(dǎo)程序完成升級(jí)文件的替換后,升級(jí)區(qū)變?yōu)閭浞輩^(qū),原備份區(qū)變?yōu)樯?jí)區(qū),等待下次程序升級(jí)文件的寫(xiě)入。通過(guò)這種存儲(chǔ)、校驗(yàn)、替換的方式,可以避免傳輸錯(cuò)誤導(dǎo)致升級(jí)失敗的風(fēng)險(xiǎn)。
如圖4所示,當(dāng)設(shè)備上電后,單片機(jī)從復(fù)位中斷服務(wù)向量所指向的地址即引導(dǎo)程序的首地址開(kāi)始執(zhí)行。在引導(dǎo)程序里,首先關(guān)閉設(shè)備的看門(mén)狗和中斷,初始化硬件,然后從FRAM讀取升級(jí)配置信息,做出以下判斷:①如果該升級(jí)配置信息指示在片外FLASH有新的應(yīng)用程序,則擦除片內(nèi)應(yīng)用程序地址區(qū)間,從片外FLASH讀出升級(jí)的應(yīng)用程序文件數(shù)據(jù),寫(xiě)入到片內(nèi)的應(yīng)用程序地址區(qū)間進(jìn)行應(yīng)用程序的升級(jí)替換;②如果指示升級(jí)的程序文件運(yùn)行失敗,需要恢復(fù)備份的應(yīng)用程序,則擦除片內(nèi)應(yīng)用程序地址區(qū)間,從片外FLASH讀出備份的應(yīng)用程序文件數(shù)據(jù),寫(xiě)入到片內(nèi)的應(yīng)用程序地址區(qū)間進(jìn)行恢復(fù);③如果指示程序正常運(yùn)行,則判斷應(yīng)用程序的入口地址是否有效,有效則跳轉(zhuǎn)到入口執(zhí)行應(yīng)用程序,否則執(zhí)行串口接收程序,等待串口程序下載;④設(shè)備維護(hù)人員在終端設(shè)備上電時(shí)刻可以人工干預(yù)引導(dǎo)流程,通過(guò)某種外部事件比如按鍵事件,暫時(shí)中斷引導(dǎo)流程,讓引導(dǎo)程序直接進(jìn)入串口升級(jí)命令等待階段,在一段時(shí)間內(nèi)如果收到串口程序下載命令,則執(zhí)行串口接收程序,等待串口程序下載。否則超時(shí)后,繼續(xù)引導(dǎo)。
在嵌入式終端設(shè)備軟件功能日益復(fù)雜的情況下,軟件的升級(jí)維護(hù)成本不容忽視。本方案在單片機(jī)軟件遠(yuǎn)程維護(hù)上,提供了一種可靠的升級(jí)方式,既支持本地串口下載,又支持遠(yuǎn)程下載的升級(jí)接口,并針對(duì)升級(jí)過(guò)程中設(shè)備意外掉電的情況提供了解決方法。文中創(chuàng)新點(diǎn):?jiǎn)纹瑱C(jī)片內(nèi)FLASH與片外FLASH相結(jié)合的方式,升級(jí)過(guò)程中設(shè)備意外掉電,上電后可繼續(xù)升級(jí)的解決方案,同時(shí)支持升級(jí)與備份恢復(fù)功能。
[1] 李俊,王金海.基于 TFTP 協(xié)議的 ARM 軟件遠(yuǎn)程更新系統(tǒng)[J].工礦自動(dòng)化,2010(07):22-25.
[2] 陶維青, 王付軍.基于 GPRS 網(wǎng)絡(luò)的 MSP430 單片機(jī)Flash遠(yuǎn)程更新方法[J].電測(cè)與儀表,2007(07):33-36.
[3] 梅亮,林輝.TMS320F2812 代碼在線升級(jí)的研究與設(shè)計(jì)[J].電氣傳動(dòng),2006,36(07):62-64.
[4] 陳波,石旭剛,李棟.嵌入式設(shè)備軟件自動(dòng)升級(jí)技術(shù)[J].計(jì)算機(jī)時(shí)代,2008 (04): 54-55.
[5] 石乃軒,馮偉.基于 TMS320VC55x DSP在線升級(jí)的設(shè)計(jì)與實(shí)現(xiàn)[J].通信技術(shù),2010,43(07):236-238.
[6] 蔡作英.基于 FLASH的嵌入式系統(tǒng)自動(dòng)升級(jí)的實(shí)現(xiàn)[J].福建電腦,2005(06):73-74.
[7] 伍方輝,方安安,劉華珠.嵌入式系統(tǒng)中的 Flash設(shè)計(jì)與分析[J].微計(jì)算機(jī)信息(嵌入式與 SOC),2009,25(2-2):25-26.
[8] 陳林,林金朝.一種基于嵌入式系統(tǒng)的遠(yuǎn)程程序更新機(jī)制[J].微計(jì)算機(jī)信息(嵌入式與 SOC),2007,23(9-2):4-6.
[9] 鄧娟,彭真明.基于嵌入式系統(tǒng)的遠(yuǎn)程在線升級(jí)雙 BOOT設(shè)計(jì)[J].微計(jì)算機(jī)信息,2009,25(12-2):102-104.
[10] Texas Instruments.MSP430F2418[EB/OL].(2008-10-11)[2011-04-03].http://www.ti.com/product/msp430f2 418.