唐 文, 劉芳伶
(中國電子科技集團第三十研究所,四川 成都610041)
隨著嵌入式軟硬件技術的發展,大量的消費類電子產品開始使用該技術以實現各種復雜的功能。嵌入式終端設備隨著功能的日益完善、終端數量的不斷攀升,而且嵌入式軟件技術的應用使系統實現新功能更加方便,這就需要提供一套有效的設備管理及升級方案,讓終端維護人員可以通過多種方式進行升級維護:如串口、USB口、以太網口[1]、電話線等。
為了實現軟件升級,嵌入式終端設備都會提供引導程序,用于檢測應用程序的開始執行地址。對于遠程維護工作,需要使用終端與系統提供的通信服務,可以將這部分的維護功能放在應用程序中實現。對于本地維護工作,即維護人員能夠接觸到終端設備進行維護,則有兩種途徑,可以在引導程序中和應用程序中實現。
方案以TI公司的MSP4302418單片機為例,通過片內閃存(FLASH)與片外FLASH相結合的方式,設計并驗證了一種基于兩階段引導技術的軟件升級維護方案。
兩階段引導是指通過在單片機片內FLASH里固化一個引導程序,通過該程序來選擇引導應用程序。每次上電執行時,單片機從引導程序開始執行,首先判斷應用程序是否有效,若無效,則啟動升級程序,通過該程序實現在外部存儲空間選擇合適的程序包,寫入單片機片內FLASH的應用程序空間。當應用程序正常執行時,若收到升級命令,則由應用程序將升級數據包存儲在片外FLASH中,再跳出執行升級程序。當應用程序不存在或錯誤時能直接進入升級程序,從而保證升級不成功可進行再次升級。
其實現原理是在目標芯片中放置3段代碼:一段為引導程序;一段為應用程序;一段為本地升級程序。引導程序,升級程序為固定代碼,利用FLASH替換程序擦除應用程序并寫入新的代碼。同時需要通過修改鏈接文件來指定各段代碼的地址空間,具體操作方法參考文獻[2],保證三者的地址段不重疊。
引導基本流程如圖1所示,本地升級程序執行時,與外部通信,先接收擦除指令,擦除應用程序空間,再將外部 FLASH的新程序內容燒寫至片內FLASH,跳到新應用程序入口。需要注意的是,在升級時,應該關閉所有中斷,先擦除應用程序入口地址空間,最后寫入應用程序入口地址,可以盡量保證不會進入不完整的程序。應用程序是否有效可以通過檢測應用程序入口地址是否有效來判斷:若入口地址為0xFFFF則無效。正常情況下,應用程序不會主動退出。

例如文獻[3]基于數字信號處理器(DSP,Digital Signal Processor)的在線升級方案中,將FLASH劃分為2個存儲區,用于存放升級程序和應用程序。應用程序在執行過程中能夠響應升級命令。當收到升級命令時,就自動跳轉到升級程序,接收串口發來的應用程序數據并保存到內存(RAM,random access memory)中。升級數據接收完畢后,升級程序再利用TI提供的FLASH操作函數,將RAM中的程序拷貝到FLASH的應用程序地址空間,拷貝完成后,在接收到升級完成命令后跳轉到新的應用程序地址開始執行。
在許多嵌入式終端設備中,都將FLASH作為數據和程序文件的存儲部件,提供快速可靠的數據管理方式。在嵌入式操作系統的支持下,嵌入式終端設備利用文件系統訪問 FLASH,可以實現多文件、大容量存儲功能[4]。在文獻[5]中,FLASH上保存了用戶程序和升級程序各兩份,引導程序根據升級向量或引導向量來決定從FLASH的哪個地址加載用戶程序或升級程序,當原始升級或用戶程序校驗失敗時,自動選擇從備份地址開始加載。文獻[6]詳細介紹了 FLASH的存儲操作流程。在拷貝程序數據到FLASH時,由位于內存中的程序執行拷貝操作,提高FLASH寫入的可靠性,并在位于FLASH中的引導程序的中斷向量表區域設置跳轉指令指向自定義的二級中斷向量表,避免對原有中斷向量地址區域進行擦除,提高了程序升級的可靠性與靈活性。文獻[7]提供了2種訪問嵌入式終端設備上的FLASH存儲部件的方式:通過JTAG接口和UART接口訪問,這2種方式相結合,實現了 windows下超級終端升級程序的功能。文獻[8]根據無線通信的特點,在遠程升級數據下載協議中引入校驗,并提供文件斷點續傳功能,極大提高了移動通信網絡環境下遠程程序升級的可靠性與成功率。
在文獻[9]中,將引導程序在外部FLASH中進行雙備份和支持引導程序遠程升級,利用處理器同時支持電可擦除編程只讀存儲器(EEPROM,Electrically Erasable Programmable Read-Only Memory)和FLASH引導的技術,在EEPROM引導階段,啟動引導定時器,等待引導成功。如果定時器超時,則在復雜可編程邏輯器件(CPLD,Complex Programmable Logic Device)邏輯中自動切換到FLASH的引導程序地址重新引導。
在相關項目中,嵌入式系統由TI MSP430F2418單片機、現場可編程門陣列(FPGA,Field-Programmable Gate Array)、64 M片外FLASH、8M鐵電存儲器(FRAM)、串口等電路組成。片外FLASH支持最小4 K字節的擦除單位,可以保存數據量大、很少修改的數據如接收的程序文件、字庫、聲音數據。FRAM是一款非易失性存儲芯片,可直接讀寫不需要擦除,用于保存數據量少、隨時修改的配置信息如程序文件的升級配置信息。硬件連接示意圖如圖2所示。

