文獻標識碼: B
文章編號: 0258-7998(2014)02-0135-04
近年來,隨著計算機技術及集成電路技術的發展,嵌入式設備廣泛應用于通信、網絡、工控、醫療、電子等領域。隨著用戶需求的提升,設備的升級越來越頻繁。然而有些設備安裝在高空高壓環境下,作業危險性很大。因此,需要一套行之有效的設備管理及升級方案,讓操作人員可以通過無線的方式[1]進行產品的升級和維護。
本文的軟件升級方案以TI公司的MSP430F5438A[2]為例,通過片內Flash備份,引導升級合一,常量定位,虛擬復位等方式,避免了程序升級需要上電復位及設備意外掉電導致升級失敗等風險,使終端設備實現了軟件升級遠程化,無需引導等待,掉電可恢復,數據包可斷點續傳,穩定可靠的目的。
1 基本原理
1.1遠程升級系統介紹
CDMA2000 1X是CDMA2000第三代無線通信系統的第一個階段,完全兼容IS-95,采用碼分和頻分結合的多址技術。CDMA2000 1X的空中信道支持的調制方式在兼容CDMAOne的基礎上進行了極大的增強,單個用于傳輸分組數據的空中信道的最大傳輸速率可以達到307.2 kb/s,是真正意義上的第三代移動通信系統[3]。如圖1所示,本方案中上位機作為網絡服務器,將升級代碼借助Internet、CDMA網絡發送到遠程終端的CDMA模塊中。MSP430讀取模塊中的緩存,存入到內部的Flash中,待遠程終端接收完全部的升級代碼并校驗正確后開始升級。
1.2 升級實現原理介紹
本方案將程序存儲空間劃分為Boot區、Code區、Temp區、Flag區和Vector區。Boot區存放基本的Flash讀寫、標志判斷等代碼(不含通信處理及基本操作);Code區存放完整的應用程序工程代碼(含通信處理及基本操作);Temp區用于備份程序區的代碼;Flag區是專門存放升級標志位的特殊區域;Vector區用于備份程序區的中斷向量。其中Boot區代碼使用特殊的“常量定位”方式添加到應用程序中,與Code區的應用程序一次編譯完成,且Boot區提供UpdateAPI函數供Code區調用。
MSP430F543A的Code Flash最多為256 KB,共128段,擦除的時候必須按段擦除,寫入或者讀出的時候按字或者字節進行操作。在Main Flash 中每段seg均為512 B,在Information Flash中每段為128 B。由于BankA分為0x40000-0x45bff和0x5c00-0xffff兩部分,段擦除會將兩部分都擦除,故在BankA中不使用0x40000-0x45bff(共23 KB),用戶中斷向量和備份中斷向量各為512 B,占據1 KB,Boot區分配16 KB。由于要程序升級可恢復,故做成備份的模式,這樣就達到了Temp區和Code區均為(256 KB-23KB-1 KB-16 KB)/2=108 KB的最佳效果。
在應用程序中下載完代碼并校驗正確后置位升級進度,通過虛擬復位跳轉到Boot區,讀取升級標志位來選擇相應的處理。如果置位的是下載完成標志,則按照分塊交換的理念,逐個相對應地交換,待全部交換完成,則跳轉到應用程序入口,開始執行交換后的新應用程序,如圖2所示。
2 關鍵技術
2.1 常量定位技術
一個函數的入口地址稱為函數的指針。可以用一個指針變量指向函數,然后通過該指針變量調用此函數。而Const常量定位技術就是從此衍生出來的。
在本方案中首先建立一個完整的工程,編寫Boot區代碼。開辟一段專門空間(0x5c00-0x5cff)來存儲Boot區函數的入口地址,得到Boot區txt格式的文件,轉換成16進制數據文件后,通過靜態存儲的方式定位到實際運行程序中在Boot區開辟的固定區間內(0x5c00-0x9bff),Code區通過Boot區提供的UpdateAPI函數入口地址,將其轉換成Code區函數后供自己調用。
為了防止誤升級,在Boot區定義一個讀取軟件版本信息的函數int s_Boot_GetUpdateVersion( ),此函數在Boot區的入口地址是56 6d,把它存放在0x5c00-0x5c01的空間內。在Code區中加入轉換后的Boot區代碼后,再自定義函數int(*Boot_GetUpdateVersion)(),然后將存儲在0x5c00-0x5c01處的s_Boot_GetUpdateVersion入口地址賦給該函數,接著調用Code區的(*Boot_GetUpdateVersion)()函數即可實現軟件版本信息讀取的功能。
可見通過常量定位這種方式,可以將應用程序和Boot程序一次編譯完成,Boot區提供UpdateAPI函數供Code區調用。
2.2 虛擬復位技術
所謂的虛擬復位不是通過產生外部的復位信號來迫使單片機復位,而是通過改變PC指針實現程序的跳轉。通常的方法是在C語言中內嵌匯編語言來實現。只要在需要復位的地方嵌入匯編語言[4] asm("mov &0xFFFE,PC")即可實現虛擬復位[3]。然而內嵌匯編總是存在諸多麻煩,因此,提出一種新的虛擬復位方法:
((void (*)(void))0x5d00)();
由于0x5d00是復位地址,故把它強制轉換成指向函數的指針,然后調用此函數,達到程序復位的目的。同時這種方法也解決了升級中存在的一個比較嚴重的問題:由于虛擬復位是通過內嵌的方式提供API函數供Code區函數調用的,而Code區的起始地址是0x9c00,則虛擬復位后的PC指針指向就是0x9c00,而不是Boot區的0x5d00。所以Code區的應用程序在執行虛擬復位時,無法跳轉到Boot區,這樣在Boot區要完成的代碼交換也將無法進行。可見此種無需嵌入匯編的方法,簡單方便且切實可行。
2.3 斷點續傳技術
UDP協議被稱為一種不可靠的傳輸協議,因為從發送方到接收方的傳遞過程中出現數據包的丟失,協議本身并不能做出任何檢測和提示,但具有TCP所望塵莫及的速度優勢。為了使遠程升級系統既獲得實時的性能,又獲得相對可靠性,必須在上層應用程序中完成安全和排序等功能,并建立可靠傳遞機制。
在本方案設計中,專門在Information Flash中開辟一段空間0x1800—0x187f,用來記錄當前經過CRC16校驗正確后的數據包數。為了保證Flash擦除的方便和穩定,規定數據包中數據的長度必須為128 B、256 B或者512 B,若所要傳輸的數據小于規定字節數,需在數據包中填充0xff方法以保證數據的一致性。當由于網絡不穩定或者斷電等突發情況下導致升級失敗時,若再次啟動升級,終端設備要首先讀取當前數據包數,擦除Flash中空余的存儲空間,然后發送含有當前數據包數的升級配置數據包給上位機,上位機在獲得當前命令包后計算下一數據包在解析文件中的位置,并組包發送。從而避免了相同數據包的重復發送和Flash的全部擦除。
3 上位機軟件設計
上位機方案采用Visual C++中的MFC對話框編程,其中的關鍵是對升級文件TXT文件的處理。@為地址引導符,其后數據為地址,即接下來代碼所存入的Flash地址起始位置。如果地址為0xFF80-0xFFFF,則為中斷向量地址,特別@后面的FFFE是應用程序中斷向量表中的復位地址。q為結束字符,表明文件結束。
上位機完成對文件的解析后,通過數據包與終端進行交互。數據包定義如表1所示。
其中命令碼是用來區分數據包所要執行的具體操作。由于尋址范圍超過了64 KB,故采用4 B來表示地址信息。
4 風險避免措施
升級中不可避免地存在各種風險,本方案采取如下措施: (1)將Code區和Temp劃分為若干塊,每次完成塊交換后,都將置備份標志,如果交換過程中有一塊交換不成功則再次虛擬復位,通過升級標志位的判斷進行恢復處理,將已經和Temp交換的部分再次交換回來保證原程序依然可用。(2)在下載代碼的過程中,每一包數據在上位機都計算CRC16校驗值,然后單片機接收數據后重新計算CRC16值,如果兩者相等才認為這包數據正確,給出正確回應[5]。(3)遇到在應用程序中代碼下載不完整或者代碼下載時斷電的情況,可通過讀取升級進度標志,單片機重新復位后不會在Boot區中進行代碼交換。(4)專門劃分一個區域用于記錄升級進度信息,通過修改進度信息來進行相應的處理[5]。(5)在等待升級完成的過程中,發送一定數目的升級完成確認包(地址信息為01 01 01 01,命令碼為88),如果收到回應,則確認升級完成。(6)本方案并不擦除原來的程序,只是將Code區和Temp區互換,所以可以實現升級區變為備份區,備份區變為升級區,等待下次文件的寫入,也可以按照需求還原程序。通過這種校驗、存儲、替換的方式,可以有效地降低由于傳輸錯誤導致升級失敗的風險。
5 測試結果及總結
為了保證通信的速率和穩定,本測試設置通信超時為5 s,重發次數為5次。即發送的數據包如果5 s內沒有回應,則重發。重發次數最多為5次,否則提示升級失敗。打開端口后,等待設備的登錄,登錄成功且升級文件解析正確后才可進行升級。點擊“程序升級”按鈕,上位機和終端開始交互。終端接收完正確數據后,虛擬復位完成Code區和Temp區的代碼交換。運行新程序后終端重啟CDMA模塊仍然發送包含新IP地址和終端ID的通信連接數據包給上位機。若終端ID前后一致且對升級完成確認包的回應正確,則表明升級成功。測試結果如圖3所示。
本方案借助Internet、CDMA網絡成功地實現了遠程終端的軟件升級。同時運用常量定位技術達到了升級無需引導等待的目的;虛擬復位、斷點續傳和升級進度標志的應用增加了升級程序抗風險的能力;采用片內Flash備份的方式,支持升級和備份恢復的功能。隨著通信技術和自編程序技術的發展,本方案對嵌入式終端設備的軟件更新具有極大的參考意義。
參考文獻
[1] 唐文, 劉芳伶. MSP430系列單片機軟件在線升級設計與實現[J].通信技術,2012,45(1):144-146.
[2] 美國德州儀器.MSP430 Flash SelfProgramming Technique[Z]. SLLAA103.2004.
[3] 張云. 第三代移動通信技術特點、后續演進及其全球競爭格局[J]. 中國集成電路, 2009(2):67-72.
[4] 孫亞萍, 張慧熙.一種新型DSP軟件在線升級方法的研究與實現[J].微型機與應用,2010,29(5):72-74.
[5] 羅文, 王莉娜, 肖鯤.基于GPRS的嵌入式系統遠程監控和升級[J].電子技術應用, 2010,36(5):159-162.