陳瑞杰 王宜懷 李會
摘 要:傳感節(jié)點投入運行后,遇到軟件錯誤或功能升級都需要更新節(jié)點的程序,但是傳統(tǒng)的現(xiàn)場燒寫方式比較繁瑣。為了解決該問題,以ARM Cortex M0+內(nèi)核的MKW01Z128無線射頻芯片為基礎(chǔ),設(shè)計了一套成本低、實時性好、可靠性高的無線代碼更新系統(tǒng)。該系統(tǒng)采用串口和無線射頻相結(jié)合的通信技術(shù),對片上FLASH進(jìn)行合理劃分,設(shè)計了Bootloader對傳感節(jié)點程序進(jìn)行代碼更新,同時增加了通信幀格式和丟幀重傳機(jī)制來確保數(shù)據(jù)傳輸?shù)目煽啃?。對更新系統(tǒng)的性能進(jìn)行了測試,測試結(jié)果表明該系統(tǒng)能可靠地實現(xiàn)空曠環(huán)境下200 m內(nèi)的無線代碼更新,具有較好的應(yīng)用前景。
關(guān)鍵詞: MKW01Z128; 無線代碼更新; Bootloader; 丟幀重傳; 可靠更新系統(tǒng)
中圖分類號: TN925+.92 文獻(xiàn)標(biāo)識碼: A 文章編號: 1004?373X(2016)04?0067?05
Abstract:When sensor nodes are put into operation, a program of firmware updating is needed for any software malfunction or function upgrade. The tradition solution to program in the field is inconvenient and usually hard to achieve. To solve this problem, a low?cost, well real?time performance and highly reliable wireless code update system was designed, which is based on a RF chip MKW01Z128 with RF Cortex MO+core. This chip is made by Freescale Semiconductor in 2013. With the communication technology combining serial port with RF, the Flash memory is reasonably partitioned in the system. Bootloader was designed to update the code of sensor node program. A communication frame format and a lost frame retransmission mechanism were added to make sure the reliability of data transmission. Performance of the update system was tested. The test result shows that the system can achieve reliable wireless code updating within 200 m radius in the open field. Thus it has a good application prospect.
Keywords: MKW01Z128; wireless code update; Bootloader; lost frame retransmission; reliable update system
0 引 言
隨著物聯(lián)網(wǎng)技術(shù)的快速發(fā)展,在無線傳感器網(wǎng)絡(luò)等領(lǐng)域,無線代碼更新技術(shù)愈發(fā)顯得必不可少[1]。傳感節(jié)點投入運行后,難免會出現(xiàn)軟件錯誤或要進(jìn)行程序升級,此時在線升級需要大量的人力、物力,比較麻煩。而且傳統(tǒng)的遠(yuǎn)程代碼更新系統(tǒng)涉及GPRS、ZigBee、以太網(wǎng)等多種技術(shù)[2?3],設(shè)計周期長、研發(fā)成本高、代碼更新的時間較長。對于很多近距離的無線傳感節(jié)點程序更新來說,例如LED屏控制芯片的程序更新、水質(zhì)監(jiān)測芯片的程序更新等,簡單、高效、可靠的近距離無線代碼更新系統(tǒng)顯得格外重要。基于此,本文深入剖析機(jī)器碼格式、Bootloader機(jī)制、數(shù)據(jù)傳輸丟幀等技術(shù)要點,在基于ARM Cortex M0+內(nèi)核的MKW01Z128芯片的無線傳感節(jié)點上設(shè)計了Bootloader。無線接收到的代碼先存放于更新程序區(qū),丟幀重傳機(jī)制確保數(shù)據(jù)的準(zhǔn)確接收,最后在接收到代碼更新指令后將存儲到更新程序區(qū)中代碼復(fù)制到MCU FLASH的指定位置,并通過PC指針跳轉(zhuǎn)來實現(xiàn)代碼更新。
1 系統(tǒng)介紹
本文搭建了一套集串口和無線射頻等技術(shù)為一體的無線代碼可靠更新系統(tǒng)。該系統(tǒng)通過PC機(jī)上位機(jī)軟件實現(xiàn)一點對多點地更新空曠情況下200 m內(nèi)的無線傳感節(jié)點程序,系統(tǒng)組成如圖1所示。這里,無線代碼更新需關(guān)注的是PC機(jī)上位機(jī)軟件、傳感節(jié)點端的Bootloader、PC機(jī)與根節(jié)點的通信、根節(jié)點與傳感節(jié)點的通信等細(xì)節(jié)。更新程序流程為:PC機(jī)上位機(jī)軟件解析待更新程序的機(jī)器碼(.HEX文件),提取出有效數(shù)據(jù)通過串口發(fā)送根節(jié)點,根節(jié)點對數(shù)據(jù)進(jìn)行適當(dāng)處理后存入片上FLASH中。當(dāng)接收到上位機(jī)的更新代碼命令后,根節(jié)點讀取FLASH內(nèi)容,通過無線射頻技術(shù)將數(shù)據(jù)發(fā)送給無線傳感器節(jié)點,無線傳感器節(jié)點校驗接收正確后更新代碼。
本系統(tǒng)中,根節(jié)點和無線傳感節(jié)點都采用KW01芯片。該芯片是飛思卡爾公司2013年推出的基于ARM Cortex M0+內(nèi)核、運行速率為48 MHz的低功耗無線射頻芯片。芯片內(nèi)部集成了Freescale公司的KL26芯片(控制芯片,M0+內(nèi)核)和Semtech公司的SX1233芯片(無線收發(fā)器),擁有128 KB的FLASH(ROM),16 KB的RAM,可實現(xiàn)200 m內(nèi)數(shù)據(jù)的無線收發(fā)。
2 PC端軟件設(shè)計方案
PC機(jī)代碼更新軟件主要功能為提取機(jī)器碼(.HEX文件)中有效數(shù)據(jù),組幀后通過串口發(fā)送給根節(jié)點。下面主要分析.HEX文件記錄格式,給出提取有效數(shù)據(jù)的方法及過程。
2.1 .HEX文件介紹
.HEX(Intel HEX)文件[4]是由一行行符合Intel HEX文件格式的文本構(gòu)成的ASCII文本文件。.HEX文件以行為單位,每一行是一個HEX記錄,由十六進(jìn)制數(shù)的機(jī)器碼或數(shù)據(jù)常量組成。.HEX文件經(jīng)常被用于將程序或數(shù)據(jù)傳輸存儲到ROM,EPROM;大多數(shù)編程器和模擬器使用.HEX文件。每行HEX記錄由6個部分組成[5],如表1所示。
2.2 .HEX文件有效數(shù)據(jù)提取
.HEX文件有效數(shù)據(jù)提取的流程圖如圖2所示。將提取.HEX文件中的所有類型為00記錄的有效數(shù)據(jù)、數(shù)據(jù)內(nèi)容存儲在image.data[ ]數(shù)組中,在相同下標(biāo)的image.flag[ ]數(shù)組中標(biāo)記其是否為有效數(shù)據(jù)(1為有效;0為無效),其中數(shù)組下標(biāo)為數(shù)據(jù)在主控芯片F(xiàn)LASH中的地址即.HEX記錄中的地址段。此外,用戶代碼中不可避免地會出現(xiàn)程序跳轉(zhuǎn),.HEX文件中的地址會出現(xiàn)跳變,而被跳過的地址中存儲的內(nèi)容是無意義的,故給其賦值0xFF,但在代碼更新時仍將其作為有效數(shù)據(jù)進(jìn)行傳輸以簡化傳輸過程。
3 傳感節(jié)點端Bootloader設(shè)計
對于嵌入式系統(tǒng),Bootloader是指系統(tǒng)啟動后運行在用戶應(yīng)用程序之前的一段代碼,用來初始化硬件設(shè)備、建立內(nèi)存空間映射圖,為調(diào)用用戶應(yīng)用程序準(zhǔn)備好正確的環(huán)境[6]。Bootloader的設(shè)計對程序代碼的更新至關(guān)重要,主要包括中斷向量表重定位和鏈接文件中內(nèi)存設(shè)計。
3.1 中斷向量表重定位
中斷向量表是按照中斷源的中斷向量號順序存放中斷服務(wù)程序入口地址的一段存儲區(qū)域[7]。程序執(zhí)行的第一條指令的地址以中斷向量的形式給出,因此重定位中斷向量表是設(shè)計Bootloader的第一步。如圖3所示為中斷向量表重定位示意圖。
圖3中左邊為芯片存儲空間映像[8?9],中間圖將芯片的FLASH區(qū)劃分為三個部分:Bootloader區(qū)、用戶程序區(qū)和更新程序區(qū)。Bootloader區(qū)包括Bootloader代碼和中斷向量表,用戶程序區(qū)包括用戶代碼和中斷向量表,更新程序區(qū)用來臨時存放接收到的待更新程序。更新的代碼先放入更新程序區(qū),待更新完畢校驗成功后,覆蓋到用戶程序區(qū),最后通過PC指針跳轉(zhuǎn),轉(zhuǎn)入用戶程序區(qū)執(zhí)行程序。
Bootloader的中斷向量表起始地址為0x00000000,Cortex M0+內(nèi)核機(jī)制中,復(fù)位時,MCU讀取向量表的前2個字(前8 B),第一個字為MSP的初始值,第二個字為復(fù)位向量(即程序執(zhí)行的起始地址),程序執(zhí)行從復(fù)位向量處開始[10]。
在這里,中斷向量表重定位指的是將本處于0x00000000地址處用戶應(yīng)用程序的中斷向量表搬運到用戶程序區(qū)的起始地址0x00008000處。事實表明,用戶應(yīng)用程序與中斷向量表重定位后的用戶應(yīng)用程序的代碼完全一致,區(qū)別只是代碼在FLASH中的存儲位置不同,它們之間的轉(zhuǎn)換公式為:
重定位后的用戶代碼=0x00008000+用戶代碼
同時,0x00008000也是中斷向量表起始地址寄存器SCB?>VTOR中定義的中斷向量表的起始地址。
3.2 鏈接文件中內(nèi)存設(shè)計
鏈接文件提供了在鏈接過程中所需要的參數(shù)信息。在整個鏈接過程中,代碼和數(shù)據(jù)的基本單位是“段”。用戶將不同屬性的內(nèi)容放入不同的段中,鏈接器識別這些段,按照用戶指定將各個段放入相應(yīng)的存儲單元中,完成鏈接。
此處,需根據(jù)FLASH區(qū)的劃分對傳感器節(jié)點Bootloader和應(yīng)用程序的鏈接文件進(jìn)行合理設(shè)計。
Bootloader的中斷向量表從FLASH的起始地址(0x00000000)開始存放,ROM的起始地址為0x00000410。因為該Bootloader代碼量小于32 KB,故其在FLASH中的結(jié)束地址小于0x00008000。因此,將應(yīng)用程序的中斷向量表從0x00008000開始存放是可行的,此時應(yīng)用程序從FLASH的0x00008410地址處開始存放。這樣通過對鏈接文件中內(nèi)存的劃分,Bootloader與應(yīng)用程序就能合理地分布在MCU的FLASH中。
4 通信及代碼更新
4.1 PC機(jī)與根節(jié)點通信
PC機(jī)程序要將更新代碼通過串口線發(fā)送給根節(jié)點,再通過根節(jié)點將更新代碼發(fā)送給某個無線傳感節(jié)點。為了確保通信數(shù)據(jù)的準(zhǔn)確性,本文設(shè)計了PC機(jī)與根節(jié)點間的通信幀格式。
4.1.1 通信幀格式
PC機(jī)程序的幀格式需與根節(jié)點的幀格式一致,本文制定了通用的命令幀格式如表4所示,基于通用命令幀格式設(shè)計了應(yīng)用信息預(yù)處理幀、代碼幀、應(yīng)答幀、校驗幀和更新幀五種幀。
應(yīng)用信息預(yù)處理幀(AppInfoMsg):傳送有效代碼字節(jié)數(shù)和包號以供無線傳感節(jié)點接收與校驗,命令字為CMD_APP_INFO,6~9 B為有效代碼總字節(jié)數(shù),10~11 B為更新代碼總包號。
代碼幀(AppTransDataMsg):傳輸燒入到FLASH中的更新代碼,命令字為CMD_TRANS_DATA,6~7 B為包號,8~n-3 B為有效代碼總字節(jié)數(shù)。
應(yīng)答幀(Response):傳送應(yīng)答信息,命令字為CMD_RESPONSE,6~9 B為當(dāng)前幀包號。
校驗幀(AppVerificationMsg):用于保證數(shù)據(jù)傳輸?shù)恼_性,命令字為CMD_VERIFICATION,6~9 B為有效代碼總字節(jié)數(shù)。
更新幀(AppUpdateMsg):“通知”根節(jié)點開始發(fā)送更新代碼給某個具體的傳感節(jié)點,啟動代碼更新,命令字為CMD_UPDATE,6~7 B為更新節(jié)點的編號,最多可更新65 536(216)個傳感節(jié)點,8~11 B為有效代碼總字節(jié)數(shù)。
4.1.2 通信流程
根節(jié)點FLASH的扇區(qū)大小為1 024 B,加上幀頭、幀長等字節(jié),因此本文設(shè)計的代碼幀長n為1 033 B。其中,代碼幀的幀數(shù)等于PC機(jī)軟件解析出的.HEX有效數(shù)據(jù)總字節(jié)數(shù)除以扇區(qū)大小為1 024 B。PC機(jī)與根節(jié)點通信步驟如下:
(1) PC機(jī)首先發(fā)送AppInfoMsg幀,該幀將代碼的總字節(jié)數(shù)和總包數(shù)傳遞給根節(jié)點并由根節(jié)點寫入片上FLASH指定位置處,以供校驗幀校驗時使用。根節(jié)點返回Response幀,若該幀出錯則重發(fā)AppInfoMsg幀。
(2) PC機(jī)發(fā)送AppTransDataMsg幀,根節(jié)點根據(jù)該幀的校驗碼校驗該幀,若正確則寫入FLASH相應(yīng)地址處;若出錯,則返回當(dāng)前應(yīng)接收幀的包號以要求PC機(jī)重發(fā)該幀。此外,若PC機(jī)收不到應(yīng)答幀則重發(fā)該幀,該過程持續(xù)到代碼幀正確發(fā)送完畢。
(3) PC機(jī)發(fā)送AppVerificationMsg幀,該幀在代碼幀發(fā)送完畢后發(fā)送,其記錄了所有代碼的32 b累加校驗和,若從FLASH中讀取的所有代碼幀的32 b累加校驗和與此相等,則校驗成功,否則由應(yīng)答幀攜帶出錯信息,請求PC機(jī)重發(fā)該幀。此外,若PC機(jī)收不到該幀的應(yīng)答幀則重發(fā)該幀。
(4) PC機(jī)發(fā)送AppUpdateMsg幀,根節(jié)點讀取出FLASH中的數(shù)據(jù)發(fā)送給某個具體的傳感節(jié)點,傳感節(jié)點接收代碼驗證無誤后更新程序。
前3步執(zhí)行完,更新代碼已正確存儲于根節(jié)點的FLASH中,斷電不會丟失,此時只需在PC機(jī)軟件上寫入相應(yīng)編號(或編號范圍)執(zhí)行第(4)步即可完成代碼更新。若要對不同編號的傳感節(jié)點更新相同的代碼,只需執(zhí)行第(4)步即可,這樣就無需PC軟件每次發(fā)送機(jī)器碼給根節(jié)點,提高了代碼更新的速度。
4.2 根節(jié)點與傳感節(jié)點通信
當(dāng)PC機(jī)發(fā)送更新幀時,根節(jié)點需要通過無線射頻技術(shù)向傳感節(jié)點發(fā)送更新代碼,但傳感節(jié)點不能保證數(shù)據(jù)100%的接收,故本文設(shè)計了一種簡單高效的丟幀重傳機(jī)制來保證通信的可靠性。
根節(jié)點將更新代碼分組發(fā)送給傳感節(jié)點,傳感節(jié)點無需每幀都回發(fā)確認(rèn)(ACK)幀,只要最后回發(fā)一幀包含丟幀信息的數(shù)據(jù),根節(jié)點收到該幀重發(fā)丟失的幀數(shù)據(jù)。
傳感節(jié)點判斷丟幀方法:設(shè)置大小為50 B的緩沖區(qū),最多可記錄2萬幀數(shù)據(jù)接收狀態(tài),緩沖區(qū)第1個字節(jié)的第7位flag_buf[0].7代表第1幀數(shù)據(jù),flag_buf[0].6代表第2幀數(shù)據(jù),flag_buf[0].0代表第8幀數(shù)據(jù),以此類推。緩沖區(qū)初始化為0,成功接收到該幀數(shù)據(jù)時相應(yīng)位置1,如表5所示。
4.3 代碼更新
傳感節(jié)點接收到的更新代碼先存放在更新程序區(qū),校驗無誤后通過調(diào)用FLASH_ErasePage驅(qū)動函數(shù)對FLASH空間中的用戶程序區(qū)的扇區(qū)進(jìn)行擦除,并讀取更新程序區(qū)的代碼數(shù)據(jù),使用FLASH_Write函數(shù)將其逐扇區(qū)寫入到用戶程序區(qū)。寫入正確后,需重設(shè)主堆棧指針、PC指針跳轉(zhuǎn)實現(xiàn)程序跳轉(zhuǎn)到更新代碼處執(zhí)行。跳轉(zhuǎn)函數(shù)代碼如下:
5 測試結(jié)果
對本文設(shè)計的無線代碼更新機(jī)制進(jìn)行測試實驗,實驗使用3個ID,設(shè)為1,2,3的無線傳感節(jié)點,通過2種更新場景進(jìn)行實驗,測試代碼更新的時間開銷、實時性及可靠性。更新1,在main函數(shù)中,使用Light_Init函數(shù)對小燈進(jìn)行初始化;更新2,在main函數(shù)中,增加UART_Init函數(shù)對串口進(jìn)行初始化,開串口中斷,增加串口的中斷服務(wù)例程。測試更新時間方法為設(shè)置傳感節(jié)點一引腳為低電平,在Bootloader開始時將其拉高,結(jié)束時將其拉低,用示波器觀察高電平持續(xù)的時間即為代碼更新的時間。每種更新實驗進(jìn)行3組,每組重復(fù)5次,取平均時間為實驗結(jié)果,測試結(jié)果如表6所示。
測試更新效果方法為:更新1中觀察小燈亮暗變化;更新2中通過串口線查看打印出的消息是否正確,串口發(fā)送數(shù)據(jù)查看進(jìn)入中斷服務(wù)例程是否正確。測試結(jié)果:更新1中小燈閃爍情況與程序中設(shè)計一樣;更新2中串口打印正常,可正常進(jìn)入中斷服務(wù)例程。同時,也對不同距離無線更新的可靠性進(jìn)行測試,測試方法為調(diào)整根節(jié)點和無線傳感節(jié)點間的距離,更新20次,查看PC機(jī)軟件顯示的重傳幀數(shù),如表7所示。
6 結(jié) 語
本文設(shè)計的無線代碼更新機(jī)制運用了串口與無線射頻相結(jié)合的通信技術(shù),設(shè)計了Bootloader、丟幀重傳機(jī)制等可實現(xiàn)一點對多點的無線傳感節(jié)點程序更新。與傳統(tǒng)的在線燒寫程序相比,簡單方便、實時性強(qiáng);與傳統(tǒng)的無線更新系統(tǒng)相比,研發(fā)周期短、成本低、更新速度快。整套系統(tǒng)具有極強(qiáng)的可移植性與通用性。目前,該方案已成功應(yīng)用于無線LED控制系統(tǒng)中,經(jīng)測試表明,該機(jī)制穩(wěn)定可靠、可成功實現(xiàn)空曠情況下200 m內(nèi)的無線代碼更新。
參考文獻(xiàn)
[1] 況曉輝,許飛,劉麗.無線傳感器網(wǎng)絡(luò)遠(yuǎn)程代碼更新技術(shù)研究進(jìn)展[J].計算機(jī)科學(xué),2013,40(6A):255?261.
[2] 吳曉,杜鵬雷,江涌,等.無線傳感網(wǎng)中代碼更新機(jī)制的研究與設(shè)計[J].計算機(jī)應(yīng)用,2010(4):857?859.
[3] 彭燕.基于ZigBee的無線傳感器網(wǎng)絡(luò)研究[J].現(xiàn)代電子技術(shù),2011,34(5):49?51.
[4] 黃海寶,吳學(xué)杰,高艷艷.基于STM32F103局域網(wǎng)遠(yuǎn)程更新技術(shù)的實現(xiàn)[J].工業(yè)控制計算機(jī),2012,25(12):97?98.
[5] 王宜懷,朱仕浪,郭蕓.嵌入式技術(shù)基礎(chǔ)與實踐[M].3版.北京:清華大學(xué)出版社,2013.
[6] 蘭婧,朱怡安,袁磊.基于PXA270嵌入式系統(tǒng)的Bootloader研究與實現(xiàn)[J].計算機(jī)工程與設(shè)計,2009,30(21):4881?4883.
[7] 石晶,王宜懷,蘇勇,等.基于ARM Cortex?M4的MQX中斷機(jī)制分析與中斷程序框架設(shè)計[J].計算機(jī)科學(xué),2013,40(6):41?44.
[8] Freescale Semiconductor. MKW01Z128 Sub 1 GHz low power transceiver plus microcontroller reference manual [EB/OL]. [2014?03?12]. http://www.cache.freescale.com/files/microcontrollers/doc/ref_manual/MKW01xxRM.
[9] Freescale Semiconductor. MKW01Z128 Sub 1 GHz Low Power Transceiver plus Microcontroller Data Sheet [EB/OL]. [2014?03?20]. http://cache.freescale.com/files/microcontrollers/doc/data_
sheet/MKW01Z128.
[10] YIU J.ARM Cortex?M0權(quán)威指南[M].吳常玉,魏軍,譯.北京:清華大學(xué)出版社,2013.