根據文獻[10],在MSP430F2418單片機內部地址空間里,分為3個部分,最低端的地址空間為RAM;其余一部分地址空間用于存放引導程序;另一部分空間用于存放應用程序,如圖3所示。其中單片機中斷向量地址空間固定為 0xffc0~0xffff,因此將引導程序空間規劃到該空間附近,應用程序空間被分成2個地址空間。

當終端設備從串口或者遠程通信連接中接收到程序文件下載數據包時,將數據保存在片外 FLASH中,待所有的程序文件數據接收完成并校驗通過后,等待遠程軟件升級維護終端的程序替換指令。如果收到程序替換指令,則修改FRAM存儲的升級配置信息,指示有新的應用程序文件,然后從應用程序空間返回到引導程序空間。引導程序按照上電的執行流程進行升級替換。
在遠程升級過程中,設備意外掉電是導致升級失敗的主要風險,為了避免在升級程序過程中設備掉電的影響,采取了以下3個措施:①在FRAM中規劃一片地址空間用于存放升級進度的信息。當升級的應用程序正常運行時,修改升級進度為已完成狀態。引導程序通過檢測該升級進度的值,進一步判斷應用程序空間的程序是否有效。為了保證FRAM中該部分數據的正確性,采用 16位循環冗余校驗碼(CRC16)校驗。如果校驗失敗,則對該部分數據重新初始化,并且按正常方式引導應用程序;②中斷向量地址空間規劃到引導程序空間,不必在替換程序時擦除中斷向量區。應用程序的中斷服務程序地址到內存指定地址如0x200進行存放,在引導程序的中斷服務程序入口檢測內存該指定地址的值是否有效,有效則直接跳轉到應用程序的中斷服務程序,否則繼續執行引導程序中的中斷服務程序;③在片外FLASH中規劃兩片地址空間如圖3所示,應用程序區 1和應用程序區 2,這兩個區分別是升級區和備份區。從計算機端或遠程通信連接下載得到的升級程序文件,首先存儲在片外FLASH的升級區中。升級程序文件校驗通過后,修改FRAM的升級標志,并主動退出應用程序回到引導程序。待引導程序完成升級文件的替換后,升級區變為備份區,原備份區變為升級區,等待下次程序升級文件的寫入。通過這種存儲、校驗、替換的方式,可以避免傳輸錯誤導致升級失敗的風險。
如圖4所示,當設備上電后,單片機從復位中斷服務向量所指向的地址即引導程序的首地址開始執行。在引導程序里,首先關閉設備的看門狗和中斷,初始化硬件,然后從FRAM讀取升級配置信息,做出以下判斷:①如果該升級配置信息指示在片外FLASH有新的應用程序,則擦除片內應用程序地址區間,從片外FLASH讀出升級的應用程序文件數據,寫入到片內的應用程序地址區間進行應用程序的升級替換;②如果指示升級的程序文件運行失敗,需要恢復備份的應用程序,則擦除片內應用程序地址區間,從片外FLASH讀出備份的應用程序文件數據,寫入到片內的應用程序地址區間進行恢復;③如果指示程序正常運行,則判斷應用程序的入口地址是否有效,有效則跳轉到入口執行應用程序,否則執行串口接收程序,等待串口程序下載;④設備維護人員在終端設備上電時刻可以人工干預引導流程,通過某種外部事件比如按鍵事件,暫時中斷引導流程,讓引導程序直接進入串口升級命令等待階段,在一段時間內如果收到串口程序下載命令,則執行串口接收程序,等待串口程序下載。否則超時后,繼續引導。

在嵌入式終端設備軟件功能日益復雜的情況下,軟件的升級維護成本不容忽視。本方案在單片機軟件遠程維護上,提供了一種可靠的升級方式,既支持本地串口下載,又支持遠程下載的升級接口,并針對升級過程中設備意外掉電的情況提供了解決方法。文中創新點:單片機片內FLASH與片外FLASH相結合的方式,升級過程中設備意外掉電,上電后可繼續升級的解決方案,同時支持升級與備份恢復功能。
[1] 李俊,王金海.基于 TFTP 協議的 ARM 軟件遠程更新系統[J].工礦自動化,2010(07):22-25.
[2] 陶維青, 王付軍.基于 GPRS 網絡的 MSP430 單片機Flash遠程更新方法[J].電測與儀表,2007(07):33-36.
[3] 梅亮,林輝.TMS320F2812 代碼在線升級的研究與設計[J].電氣傳動,2006,36(07):62-64.
[4] 陳波,石旭剛,李棟.嵌入式設備軟件自動升級技術[J].計算機時代,2008 (04): 54-55.
[5] 石乃軒,馮偉.基于 TMS320VC55x DSP在線升級的設計與實現[J].通信技術,2010,43(07):236-238.
[6] 蔡作英.基于 FLASH的嵌入式系統自動升級的實現[J].福建電腦,2005(06):73-74.
[7] 伍方輝,方安安,劉華珠.嵌入式系統中的 Flash設計與分析[J].微計算機信息(嵌入式與 SOC),2009,25(2-2):25-26.
[8] 陳林,林金朝.一種基于嵌入式系統的遠程程序更新機制[J].微計算機信息(嵌入式與 SOC),2007,23(9-2):4-6.
[9] 鄧娟,彭真明.基于嵌入式系統的遠程在線升級雙 BOOT設計[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.