牛軍浩 張少壯 馮怡凱 覃小梅 蒙遠鍵
摘? 要:嵌入式產(chǎn)品投入市場后,由于需求的改進或者應用程序BUG的修補,仍需要對產(chǎn)品上的應用程序進行維護、更新,但工程師到現(xiàn)場更新應用程序比較麻煩,嵌入式軟件的遠程在線升級功能可以使工程師不用親臨現(xiàn)場,直接將編譯好的程序通過網(wǎng)絡傳輸給產(chǎn)品,產(chǎn)品上的無線模塊接收到應用軟件程序包之后自動保存到程序區(qū),由此實現(xiàn)應用程序的遠程更新。本課題重點研究和實現(xiàn)了STM32的應用程序遠程升級功能模塊的方案,主控板通過無線模塊與服務器端連接,當主控板運行應用程序時,服務器端可以查看主控板當前的應用軟件狀態(tài),并向主控板發(fā)送升級請求,主控板接受請求后自動進入引導升級程序,接收來自服務器端的應用程序包,完成應用程序的更新。
關(guān)鍵詞:遠程升級;網(wǎng)絡傳輸;固件更新
中圖分類號:TP368.1;TN929.532? ? ? 文獻標識碼:A 文章編號:2096-4706(2019)23-0055-03
STM32 Firmware Remote Upgrade System Based on GPRS
NIU Junhao,ZHANG Shaozhuang,F(xiàn)ENG Yikai,QIN Xiaomei,MENG Yuanjian
(Guilin University of Electronic Technology,Guilin? 541004,China)
Abstract:After the embedded product is put into the market,due to the improvement of the requirement or the repair of the application program BUG,the application program on the product needs to be maintained and updated. But it’s hard for engineers to update the application on site,the remote on-line upgrade function of the embedded software can enable the engineer to transmit the compiled program directly to the product through the network without being on-site,and the wireless module on the product is automatically saved to the program area after the application software package is received,thereby realizing the remote update of the application program. This project focuses on the research and implementation of the STM32 application remote upgrade function module. The main control board is connected with the server end through the wireless module,and when the main control board runs the application program,the server side can view the current application software state of the main control board,and sends an upgrade request to the main control board,the master control board automatically enters the boot upgrade program after receiving the request,receives the application package from the server side,and finishes the update of the application program.
Keywords:remote upgrade;network transmission;firmware update
1? 緒論
1.1? 課題的背景及意義
如今一些產(chǎn)品投放市場后仍需要工程師親臨現(xiàn)場維護,部分是由于應用軟件的BUG需要修補,部分是用戶需求的改進,還有部分是市場需求的提高等等,諸多原因都需要更新應用程序,若可以遠程對應用程序進行更新,則可以節(jié)省很多的人力、物力以及時間,給產(chǎn)品維護帶來很大的方便。尤其是對于一些無人值守的產(chǎn)品,只需要在遠程給產(chǎn)品發(fā)送升級申請,產(chǎn)品對版本號進行判斷后自行選擇是否進行更新,無需人為操作,更新完成后直接運行應用程序,智能化使產(chǎn)品維護更加便捷。
1.2? 應用軟件遠程升級功能的研究現(xiàn)狀及發(fā)展趨勢
1.2.1? 應用軟件遠程升級的研究現(xiàn)狀
應用軟件遠程升級功能目前大多是依賴于無線通信,單片機可以通過各種接口與無線模塊進行數(shù)據(jù)傳輸,如今網(wǎng)絡已覆蓋國內(nèi)大部分地區(qū),通信穩(wěn)定、速度快、可永遠在線等優(yōu)點為應用軟件的傳輸提供了十分良好的環(huán)境。
借由無線模塊將應用軟件包傳輸?shù)絾纹瑱C上,單片機即可執(zhí)行自我升級,也就是在應用升級(In Application Programming,IAP)。當單片機在運行程序的時候可以提供一種改變FLASH數(shù)據(jù)的方法,也就是說程序自己可以往程序存儲器里寫數(shù)據(jù)或修改程序。這種方式的典型應用是用一小段代碼來實現(xiàn)程序的下載。
1.2.2? 應用軟件遠程升級的發(fā)展趨勢
應用軟件遠程升級的未來發(fā)展趨勢是向著智能化的方向發(fā)展。無需人為操作,一鍵升級,自動備份老版本程序,防止突發(fā)故障丟失升級程序包,使得升級的可靠性得到很好的保障。這對于產(chǎn)品應用程序的維護和更新均有有很大的意義。
2? 應用軟件遠程升級相關(guān)技術(shù)與原理分析
2.1? C#搭建Socket服務器平臺
Socket是面向客戶/服務器模型設計的,針對客戶和服務器程序提供不同的Socket系統(tǒng)調(diào)用??蛻綦S機申請一個Socket(相當于一個想打電話的人可以在任何一臺入網(wǎng)電話上撥號呼叫),系統(tǒng)為之分配一個Socket號;服務器擁有全局公認的Socket,任何客戶都可以向它發(fā)出連接請求和信息請求。.net平臺封裝了建立Socket通信所使用的類,在VS2010上利用C#語言可以很方便地把服務器搭建起來。
2.2? TCP/IP協(xié)議
Transmission Control Protocol/Internet Protocol,即傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又名網(wǎng)絡通訊協(xié)議。簡單來說:TCP控制傳輸數(shù)據(jù),負責發(fā)現(xiàn)傳輸?shù)膯栴},一旦有問題就發(fā)出信號,要求重新傳輸,直到所有數(shù)據(jù)安全正確地傳輸?shù)侥康牡兀鳬P是負責給因特網(wǎng)中的每一臺電腦定義一個地址,以便傳輸。相較于UDP協(xié)議,TCP傳輸速度比較慢,但其可靠性較高。
2.3? CRC校驗
CRC(Cyclic Redundancy Check)即循環(huán)冗余校驗碼,是數(shù)據(jù)通信領(lǐng)域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環(huán)冗余檢查(CRC)是一種數(shù)據(jù)傳輸檢錯功能,對數(shù)據(jù)進行多項式計算,并將得到的結(jié)果附在幀的后面,接收設備也執(zhí)行類似的算法,以保證數(shù)據(jù)傳輸?shù)恼_性和完整性。
2.4? IAP技術(shù)
IAP(In-Application Programming)即在應用編程,指單片機可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。單片機通過串口接收新代碼,將其寫入對應的FLASH分區(qū),設置地址偏移并移動PC指針,使程序在對應的分區(qū)內(nèi)運行。
將FLASH的主存儲器分成五個部分,最初的區(qū)域為BootLoader區(qū)(起始于0x08000000),這里放置BootLoader程序,由JTAG燒錄,其作用是接收應用程序包、備份應用程序、存儲應用程序等。一般情況下,程序文件從此地址開始寫入;其次是應用程序區(qū),應用程序主要存放在這個地址段,升級完成后將PC指針指向該地址段的首地址,使應用程序在這里運行;再往后是應用程序的備份區(qū),為防止升級過程中出現(xiàn)故障,所以在FLASH中開辟出一片區(qū)域?qū)斍鞍姹镜膽贸绦虼鎯ζ饋?,當終端重新上電或者升級超時之后再將APP從中恢復出來,以免系統(tǒng)丟失應用程序無法正常工作;隨后是公共指令區(qū),一些指令、標志將會存在這片區(qū)域,應用程序或者BootLoader都可以訪問這片區(qū)域,如升級標志,進入升級之前在應用程序中將升級標志置1,進入BootLoader升級成功之后將其置0,系統(tǒng)去讀這個標志的時候就知道將要運行哪個區(qū)域的程序了。
3? 系統(tǒng)整體框架
系統(tǒng)整體的框架如圖1所示,通過服務器端點擊按鍵進行操作,打開服務器,等待無線模塊的連接。無線模塊與服務器端連接上之后,點擊按鍵通過Socket給無線模塊發(fā)送請求(包含版本號),無線模塊將服務器端傳輸過來的信息通過串口發(fā)送給單片機。當接收到升級請求時,單片機在FLASH公共命令區(qū)寫下升級標記并告知服務器端,隨后跳轉(zhuǎn)至BootLoader程序。若單片機進入了BootLoader程序,點擊開始升級的按鍵之后,服務器端讀取應用程序文件,將其發(fā)送給終端,BootLoader程序接收這個程序包,并對其進行校驗、保存。為保證數(shù)據(jù)的可靠傳輸,采用Ymodem協(xié)議進行文件的傳輸,單片機要先給服務器端發(fā)送請求,服務器端才開始傳輸文件,等待終端收到數(shù)據(jù)包并且校驗通過之后,終端會進行應答,此時服務器端才開始發(fā)送下一幀數(shù)據(jù)。應用程序升級成功后,BootLoader才會置位FLASH公共命令區(qū)中的標記,將PC指針指向APP程序區(qū)的首地址。
3.1? 服務器
服務器端的主要功能是將應用程序文件通過網(wǎng)絡發(fā)送給終端,并觀察終端應用程序升級的過程中每一個階段的狀態(tài)。在Visual studio 2010中建立一個窗體,搭建友好的人機交互界面,利用.net平臺上封裝好的Socket類庫新建一個服務器。
各個階段終端反饋回來的信息都顯示在服務器端的消息窗口上,如圖2所示,如此可以直觀地了解終端的各個狀態(tài)。
3.2? 終端設計
3.2.1? Bootloader
終端負責接收來自服務器端的升級請求,進行判斷之后進行應答,能對當前應用程序進行備份與恢復,成功升級以及應對升級過程中的突發(fā)事件。
在FLASH中的公共指令區(qū)存放了一個切換程序的標志,保證BootLoader和APP都能訪問。系統(tǒng)上電之后首先會在BootLoader程序中讀出這個標志,若判定要進入APP程序,則檢查APP程序區(qū)存放的棧頂?shù)刂肥欠窈戏ǎㄖ袛嘞蛄勘碇械牡谝粋€放的是棧頂?shù)刂罚?,只有APP程序的棧頂?shù)刂泛戏ǖ那闆r下才會去執(zhí)行APP,否則就從備份區(qū)中把上一次備份的APP調(diào)出來執(zhí)行。將PC指針指向APP程序的起始地址,使程序在APP程序中運行。
應用程序的備份與恢復是一樣的過程,備份要求從APP程序區(qū)將數(shù)據(jù)讀取出來,保存到備份區(qū),而恢復則是把數(shù)據(jù)從備份區(qū)讀出來,保存到APP程序區(qū)。
在BootLoader中接收數(shù)據(jù)時,會把數(shù)據(jù)的長度length寫入FLASH中,在進行數(shù)據(jù)的備份和恢復時,去訪問FLASH中指定數(shù)據(jù)區(qū)域的首地址,讀取逐個地址的數(shù)據(jù),再逐個寫到備份區(qū)或者APP程序區(qū)中,直到讀出的數(shù)據(jù)長度滿足等于length時,說明已經(jīng)完整地讀取出了APP數(shù)據(jù)包,并成功寫入指定分區(qū)。清除備份標志或者恢復標志,成功完成備份或恢復。
數(shù)據(jù)包傳輸結(jié)束之后,服務器端會發(fā)送一個EOT信號,此時數(shù)據(jù)傳輸進入第三階段,收到這個信號時,除了回復應答信號之外,還要發(fā)送請求,等待服務器端發(fā)送全零數(shù)據(jù)包,收到這個全零數(shù)據(jù)包意味著所有數(shù)據(jù)已經(jīng)成功傳輸。每次接收數(shù)據(jù)都判斷是否超過10秒,計超過的次數(shù),當超過6次(1分鐘)則判定為升級超時。
3.2.2? APP
封裝了一個函數(shù)加入到APP中,在APP程序中,設置程序起始地址和中斷向量表偏移,利用串口與無線模塊連接,在程序中將串口傳過來的數(shù)據(jù)緩存起來,調(diào)用封裝好的Request函數(shù),解析緩存區(qū)中的數(shù)據(jù),即可進行應用程序的升級。Request函數(shù)的具體流程首先在數(shù)據(jù)緩存區(qū)中找到數(shù)據(jù)頭,數(shù)據(jù)頭由0xAA和0xF6兩個字節(jié)組成,第三個字節(jié)為功能指令,這里定義0x01為升級指令,第四個字節(jié)為新的APP的版本號,最后一個字節(jié)為和校驗,數(shù)據(jù)頭找到之后,往下找到和校驗,將數(shù)據(jù)頭到和校驗之間(包含數(shù)據(jù)頭,不包含校驗)的數(shù)據(jù)相加,結(jié)果取低八位,拿去與和校驗進行對比,若一樣,則表示數(shù)據(jù)沒有出錯,判斷功能指令處是否為0x01,確定為0x01,則提取出新的APP版本,與當前的版本號(保存在FLASH中)進行對比,若新的版本號大于當前版本號,將備份標志和升級標志置1,記錄新的版本號,將這些信息存入FLASH中,舒適化堆棧指針,使其指向BootLoader的首地址,執(zhí)行BootLoader程序,進行應用軟件升級。
4? 結(jié)? 論
完成的工作:成功進入BootLoader并進行備份,服務器端請求升級,進入BootLoader并成功執(zhí)行備份操作。舊版本的APP讓兩個LED快速循環(huán)閃爍,BootLoader中令一個LED快速閃爍,新版本的APP讓兩個APP慢速循環(huán)閃爍。在終端可以看到由兩個LED快速循環(huán)閃爍變?yōu)橐粋€快速閃爍,表明終端以進入BootLoader程序。成功升級,實現(xiàn)遠程、在線升級應用程序,升級成功自動運行最新的程序,升級成功率為90%以上。數(shù)據(jù)傳輸完成后,服務器端會有提示:“APP成功升級至新版本”,終端的表現(xiàn)為從BootLoader(一個LED快閃)轉(zhuǎn)化成新的APP版本(兩個ALED循環(huán)閃爍)。升級超時、升級失敗、校驗失敗等故障,超過一分鐘不給終端發(fā)送程序包,服務器端窗口提示超時,自動從備份區(qū)中恢復并執(zhí)行舊版本程序。
存在的問題:單次只能升級一個終端的應用程序,無法進行批量升級。
未來的研究方向:優(yōu)化服務器端程序,實現(xiàn)多線程操作,同步升級多個終端;在服務器端后臺進行優(yōu)化,自動判斷是否可以升級,并確定發(fā)送程序包。
參考文獻:
[1] 曾自怡,李靖沙.GPRS通信技術(shù)在五凌電力水情測報系統(tǒng)中的應用 [J].水電站機電技術(shù),2019,42(9):29-31.
[2] 鄭歡歡,錢宇坤.基于GPRS的遠程抄表系統(tǒng)的設計 [J].工業(yè)計量,2019,29(4):23-26.
[3] 李坊玉.STM32 ST-LINK Utility應用功能及使用方法(三) [N].電子報,2019-09-15(007).
[4] 劉定良,陳文科.基于GPRS和PLC的大學校園配電網(wǎng)遠程監(jiān)控系統(tǒng)設計 [J].智庫時代,2018(47):163-164.
[5] 謝世春,陳露,李繼揚.大數(shù)據(jù)時代下計算機網(wǎng)絡信息安全問題 [J].電子技術(shù)與軟件工程,2019(19):178-179.
作者簡介:牛軍浩(1981-),男,漢族,河南林州人,就職于測控技術(shù)與儀器系,主任,高級實驗師,工學碩士,研究方向:智能儀器、自動測試總線。