一种无线代码可靠更新系统的研究与设计

2016-03-15 19:47陈瑞杰王宜怀李会
现代电子技术 2016年4期

陈瑞杰 王宜怀 李会

摘 要:传感节点投入运行后,遇到软件错误或功能升级都需要更新节点的程序,但是传统的现场烧写方式比较繁琐。为了解决该问题,以ARM Cortex M0+内核的MKW01Z128无线射频芯片为基础,设计了一套成本低、实时性好、可靠性高的无线代码更新系统。该系统采用串口和无线射频相结合的通信技术,对片上FLASH进行合理划分,设计了Bootloader对传感节点程序进行代码更新,同时增加了通信帧格式和丢帧重传机制来确保数据传输的可靠性。对更新系统的性能进行了测试,测试结果表明该系统能可靠地实现空旷环境下200 m内的无线代码更新,具有较好的应用前景。

关键词: MKW01Z128; 无线代码更新; Bootloader; 丢帧重传; 可靠更新系统

中图分类号: TN925+.92 文献标识码: 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 引 言

随着物联网技术的快速发展,在无线传感器网络等领域,无线代码更新技术愈发显得必不可少[1]。传感节点投入运行后,难免会出现软件错误或要进行程序升级,此时在线升级需要大量的人力、物力,比较麻烦。而且传统的远程代码更新系统涉及GPRS、ZigBee、以太网等多种技术[2?3],设计周期长、研发成本高、代码更新的时间较长。对于很多近距离的无线传感节点程序更新来说,例如LED屏控制芯片的程序更新、水质监测芯片的程序更新等,简单、高效、可靠的近距离无线代码更新系统显得格外重要。基于此,本文深入剖析机器码格式、Bootloader机制、数据传输丢帧等技术要点,在基于ARM Cortex M0+内核的MKW01Z128芯片的无线传感节点上设计了Bootloader。无线接收到的代码先存放于更新程序区,丢帧重传机制确保数据的准确接收,最后在接收到代码更新指令后将存储到更新程序区中代码复制到MCU FLASH的指定位置,并通过PC指针跳转来实现代码更新。

1 系统介绍

本文搭建了一套集串口和无线射频等技术为一体的无线代码可靠更新系统。该系统通过PC机上位机软件实现一点对多点地更新空旷情况下200 m内的无线传感节点程序,系统组成如图1所示。这里,无线代码更新需关注的是PC机上位机软件、传感节点端的Bootloader、PC机与根节点的通信、根节点与传感节点的通信等细节。更新程序流程为:PC机上位机软件解析待更新程序的机器码(.HEX文件),提取出有效数据通过串口发送根节点,根节点对数据进行适当处理后存入片上FLASH中。当接收到上位机的更新代码命令后,根节点读取FLASH内容,通过无线射频技术将数据发送给无线传感器节点,无线传感器节点校验接收正确后更新代码。

本系统中,根节点和无线传感节点都采用KW01芯片。该芯片是飞思卡尔公司2013年推出的基于ARM Cortex M0+内核、运行速率为48 MHz的低功耗无线射频芯片。芯片内部集成了Freescale公司的KL26芯片(控制芯片,M0+内核)和Semtech公司的SX1233芯片(无线收发器),拥有128 KB的FLASH(ROM),16 KB的RAM,可实现200 m内数据的无线收发。

2 PC端软件设计方案

PC机代码更新软件主要功能为提取机器码(.HEX文件)中有效数据,组帧后通过串口发送给根节点。下面主要分析.HEX文件记录格式,给出提取有效数据的方法及过程。

2.1 .HEX文件介绍

.HEX(Intel HEX)文件[4]是由一行行符合Intel HEX文件格式的文本构成的ASCII文本文件。.HEX文件以行为单位,每一行是一个HEX记录,由十六进制数的机器码或数据常量组成。.HEX文件经常被用于将程序或数据传输存储到ROM,EPROM;大多数编程器和模拟器使用.HEX文件。每行HEX记录由6个部分组成[5],如表1所示。

2.2 .HEX文件有效数据提取

.HEX文件有效数据提取的流程图如图2所示。将提取.HEX文件中的所有类型为00记录的有效数据、数据内容存储在image.data[ ]数组中,在相同下标的image.flag[ ]数组中标记其是否为有效数据(1为有效;0为无效),其中数组下标为数据在主控芯片FLASH中的地址即.HEX记录中的地址段。此外,用户代码中不可避免地会出现程序跳转,.HEX文件中的地址会出现跳变,而被跳过的地址中存储的内容是无意义的,故给其赋值0xFF,但在代码更新时仍将其作为有效数据进行传输以简化传输过程。

3 传感节点端Bootloader设计

对于嵌入式系统,Bootloader是指系统启动后运行在用户应用程序之前的一段代码,用来初始化硬件设备、建立内存空间映射图,为调用用户应用程序准备好正确的环境[6]。Bootloader的设计对程序代码的更新至关重要,主要包括中断向量表重定位和链接文件中内存设计。

