陳瑞杰 王宜懷 李會(huì)
摘 要:傳感節(jié)點(diǎn)投入運(yùn)行后,遇到軟件錯(cuò)誤或功能升級(jí)都需要更新節(jié)點(diǎn)的程序,但是傳統(tǒng)的現(xiàn)場(chǎng)燒寫方式比較繁瑣。為了解決該問題,以ARM Cortex M0+內(nèi)核的MKW01Z128無線射頻芯片為基礎(chǔ),設(shè)計(jì)了一套成本低、實(shí)時(shí)性好、可靠性高的無線代碼更新系統(tǒng)。該系統(tǒng)采用串口和無線射頻相結(jié)合的通信技術(shù),對(duì)片上FLASH進(jìn)行合理劃分,設(shè)計(jì)了Bootloader對(duì)傳感節(jié)點(diǎn)程序進(jìn)行代碼更新,同時(shí)增加了通信幀格式和丟幀重傳機(jī)制來確保數(shù)據(jù)傳輸?shù)目煽啃?。?duì)更新系統(tǒng)的性能進(jìn)行了測(cè)試,測(cè)試結(jié)果表明該系統(tǒng)能可靠地實(shí)現(xiàn)空曠環(huán)境下200 m內(nèi)的無線代碼更新,具有較好的應(yīng)用前景。
關(guān)鍵詞: MKW01Z128; 無線代碼更新; Bootloader; 丟幀重傳; 可靠更新系統(tǒng)
中圖分類號(hào): TN925+.92 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 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é)點(diǎn)投入運(yùn)行后,難免會(huì)出現(xiàn)軟件錯(cuò)誤或要進(jìn)行程序升級(jí),此時(shí)在線升級(jí)需要大量的人力、物力,比較麻煩。而且傳統(tǒng)的遠(yuǎn)程代碼更新系統(tǒng)涉及GPRS、ZigBee、以太網(wǎng)等多種技術(shù)[2?3],設(shè)計(jì)周期長(zhǎng)、研發(fā)成本高、代碼更新的時(shí)間較長(zhǎng)。對(duì)于很多近距離的無線傳感節(jié)點(diǎn)程序更新來說,例如LED屏控制芯片的程序更新、水質(zhì)監(jiān)測(cè)芯片的程序更新等,簡(jiǎn)單、高效、可靠的近距離無線代碼更新系統(tǒng)顯得格外重要?;诖耍疚纳钊肫饰鰴C(jī)器碼格式、Bootloader機(jī)制、數(shù)據(jù)傳輸丟幀等技術(shù)要點(diǎn),在基于ARM Cortex M0+內(nèi)核的MKW01Z128芯片的無線傳感節(jié)點(diǎn)上設(shè)計(jì)了Bootloader。無線接收到的代碼先存放于更新程序區(qū),丟幀重傳機(jī)制確保數(shù)據(jù)的準(zhǔn)確接收,最后在接收到代碼更新指令后將存儲(chǔ)到更新程序區(qū)中代碼復(fù)制到MCU FLASH的指定位置,并通過PC指針跳轉(zhuǎn)來實(shí)現(xiàn)代碼更新。
1 系統(tǒng)介紹
本文搭建了一套集串口和無線射頻等技術(shù)為一體的無線代碼可靠更新系統(tǒng)。該系統(tǒng)通過PC機(jī)上位機(jī)軟件實(shí)現(xiàn)一點(diǎn)對(duì)多點(diǎn)地更新空曠情況下200 m內(nèi)的無線傳感節(jié)點(diǎn)程序,系統(tǒng)組成如圖1所示。這里,無線代碼更新需關(guān)注的是PC機(jī)上位機(jī)軟件、傳感節(jié)點(diǎn)端的Bootloader、PC機(jī)與根節(jié)點(diǎn)的通信、根節(jié)點(diǎn)與傳感節(jié)點(diǎn)的通信等細(xì)節(jié)。更新程序流程為:PC機(jī)上位機(jī)軟件解析待更新程序的機(jī)器碼(.HEX文件),提取出有效數(shù)據(jù)通過串口發(fā)送根節(jié)點(diǎn),根節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行適當(dāng)處理后存入片上FLASH中。當(dāng)接收到上位機(jī)的更新代碼命令后,根節(jié)點(diǎn)讀取FLASH內(nèi)容,通過無線射頻技術(shù)將數(shù)據(jù)發(fā)送給無線傳感器節(jié)點(diǎn),無線傳感器節(jié)點(diǎn)校驗(yàn)接收正確后更新代碼。
本系統(tǒng)中,根節(jié)點(diǎn)和無線傳感節(jié)點(diǎn)都采用KW01芯片。該芯片是飛思卡爾公司2013年推出的基于ARM Cortex M0+內(nèi)核、運(yùn)行速率為48 MHz的低功耗無線射頻芯片。芯片內(nèi)部集成了Freescale公司的KL26芯片(控制芯片,M0+內(nèi)核)和Semtech公司的SX1233芯片(無線收發(fā)器),擁有128 KB的FLASH(ROM),16 KB的RAM,可實(shí)現(xiàn)200 m內(nèi)數(shù)據(jù)的無線收發(fā)。
2 PC端軟件設(shè)計(jì)方案
PC機(jī)代碼更新軟件主要功能為提取機(jī)器碼(.HEX文件)中有效數(shù)據(jù),組幀后通過串口發(fā)送給根節(jié)點(diǎn)。下面主要分析.HEX文件記錄格式,給出提取有效數(shù)據(jù)的方法及過程。
2.1 .HEX文件介紹
.HEX(Intel HEX)文件[4]是由一行行符合Intel HEX文件格式的文本構(gòu)成的ASCII文本文件。.HEX文件以行為單位,每一行是一個(gè)HEX記錄,由十六進(jìn)制數(shù)的機(jī)器碼或數(shù)據(jù)常量組成。.HEX文件經(jīng)常被用于將程序或數(shù)據(jù)傳輸存儲(chǔ)到ROM,EPROM;大多數(shù)編程器和模擬器使用.HEX文件。每行HEX記錄由6個(gè)部分組成[5],如表1所示。
2.2 .HEX文件有效數(shù)據(jù)提取
.HEX文件有效數(shù)據(jù)提取的流程圖如圖2所示。將提取.HEX文件中的所有類型為00記錄的有效數(shù)據(jù)、數(shù)據(jù)內(nèi)容存儲(chǔ)在image.data[ ]數(shù)組中,在相同下標(biāo)的image.flag[ ]數(shù)組中標(biāo)記其是否為有效數(shù)據(jù)(1為有效;0為無效),其中數(shù)組下標(biāo)為數(shù)據(jù)在主控芯片F(xiàn)LASH中的地址即.HEX記錄中的地址段。此外,用戶代碼中不可避免地會(huì)出現(xiàn)程序跳轉(zhuǎn),.HEX文件中的地址會(huì)出現(xiàn)跳變,而被跳過的地址中存儲(chǔ)的內(nèi)容是無意義的,故給其賦值0xFF,但在代碼更新時(shí)仍將其作為有效數(shù)據(jù)進(jìn)行傳輸以簡(jiǎn)化傳輸過程。
3 傳感節(jié)點(diǎn)端Bootloader設(shè)計(jì)
對(duì)于嵌入式系統(tǒng),Bootloader是指系統(tǒng)啟動(dòng)后運(yùn)行在用戶應(yīng)用程序之前的一段代碼,用來初始化硬件設(shè)備、建立內(nèi)存空間映射圖,為調(diào)用用戶應(yīng)用程序準(zhǔn)備好正確的環(huán)境[6]。Bootloader的設(shè)計(jì)對(duì)程序代碼的更新至關(guān)重要,主要包括中斷向量表重定位和鏈接文件中內(nèi)存設(shè)計(jì)。
3.1 中斷向量表重定位
中斷向量表是按照中斷源的中斷向量號(hào)順序存放中斷服務(wù)程序入口地址的一段存儲(chǔ)區(qū)域[7]。程序執(zhí)行的第一條指令的地址以中斷向量的形式給出,因此重定位中斷向量表是設(shè)計(jì)Bootloader的第一步。如圖3所示為中斷向量表重定位示意圖。
圖3中左邊為芯片存儲(chǔ)空間映像[8?9],中間圖將芯片的FLASH區(qū)劃分為三個(gè)部分:Bootloader區(qū)、用戶程序區(qū)和更新程序區(qū)。Bootloader區(qū)包括Bootloader代碼和中斷向量表,用戶程序區(qū)包括用戶代碼和中斷向量表,更新程序區(qū)用來臨時(shí)存放接收到的待更新程序。更新的代碼先放入更新程序區(qū),待更新完畢校驗(yàn)成功后,覆蓋到用戶程序區(qū),最后通過PC指針跳轉(zhuǎn),轉(zhuǎn)入用戶程序區(qū)執(zhí)行程序。
Bootloader的中斷向量表起始地址為0x00000000,Cortex M0+內(nèi)核機(jī)制中,復(fù)位時(shí),MCU讀取向量表的前2個(gè)字(前8 B),第一個(gè)字為MSP的初始值,第二個(gè)字為復(fù)位向量(即程序執(zhí)行的起始地址),程序執(zhí)行從復(fù)位向量處開始[10]。
在這里,中斷向量表重定位指的是將本處于0x00000000地址處用戶應(yīng)用程序的中斷向量表搬運(yùn)到用戶程序區(qū)的起始地址0x00008000處。事實(shí)表明,用戶應(yīng)用程序與中斷向量表重定位后的用戶應(yīng)用程序的代碼完全一致,區(qū)別只是代碼在FLASH中的存儲(chǔ)位置不同,它們之間的轉(zhuǎn)換公式為:
重定位后的用戶代碼=0x00008000+用戶代碼
同時(shí),0x00008000也是中斷向量表起始地址寄存器SCB?>VTOR中定義的中斷向量表的起始地址。
3.2 鏈接文件中內(nèi)存設(shè)計(jì)
鏈接文件提供了在鏈接過程中所需要的參數(shù)信息。在整個(gè)鏈接過程中,代碼和數(shù)據(jù)的基本單位是“段”。用戶將不同屬性的內(nèi)容放入不同的段中,鏈接器識(shí)別這些段,按照用戶指定將各個(gè)段放入相應(yīng)的存儲(chǔ)單元中,完成鏈接。
此處,需根據(jù)FLASH區(qū)的劃分對(duì)傳感器節(jié)點(diǎn)Bootloader和應(yīng)用程序的鏈接文件進(jìn)行合理設(shè)計(jì)。
Bootloader的中斷向量表從FLASH的起始地址(0x00000000)開始存放,ROM的起始地址為0x00000410。因?yàn)樵揃ootloader代碼量小于32 KB,故其在FLASH中的結(jié)束地址小于0x00008000。因此,將應(yīng)用程序的中斷向量表從0x00008000開始存放是可行的,此時(shí)應(yīng)用程序從FLASH的0x00008410地址處開始存放。這樣通過對(duì)鏈接文件中內(nèi)存的劃分,Bootloader與應(yīng)用程序就能合理地分布在MCU的FLASH中。
4 通信及代碼更新
4.1 PC機(jī)與根節(jié)點(diǎn)通信
PC機(jī)程序要將更新代碼通過串口線發(fā)送給根節(jié)點(diǎn),再通過根節(jié)點(diǎn)將更新代碼發(fā)送給某個(gè)無線傳感節(jié)點(diǎn)。為了確保通信數(shù)據(jù)的準(zhǔn)確性,本文設(shè)計(jì)了PC機(jī)與根節(jié)點(diǎn)間的通信幀格式。
4.1.1 通信幀格式
PC機(jī)程序的幀格式需與根節(jié)點(diǎn)的幀格式一致,本文制定了通用的命令幀格式如表4所示,基于通用命令幀格式設(shè)計(jì)了應(yīng)用信息預(yù)處理幀、代碼幀、應(yīng)答幀、校驗(yàn)幀和更新幀五種幀。
應(yīng)用信息預(yù)處理幀(AppInfoMsg):傳送有效代碼字節(jié)數(shù)和包號(hào)以供無線傳感節(jié)點(diǎn)接收與校驗(yàn),命令字為CMD_APP_INFO,6~9 B為有效代碼總字節(jié)數(shù),10~11 B為更新代碼總包號(hào)。
代碼幀(AppTransDataMsg):傳輸燒入到FLASH中的更新代碼,命令字為CMD_TRANS_DATA,6~7 B為包號(hào),8~n-3 B為有效代碼總字節(jié)數(shù)。
應(yīng)答幀(Response):傳送應(yīng)答信息,命令字為CMD_RESPONSE,6~9 B為當(dāng)前幀包號(hào)。
校驗(yàn)幀(AppVerificationMsg):用于保證數(shù)據(jù)傳輸?shù)恼_性,命令字為CMD_VERIFICATION,6~9 B為有效代碼總字節(jié)數(shù)。
更新幀(AppUpdateMsg):“通知”根節(jié)點(diǎn)開始發(fā)送更新代碼給某個(gè)具體的傳感節(jié)點(diǎn),啟動(dòng)代碼更新,命令字為CMD_UPDATE,6~7 B為更新節(jié)點(diǎn)的編號(hào),最多可更新65 536(216)個(gè)傳感節(jié)點(diǎn),8~11 B為有效代碼總字節(jié)數(shù)。
4.1.2 通信流程
根節(jié)點(diǎn)FLASH的扇區(qū)大小為1 024 B,加上幀頭、幀長(zhǎng)等字節(jié),因此本文設(shè)計(jì)的代碼幀長(zhǎng)n為1 033 B。其中,代碼幀的幀數(shù)等于PC機(jī)軟件解析出的.HEX有效數(shù)據(jù)總字節(jié)數(shù)除以扇區(qū)大小為1 024 B。PC機(jī)與根節(jié)點(diǎn)通信步驟如下:
(1) PC機(jī)首先發(fā)送AppInfoMsg幀,該幀將代碼的總字節(jié)數(shù)和總包數(shù)傳遞給根節(jié)點(diǎn)并由根節(jié)點(diǎn)寫入片上FLASH指定位置處,以供校驗(yàn)幀校驗(yàn)時(shí)使用。根節(jié)點(diǎn)返回Response幀,若該幀出錯(cuò)則重發(fā)AppInfoMsg幀。
(2) PC機(jī)發(fā)送AppTransDataMsg幀,根節(jié)點(diǎn)根據(jù)該幀的校驗(yàn)碼校驗(yàn)該幀,若正確則寫入FLASH相應(yīng)地址處;若出錯(cuò),則返回當(dāng)前應(yīng)接收幀的包號(hào)以要求PC機(jī)重發(fā)該幀。此外,若PC機(jī)收不到應(yīng)答幀則重發(fā)該幀,該過程持續(xù)到代碼幀正確發(fā)送完畢。
(3) PC機(jī)發(fā)送AppVerificationMsg幀,該幀在代碼幀發(fā)送完畢后發(fā)送,其記錄了所有代碼的32 b累加校驗(yàn)和,若從FLASH中讀取的所有代碼幀的32 b累加校驗(yàn)和與此相等,則校驗(yàn)成功,否則由應(yīng)答幀攜帶出錯(cuò)信息,請(qǐng)求PC機(jī)重發(fā)該幀。此外,若PC機(jī)收不到該幀的應(yīng)答幀則重發(fā)該幀。
(4) PC機(jī)發(fā)送AppUpdateMsg幀,根節(jié)點(diǎn)讀取出FLASH中的數(shù)據(jù)發(fā)送給某個(gè)具體的傳感節(jié)點(diǎn),傳感節(jié)點(diǎn)接收代碼驗(yàn)證無誤后更新程序。
前3步執(zhí)行完,更新代碼已正確存儲(chǔ)于根節(jié)點(diǎn)的FLASH中,斷電不會(huì)丟失,此時(shí)只需在PC機(jī)軟件上寫入相應(yīng)編號(hào)(或編號(hào)范圍)執(zhí)行第(4)步即可完成代碼更新。若要對(duì)不同編號(hào)的傳感節(jié)點(diǎn)更新相同的代碼,只需執(zhí)行第(4)步即可,這樣就無需PC軟件每次發(fā)送機(jī)器碼給根節(jié)點(diǎn),提高了代碼更新的速度。
4.2 根節(jié)點(diǎn)與傳感節(jié)點(diǎn)通信
當(dāng)PC機(jī)發(fā)送更新幀時(shí),根節(jié)點(diǎn)需要通過無線射頻技術(shù)向傳感節(jié)點(diǎn)發(fā)送更新代碼,但傳感節(jié)點(diǎn)不能保證數(shù)據(jù)100%的接收,故本文設(shè)計(jì)了一種簡(jiǎn)單高效的丟幀重傳機(jī)制來保證通信的可靠性。
根節(jié)點(diǎn)將更新代碼分組發(fā)送給傳感節(jié)點(diǎn),傳感節(jié)點(diǎn)無需每幀都回發(fā)確認(rèn)(ACK)幀,只要最后回發(fā)一幀包含丟幀信息的數(shù)據(jù),根節(jié)點(diǎn)收到該幀重發(fā)丟失的幀數(shù)據(jù)。
傳感節(jié)點(diǎn)判斷丟幀方法:設(shè)置大小為50 B的緩沖區(qū),最多可記錄2萬幀數(shù)據(jù)接收狀態(tài),緩沖區(qū)第1個(gè)字節(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ù)時(shí)相應(yīng)位置1,如表5所示。
4.3 代碼更新
傳感節(jié)點(diǎn)接收到的更新代碼先存放在更新程序區(qū),校驗(yàn)無誤后通過調(diào)用FLASH_ErasePage驅(qū)動(dòng)函數(shù)對(duì)FLASH空間中的用戶程序區(qū)的扇區(qū)進(jìn)行擦除,并讀取更新程序區(qū)的代碼數(shù)據(jù),使用FLASH_Write函數(shù)將其逐扇區(qū)寫入到用戶程序區(qū)。寫入正確后,需重設(shè)主堆棧指針、PC指針跳轉(zhuǎn)實(shí)現(xiàn)程序跳轉(zhuǎn)到更新代碼處執(zhí)行。跳轉(zhuǎn)函數(shù)代碼如下:
5 測(cè)試結(jié)果
對(duì)本文設(shè)計(jì)的無線代碼更新機(jī)制進(jìn)行測(cè)試實(shí)驗(yàn),實(shí)驗(yàn)使用3個(gè)ID,設(shè)為1,2,3的無線傳感節(jié)點(diǎn),通過2種更新場(chǎng)景進(jìn)行實(shí)驗(yàn),測(cè)試代碼更新的時(shí)間開銷、實(shí)時(shí)性及可靠性。更新1,在main函數(shù)中,使用Light_Init函數(shù)對(duì)小燈進(jìn)行初始化;更新2,在main函數(shù)中,增加UART_Init函數(shù)對(duì)串口進(jìn)行初始化,開串口中斷,增加串口的中斷服務(wù)例程。測(cè)試更新時(shí)間方法為設(shè)置傳感節(jié)點(diǎn)一引腳為低電平,在Bootloader開始時(shí)將其拉高,結(jié)束時(shí)將其拉低,用示波器觀察高電平持續(xù)的時(shí)間即為代碼更新的時(shí)間。每種更新實(shí)驗(yàn)進(jìn)行3組,每組重復(fù)5次,取平均時(shí)間為實(shí)驗(yàn)結(jié)果,測(cè)試結(jié)果如表6所示。
測(cè)試更新效果方法為:更新1中觀察小燈亮暗變化;更新2中通過串口線查看打印出的消息是否正確,串口發(fā)送數(shù)據(jù)查看進(jìn)入中斷服務(wù)例程是否正確。測(cè)試結(jié)果:更新1中小燈閃爍情況與程序中設(shè)計(jì)一樣;更新2中串口打印正常,可正常進(jìn)入中斷服務(wù)例程。同時(shí),也對(duì)不同距離無線更新的可靠性進(jìn)行測(cè)試,測(cè)試方法為調(diào)整根節(jié)點(diǎn)和無線傳感節(jié)點(diǎn)間的距離,更新20次,查看PC機(jī)軟件顯示的重傳幀數(shù),如表7所示。
6 結(jié) 語
本文設(shè)計(jì)的無線代碼更新機(jī)制運(yùn)用了串口與無線射頻相結(jié)合的通信技術(shù),設(shè)計(jì)了Bootloader、丟幀重傳機(jī)制等可實(shí)現(xiàn)一點(diǎn)對(duì)多點(diǎn)的無線傳感節(jié)點(diǎn)程序更新。與傳統(tǒng)的在線燒寫程序相比,簡(jiǎn)單方便、實(shí)時(shí)性強(qiáng);與傳統(tǒng)的無線更新系統(tǒng)相比,研發(fā)周期短、成本低、更新速度快。整套系統(tǒng)具有極強(qiáng)的可移植性與通用性。目前,該方案已成功應(yīng)用于無線LED控制系統(tǒng)中,經(jīng)測(cè)試表明,該機(jī)制穩(wěn)定可靠、可成功實(shí)現(xiàn)空曠情況下200 m內(nèi)的無線代碼更新。
參考文獻(xiàn)
[1] 況曉輝,許飛,劉麗.無線傳感器網(wǎng)絡(luò)遠(yuǎn)程代碼更新技術(shù)研究進(jìn)展[J].計(jì)算機(jī)科學(xué),2013,40(6A):255?261.
[2] 吳曉,杜鵬雷,江涌,等.無線傳感網(wǎng)中代碼更新機(jī)制的研究與設(shè)計(jì)[J].計(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ù)的實(shí)現(xiàn)[J].工業(yè)控制計(jì)算機(jī),2012,25(12):97?98.
[5] 王宜懷,朱仕浪,郭蕓.嵌入式技術(shù)基礎(chǔ)與實(shí)踐[M].3版.北京:清華大學(xué)出版社,2013.
[6] 蘭婧,朱怡安,袁磊.基于PXA270嵌入式系統(tǒng)的Bootloader研究與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(21):4881?4883.
[7] 石晶,王宜懷,蘇勇,等.基于ARM Cortex?M4的MQX中斷機(jī)制分析與中斷程序框架設(shè)計(jì)[J].計(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.