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