3.1 中断向量表重定位

中断向量表是按照中断源的中断向量号顺序存放中断服务程序入口地址的一段存储区域[7]。程序执行的第一条指令的地址以中断向量的形式给出,因此重定位中断向量表是设计Bootloader的第一步。如图3所示为中断向量表重定位示意图。

图3中左边为芯片存储空间映像[8?9],中间图将芯片的FLASH区划分为三个部分:Bootloader区、用户程序区和更新程序区。Bootloader区包括Bootloader代码和中断向量表,用户程序区包括用户代码和中断向量表,更新程序区用来临时存放接收到的待更新程序。更新的代码先放入更新程序区,待更新完毕校验成功后,覆盖到用户程序区,最后通过PC指针跳转,转入用户程序区执行程序。

Bootloader的中断向量表起始地址为0x00000000,Cortex M0+内核机制中,复位时,MCU读取向量表的前2个字(前8 B),第一个字为MSP的初始值,第二个字为复位向量(即程序执行的起始地址),程序执行从复位向量处开始[10]。

在这里,中断向量表重定位指的是将本处于0x00000000地址处用户应用程序的中断向量表搬运到用户程序区的起始地址0x00008000处。事实表明,用户应用程序与中断向量表重定位后的用户应用程序的代码完全一致,区别只是代码在FLASH中的存储位置不同,它们之间的转换公式为:

重定位后的用户代码=0x00008000+用户代码

同时,0x00008000也是中断向量表起始地址寄存器SCB?>VTOR中定义的中断向量表的起始地址。

3.2 链接文件中内存设计

链接文件提供了在链接过程中所需要的参数信息。在整个链接过程中,代码和数据的基本单位是“段”。用户将不同属性的内容放入不同的段中,链接器识别这些段,按照用户指定将各个段放入相应的存储单元中,完成链接。

此处,需根据FLASH区的划分对传感器节点Bootloader和应用程序的链接文件进行合理设计。

Bootloader的中断向量表从FLASH的起始地址(0x00000000)开始存放,ROM的起始地址为0x00000410。因为该Bootloader代码量小于32 KB,故其在FLASH中的结束地址小于0x00008000。因此,将应用程序的中断向量表从0x00008000开始存放是可行的,此时应用程序从FLASH的0x00008410地址处开始存放。这样通过对链接文件中内存的划分,Bootloader与应用程序就能合理地分布在MCU的FLASH中。

4 通信及代码更新

4.1 PC机与根节点通信

PC机程序要将更新代码通过串口线发送给根节点,再通过根节点将更新代码发送给某个无线传感节点。为了确保通信数据的准确性,本文设计了PC机与根节点间的通信帧格式。

4.1.1 通信帧格式

PC机程序的帧格式需与根节点的帧格式一致,本文制定了通用的命令帧格式如表4所示,基于通用命令帧格式设计了应用信息预处理帧、代码帧、应答帧、校验帧和更新帧五种帧。

应用信息预处理帧(AppInfoMsg):传送有效代码字节数和包号以供无线传感节点接收与校验,命令字为CMD_APP_INFO,6~9 B为有效代码总字节数,10~11 B为更新代码总包号。

代码帧(AppTransDataMsg):传输烧入到FLASH中的更新代码,命令字为CMD_TRANS_DATA,6~7 B为包号,8~n-3 B为有效代码总字节数。

应答帧(Response):传送应答信息,命令字为CMD_RESPONSE,6~9 B为当前帧包号。

校验帧(AppVerificationMsg):用于保证数据传输的正确性,命令字为CMD_VERIFICATION,6~9 B为有效代码总字节数。

更新帧(AppUpdateMsg):“通知”根节点开始发送更新代码给某个具体的传感节点,启动代码更新,命令字为CMD_UPDATE,6~7 B为更新节点的编号,最多可更新65 536(216)个传感节点,8~11 B为有效代码总字节数。

4.1.2 通信流程

根节点FLASH的扇区大小为1 024 B,加上帧头、帧长等字节,因此本文设计的代码帧长n为1 033 B。其中,代码帧的帧数等于PC机软件解析出的.HEX有效数据总字节数除以扇区大小为1 024 B。PC机与根节点通信步骤如下:

(1) PC机首先发送AppInfoMsg帧,该帧将代码的总字节数和总包数传递给根节点并由根节点写入片上FLASH指定位置处,以供校验帧校验时使用。根节点返回Response帧,若该帧出错则重发AppInfoMsg帧。

(2) PC机发送AppTransDataMsg帧,根节点根据该帧的校验码校验该帧,若正确则写入FLASH相应地址处;若出错,则返回当前应接收帧的包号以要求PC机重发该帧。此外,若PC机收不到应答帧则重发该帧,该过程持续到代码帧正确发送完毕。

