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