数据无损的远程代码更新的设计与研究
2015-12-20顾会光王宜怀史新峰
顾会光,王宜怀,史新峰
(苏州大学 计算机科学与技术学院,江苏 苏州215006)
0 引 言
在科学研究等领域,有些数据极其珍贵,丢失2分钟、3分钟内采集的数据也变得无法容忍,这对无线远程代码更新机制带来了新的挑战。然而现存的技术受网络质量、环境的影响或多或少的存在代码更新延迟,更有甚者代码更新失败,这不可避免造成了大量的数据丢失。基于此,本文提出一种“数据无损”的无线远程代码更新机制,该机制大大缩减代码更新所需时间,可实现2HZ以下数据的无损采集。
1 系统介绍
1.1 系统构成
本文搭建的系统结合了GPRS和ZigBee技术,并在无线传感器网络中得到了实际应用。如图1所示的无线传感器网络中,无线传感器节点内置ZigBee模块,将采集到的温度、湿度等模拟量量化为数字值通过ZigBee技术传送到网关节点,网关节点将接收到的数据进行融合后通过GPRS技术传送到服务器,这样,监控端PC 就可以连接服务器实时监测到远程的数据了。这里,远程代码更新[1]关注的是服务器端上位机软件与网关节点端的下位机bootloader。网关节点接收上位机发送过来的有效代码,进行适当处理后存入SD 卡中,当接收到上位机的更新代码命令后读取SD 卡内容更新代码。
1.2 网关节点硬件构成
如图2所示,网关节点的控制芯片K60DN512Z与Zig-Bee模块和MG323模块[2](华为GPRS模块)通过串口相连,MG323模块与SIM 卡模块相连。ZigBee模块与控制芯片也通过串口连接,其定时将各传感器采集到的数据组帧后通过串口发送给控制芯片。GPRS模块接收到的代码段通过串口发送给控制芯片,控制芯片处理该代码段,若无误则存入SD 卡的指定位置,当接收到所有的代码段后若接收到更新命令,则设置堆栈指针后代码跳转到pc指针所指向的bootloader代码处,由bootloader负责将SD 卡中的代码取出,放入控制芯片用户应用程序处,完成代码更新。
图1 系统组成
图2 网关节点硬件构成
该网关节点中,MG323 模块工作温度为-30℃~+75℃,电源电压为3.3V~4.8V (推荐值3.8V),平均待机电流<3.0 mA,支持GSM 标准AT 命令,可设置串口透明传输模式 (串口波特率115200bit/s)。K60DN512Z芯片的电压范围为1.71 V~3.6 V,工作温度为-40℃~+105℃,64KB RAM,512KB FLASH,工作时钟频率为100 MHZ。这两者之间通过串口连接,控制芯片的PTB1连接MG323的开关机引脚,PTB2连接MG323的复位引脚。
2 服务器端代码更新软件设计方案
服务器端代码更新软件主要负责可执行文件的有效代码的提取和以交互通信的方式把要更新的代码准确无误的传输给网关节点。
2.1 S19文件介绍
S19文件[3](S-record格式文件)是freescale编译器生成的机器码文件。其由若干行S 记录构成,每行记录以CR/LF/NUL结尾。一行S记录有5个部分组成,见表1。
S19文件共有9种记录类型S0~S9。S0为程序开始记录,不包含有效代码,无需写入Flash。S1~S3 分别为8位、16位和32位MCU 所对应的S记录格式,包含了机器码文件所有的代码,必须无差错的写入由地址字段指定地址处的Flash中。S5记录计数S1、S2、S3记录。
S7、S8、S9分别为S3、S2、S1记录的结束记录。本文所采用的芯片为32位的MCU,因此代码部分存储在S3记录中。
2.2 S19文件有效代码提取
这里我们将提取S19 文件中的所有S3 记录的有效代码,图3中以其在控制芯片Flash中的地址为下标,值为内容存储在bootimage.d[]数组中,并在相同下标的boot.image.f[]数组中标记其是否为有效代码 (1:有效,0:无效)。此外,在用户代码中不可避免的会出现程序的跳转,因此映像文件中的地址会出现跳变,而被跳过的地址中存储的内容是无意义的,因此给其赋值0xff,但是在代码更新的时候将其作为有效代码进行传输并烧写到相应的地址处以简化传输过程。
表1 S记录格式
图3 S19文件有效代码提取
3 控制芯片端代码更新设计方案
控制芯片端主要包括bootloader设计、应用程序中代码帧处理与GPRS模块的设置。
3.1 bootloader设计
bootloader是指系统启动后,运行在用户应用程序之前的一段代码,用其来初始化硬件设备、建立内存空间映射图,为调用用户应用程序准备好正确的环境。传统的远程代码更新bootloader机制依托于具体的通信接口。而本文设计的bootloader因采用代码接收与代码更新分离机制,故无此限制,但是需要用户应用程序中通信手段 (本方案采用GPRS通信)的支持。
3.1.1 向量表重定位
中断向量是中断源的识别标志,可用来存放中断服务程序的入口地址或跳转到中断服务程序的入口地址。程序执行的第一条指令的地址也以中断向量的形式给出,因此重定位中断向量表是设计bootloader的第一步。中断向量表重定位[4]如图4所示。
图4 中断向量表重定位
图4中最左边为芯片存储空间映像[5,6],中间图将芯片Flash区划分为bootloader代码区和用户代码区,bootloader代码区包括bootloader代码和中断向量表,同样的用户代码区包括用户代码和中断向量表。其中bootloader的中断向量表默认处于0×0000_0000地址处,Cortex M4内核机制使MCU 开机查找该向量表并取出应用程序的入口地址进行执行。传统的bootloader机制是开机即运行bootloader代码,在预定的时间内若没有接收到代码更新命令则跳转到用户应用程序中执行,而本文设计的bootloader机制将代码接收与代码更新区别开来,即由用户应用程序接收代码帧并存储在SD 卡指定位置处,并在接收到代码更新命令后,跳转到bootloader代码处,由bootloader负责将SD 卡中的代码拷贝到MCU Flash的相应地址处,并将指针跳转到用户代码的入口地址处进行执行。这样就完成可代码更新操作。在这里,向量表重定位指得就是用户应用程序中本处于0×0000_0000地址处的中断向量表搬运到用户代码区所示的0×0000_8000 地址处。事实表明,用户应用程序与中断向量表重定位后的用户应用程序的代码完全一致,区别只是代码在Flash中的存储位置不同,它们之间的转换公式为:用户代码=0×0000_8000+重定位后的用户代码。其中0×0000_8000是Flash区划分的依据,也是中断向量表起始地址寄存器SCB->VTOR 中定义的中断向量表的起始地址。
3.1.2 链接文件中内存设计
网关节点采用的K60DN512Z 芯片的RAM 为64 KB,Flash为512KB,在链接文件中对bootloader和APP 应用程序的存储空间进行划分[7]。
bootloader代码区Flash划分如下:
#定义中断向量表起始地址为0×00000000,分配空间为0×00000400B
vectorrom (RX):ORIGIN=0×00000000,LENGTH=0×00000400
#定义Flash配置域起始地址为0×00000400,分配空间为0×00000020B
cfmprotrom (R):ORIGIN=0×00000400,LENGTH=0×00000020
#定义rom 区 起始地址为0×00000420,分配空间为0×0007FBE0B
rom (RX):ORIGIN=0×00000420,LENGTH=0×0007FBE0#Code+Const data
#定义ram 区 起始地址为0×1FFF0000,分配空间为0×00020000B
ram (RW):ORIGIN=0×1FFF0000,LENGTH=0×00020000#SRAM-RW data
用户应用程序代码区Flash划分如下:
#定义中断向量表起始地址为0×00008000,分配空间为0×00000400B
由巴丹吉林单站散度场垂直分布图可见(见图6),6月4日08:00 700~500 hPa为辐合,强度为-13×10-5/s,200 hPa辐散中心,强度为20×10-5/s,高层辐散强于低层辐合,表明高层辐散形成的抽吸作用十分明显。6月4日20:00,300 hPa以下均为辐散,中低层辐合,可见低层的辐合和对流上升运动明显。
vectorrom (RX):ORIGIN=0×00008000,LENGTH=0×00000400
#定义Flash配置域起始地址为0×00008400,分配空间为0×00000020B
cfmprotrom (R):ORIGIN=0×00008400,LENGTH=0×00000020
#定义rom 区 起始地址为0×00008420,分配空间为0×0007FBE0B
rom (RX):ORIGIN=0×00008420,LENGTH=0×0007CBE0#Code+Const data
#定义ram 区 起始地址为0×1FFF0000,分配空间为0×00020000B
ram (RW):ORIGIN=0×1FFF0000,LENGTH=0×00020000#SRAM-RW data
bootloader中断向量表处于Flash 的零地址处,ROM起始地址处于0×00000420处,因为该bootloader代码量小于32KB,故其在Flash中的结束地址小于0×00008000。由此可知在应用程序中将中断向量表安排在0×00008000处是合适的,此时应用程序在Flash的0×00008420地址处开始存放。这样通过链接文件的划分就能将bootloader与应用程序代码合理地安排在MCU 的Flash中。
该步骤中从GPRS模块接收过来的代码已按照格式正确的存入SD 卡。该方案中并未使用文件系统,为了操作方便自定义了一个极其简单的文件记录格式,如图5所示。
图5 SD 卡记录格式
InitSection记录了初始存储代码的扇区号,即所有的代码均从这一扇区开始存储,此字段一经定义就无需改变。NowSecton记录了当前正在使用的扇区号,即代码从Init-Section扇区号开始存储到NowSection扇区结束,每存储一帧代码均需更新该字段,NowSectionByes记录了当前扇区已用字节数,即作为当前扇区存储下一帧的起始地址,也需要即时更新该字段。Fcs为初始扇区号、当前正在使用的扇区号和当前扇区已用字节数的32位累加和,用来确保该记录格式的准确。由于在代码接收阶段已经确保了SD 卡内代码的准确性,此处直接按照记录格式将代码拷贝到相应的Flash处并设置堆栈并跳转PC指针即可。
3.2 用户应用程序中GPRS模块设置
GPRS是一种基于GSM 系统的无线分组交换技术,可用于客户端与具有公网IP地址的服务器进行TCP/IP通信,其通信速度可达115k/s。本文采用基于GPRS 的华为MG323模块,其内嵌TCP/IP 协议栈,可以很好的实现网关节点与万维网的通信,以便通过网页等PC 方APP 程序对网关节点实施控制。
本文采用AT 命令控制来实现GPRS 的透明传输[8](传输过程对用户透明,此处是指串口与网口互发数据)。
透明传输的初始化AT 命令如下 (以下各指令设置成功均返回OK):
经过以上设置可以开启MG323模块的透明传输功能。此时,网络数据即转化成了串口数据,因此,本方案的bootoader更新转化为基于串口的bootloader更新机制。
3.3 服务器端与控制芯片端通信帧格式定义
用户应用程序中的帧格式必须与服务器端软件的帧格式[9,10]一致,此处我们对其进行定义。该方案主要由通用命令帧、应用信息预处理帧、代码帧、返回帧、校验帧和更新帧。通用命令帧是载体,内嵌其余5 种帧。应用信息预处理帧传送有效代码字节数和包号以供控制芯片接收与校验;代码帧传输烧入到Flash中的实际内容;校验帧用于保证代码传输的正确性;更新帧启动控制芯片端代码更新。
(1)通用命令帧COMMON 格式
n-3 n-2 n-1 N数值 0xff 0xff 保留 (0) 长度高字节 长度低字节 命令字 数据内容 校验和字节 0 1 2 3~4 5 6~0xff 0xfe
此帧为通用帧,其它各帧内嵌在第5~n-3字节中,其中第5字节为各帧的命令字,6~n-3字节为各帧的具体内容,n-2字节为各帧有效代码的累加和校验。
(2)应用信息预处理帧 (ProcessAppInfoMsg)格式
此帧在通用命令帧COMMON中的各字节说明如下:3~4字节为帧长,第5字节为命令字CMD_APP_INFO,6~9字节为有效代码总字节数,10~11字节为更新代码总包号。
(3)代码帧 (ProcessTransDataMsg)格式
此帧在通用命令帧COMMON 中的各字节说明如下:3~4字节为帧长,第5字节为命令字CMD_TRANS_DATA,6~7字节为包号,8~n-3字节为有效代码总字节数。
(4)返回帧 (ProcessSendResponse)格式
此帧在通用命令帧COMMON 中的各字节说明如下:3~4字节为帧长,第5 字节为命令字CMD_RESPONSE,6~9字节当前帧包号。
(5)校验帧 (ProcessAppVerificationMsg)格式
此帧在通用命令帧COMMON 中的各字节说明如下:3~4字节为帧长,第5 字节为命令字CMD_VERIFICATION,6~9字节为有效代码总字节数。
(6)更新帧 (ProcessAppUpdateMsg)格式
此帧在通用命令帧COMMON 中的各字节说明如下:3~4字节为帧长,第5 字节为命令字CMD_UPDATE,6~9字节为有效代码总字节数。
4 控制芯片与服务器端通信控制
如图6所示,服务器端代码更新软件内嵌于服务器端应用程序中。结合考虑GPRS的慢速数据传输能力、SD 卡读写能力和控制芯片的处理能力,该方案设计的代码帧长为512字节。因此,需将代码拆分为若干包进行发送。代码更新步骤如下:
(1)服务器端首先发送ProcessAppInfoMsg帧,该帧将代码的总字节数和总包数传递给控制器并由控制器写入SD卡指定位置处中,以供校验帧校验时使用。控制器返回ProcessSendResponse帧,若该帧出错则重发ProcessAppInfoMsg帧。
(2)服务器端发送ProcessTransDataMsg帧,控制器端根据该帧的校验码校验该帧,若正确则根据SD 卡的记录格式将代码写入SD 卡相应地址处;若出错,则返回当前应接受帧的包号以要求服务器重发该帧。此外,若服务器收不到返回帧则重发该帧,该过程持续到第n帧发送结束。
图6 服务器与控制芯片通信控制
(3)服务器端发送ProcessAppVerificationMsg 帧,该帧在代码帧发送完毕后发送,其记录了所有代码的32位累加校验和,若从SD 卡中读取的所有代码帧的32位累加校验和与此相等,则校验成功,否则由返回帧携带出错信息,请求服务器重发该帧。此外,若服务器收不到该帧的返回帧则重发该帧。
(4)服务器端发送ProcessAppUpdateMsg帧,用户应用程序接收到该帧则程序跳转到bootloader处,由bootloader完成代码更新操作。
5 测试结果分析
本文对bootloader数据无损代码更新方案与常规代码更新方案在屏蔽数据采集时间上进行了比较。常规代码更新方案屏蔽数据采集的时间即程序在bootloader中运行的时间。测试方法为:上位机软件设置一个定时器,显示bootloader开始到接收到bootloader更新成功帧所需的时间。无损代码更新方案屏蔽数据采集的时间即bootloader从SD 卡中拷贝代码至Flash所花费的时间。测试方法为:控制器端给指定引脚一个低电平,在bootloader开始时将其拉高,结束时将其拉低,用示波器观察得到的高电平持续时间即为所需测量的时间。以300KB 的s19文件为例。在一天不同的时间段测试的各数据如下所示:每个数据均为当前时间测量的5次数据的平均值。
由表2可知采用无损代码更新方案屏蔽数据采集的时间仅为常规代码更新方案的1/40,因此极大的避免了在代码更新过程中丢失采集到的数据。实际应用结果表明:该无损代码更新可做到2HZ数据采集频率下无损采集数据。
表2 无损代码与常规代码屏蔽数据采集时间的比较
6 结束语
传统的无线远程代码更新系统大多依托于操作系统,凭借操作系统自带的bootloader进行代码更新,用户很难制定自己的bootloader,也就无法控制远程代码更新的时间,不可避免的会丢失大量的采集数据。本文设计的无损代码更新方案不基于操作系统,将代码接收放在用户应用程序中完成,而bootloader只负责读取SD 卡的内容来完成代码更新。这样做带来了以下两个优点:①将代码更新时间由GPRS的低速传输转移到SD 卡的高速传输上来,极大的缩减了代码更新过程中屏蔽数据采集的时间;②由于bootloader只涉及SD 卡相关操作,屏蔽了具体的通信方式,因此,具有极强的可移植性与通用性。缺点是:代码更新依托于用户应用程序的通信机制,需将相关代码嵌入到用户应用程序中。目前,该方案已成功应用于苏州华祥信息科技有限公司的无线照明控制系统中,经实验结果表明,该方案稳定可靠、可成功实现2HZ以下数据采集无损的远程代码更新。
[1]WU Xiao.Research and design of code updating mechanism in wireless sensor networks [J].Computer Applications,2010,30 (4):857-859 (in Chinese).[吴晓.无线传感网中代码更新机制 的 研 究 与 设 计 [J].计 算 机 应 用,2010,30 (4):857-859.]
[2]The guide of HUA WEI MG323GSM M2M module hardware_REV [1.0][DB/OL].[2010-05-24].http://www.huawei.com(in Chinese).[HUA WEI MG323GSM M2M 模块硬件指南 REV [1.0][DB/OL].[2010-05-24].http://www.huawei.com.]
[3]WANG Chaoyi,CHANG Sai,WANG Yihuai.The development of download software of Freescale’s S08series machine code file[J].Computer Applications and Software,2011,28(12):256-258 (in Chinese).[王超艺,常赛,王宜怀.飞思卡尔S08系列机器码文件下载软件的开发 [J].计算机应用与软件,2011,28 (12):256-258.]
[4]HCS08boot loader to update multiple devices_REV [0][DB/OL].[2013-10-04].http://www.freescale.com.
[5]ARMv6-M architecture reference manual[DB/OL].[2013-04-18].http://www.arm.com.
[6]M0+user guide [DB/OL].[2013-04-15].http://www.arm.com.
[7]WANG Yihuai,WU Jin,JIANG Yinzhen.Principle and practice of embedded system [M].Beijing:Publishing House of Electronics Industry,2012:65-72 (in Chinese).[王宜怀,吴瑾,蒋银珍.嵌入式系统原理与实践 [M].北京:电子工业大学出版社,2012:65-72.]
[8]The guide of HUA WEI MG323GSM M2M module software_REV [1.0][DB/OL].[2010-05-24].http://www.huawei.com(in Chinese).[HUA WEI MG323GSM M2M 模块软件指南 REV [1.0][DB/OL].[2010-05-24].http://www.huawei.com.]
[9]LI Yu,WAN Lihua,WANG Huaiyu.Design and implementation of BOOTLOADER based on serial[J].Information and Communication,2013,27 (6):57-58 (in Chinese). [李渔,万礼华,王怀翊.基于串口的BOOTLOADER 设计与实现[J].信息通信,2013,27 (6):57-58.]
[10]DENG Hubin,LI Jian.The design and implementation of ZigBee network routing protocol of SS-Cluster[J].Computer Engineering and Design,2014,35 (7):2289-2294 (in Chinese).[邓胡滨,李健.ZigBee网络路由协议SS-Cluster的设计 实 现 [J].计 算 机 工 程 与 设 计,2014,35 (7):2289-2294.]