(3) PC机发送AppVerificationMsg帧,该帧在代码帧发送完毕后发送,其记录了所有代码的32 b累加校验和,若从FLASH中读取的所有代码帧的32 b累加校验和与此相等,则校验成功,否则由应答帧携带出错信息,请求PC机重发该帧。此外,若PC机收不到该帧的应答帧则重发该帧。

(4) PC机发送AppUpdateMsg帧,根节点读取出FLASH中的数据发送给某个具体的传感节点,传感节点接收代码验证无误后更新程序。

前3步执行完,更新代码已正确存储于根节点的FLASH中,断电不会丢失,此时只需在PC机软件上写入相应编号(或编号范围)执行第(4)步即可完成代码更新。若要对不同编号的传感节点更新相同的代码,只需执行第(4)步即可,这样就无需PC软件每次发送机器码给根节点,提高了代码更新的速度。

4.2 根节点与传感节点通信

当PC机发送更新帧时,根节点需要通过无线射频技术向传感节点发送更新代码,但传感节点不能保证数据100%的接收,故本文设计了一种简单高效的丢帧重传机制来保证通信的可靠性。

根节点将更新代码分组发送给传感节点,传感节点无需每帧都回发确认(ACK)帧,只要最后回发一帧包含丢帧信息的数据,根节点收到该帧重发丢失的帧数据。

传感节点判断丢帧方法:设置大小为50 B的缓冲区,最多可记录2万帧数据接收状态,缓冲区第1个字节的第7位flag_buf[0].7代表第1帧数据,flag_buf[0].6代表第2帧数据,flag_buf[0].0代表第8帧数据,以此类推。缓冲区初始化为0,成功接收到该帧数据时相应位置1,如表5所示。

4.3 代码更新

传感节点接收到的更新代码先存放在更新程序区,校验无误后通过调用FLASH_ErasePage驱动函数对FLASH空间中的用户程序区的扇区进行擦除,并读取更新程序区的代码数据,使用FLASH_Write函数将其逐扇区写入到用户程序区。写入正确后,需重设主堆栈指针、PC指针跳转实现程序跳转到更新代码处执行。跳转函数代码如下:

5 测试结果

对本文设计的无线代码更新机制进行测试实验,实验使用3个ID,设为1,2,3的无线传感节点,通过2种更新场景进行实验,测试代码更新的时间开销、实时性及可靠性。更新1,在main函数中,使用Light_Init函数对小灯进行初始化;更新2,在main函数中,增加UART_Init函数对串口进行初始化,开串口中断,增加串口的中断服务例程。测试更新时间方法为设置传感节点一引脚为低电平,在Bootloader开始时将其拉高,结束时将其拉低,用示波器观察高电平持续的时间即为代码更新的时间。每种更新实验进行3组,每组重复5次,取平均时间为实验结果,测试结果如表6所示。

测试更新效果方法为:更新1中观察小灯亮暗变化;更新2中通过串口线查看打印出的消息是否正确,串口发送数据查看进入中断服务例程是否正确。测试结果:更新1中小灯闪烁情况与程序中设计一样;更新2中串口打印正常,可正常进入中断服务例程。同时,也对不同距离无线更新的可靠性进行测试,测试方法为调整根节点和无线传感节点间的距离,更新20次,查看PC机软件显示的重传帧数,如表7所示。

6 结 语

本文设计的无线代码更新机制运用了串口与无线射频相结合的通信技术,设计了Bootloader、丢帧重传机制等可实现一点对多点的无线传感节点程序更新。与传统的在线烧写程序相比,简单方便、实时性强;与传统的无线更新系统相比,研发周期短、成本低、更新速度快。整套系统具有极强的可移植性与通用性。目前,该方案已成功应用于无线LED控制系统中,经测试表明,该机制稳定可靠、可成功实现空旷情况下200 m内的无线代码更新。

参考文献

[1] 况晓辉,许飞,刘丽.无线传感器网络远程代码更新技术研究进展[J].计算机科学,2013,40(6A):255?261.

[2] 吴晓,杜鹏雷,江涌,等.无线传感网中代码更新机制的研究与设计[J].计算机应用,2010(4):857?859.

[3] 彭燕.基于ZigBee的无线传感器网络研究[J].现代电子技术,2011,34(5):49?51.

[4] 黄海宝,吴学杰,高艳艳.基于STM32F103局域网远程更新技术的实现[J].工业控制计算机,2012,25(12):97?98.

[5] 王宜怀,朱仕浪,郭芸.嵌入式技术基础与实践[M].3版.北京:清华大学出版社,2013.

[6] 兰婧,朱怡安,袁磊.基于PXA270嵌入式系统的Bootloader研究与实现[J].计算机工程与设计,2009,30(21):4881?4883.

[7] 石晶,王宜怀,苏勇,等.基于ARM Cortex?M4的MQX中断机制分析与中断程序框架设计[J].计算机科学,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权威指南[M].吴常玉,魏军,译.北京:清华大学出版社,2013.