嵌入式终端串口更新技术研究
2019-09-19
(苏州大学 计算机科学与技术学院,江苏 苏州 215006)
随着人工智能的进一步发展,数据的价值变得弥足珍贵。万物互联的时代即将来临,物联网正在引发第四次工业革命,各种物联网创新应用也在不断涌现[1]。嵌入式设备作为物联网技术的重要物理载体,其功能的稳定性和适应性面临着巨大挑战,随之也带来了频繁的程序更新需求。
传统的程序更新操作是通过基于JTAG协议的调试器完成的。JTAG(联合测试工作组)协议是IEEE(电气和电子工程师协会)于1990年对1149.1-1990号文档标准化得到的国际标准测试协议,主要用于芯片内部测试和程序调试[2]。该方法可以很好地提供程序烧录和调试功能,但是有如下缺点:① 需要有调试器支持,价格昂贵;② 传输距离有限;③ 更新过程不可控,若烧录的程序存在问题,设备可能直接死机。
为避免这些缺点,目前主要是利用MCU的Flash存储器在线编程功能[3],采用在BootLoader程序中增加数据通信驱动,并实现数据接收和烧录的功能。BootLoader程序为MCU上电之后运行的一小段程序,可由编程人员自行编写。BootLoader程序中的数据通信方式主要有两种:有线通信和无线通信,无线通信由于脱离了线的束缚,可以做到传输距离更远和密封性更好,但是,由于无线通信存在抗干扰能力弱、信息出错概率大、易遭受拦截和篡改、安全性差和信息传输可能需要付费等缺点,故选择了有线通信作为研究对象。有线通信方式包括:串口通信、SPI通信、I2C通信、CAN通信等。几乎所有的MCU都提供串口通信功能,而且通信速度、容错性、安全性都很好,在搭配了RS485或RS232之后,还可以实现远距离传输。因此,本文提出了一种基于串行通信技术的嵌入式终端程序更新技术。
1 系统框架介绍
提出并实现了一套基于串口通信的远程更新系统,可大大延长更新终端程序的限制距离,而且无需购买专门的调试器。串口更新系统的整体框架主要包括3个部分:终端(UE)、信息邮局(MPO)和上位机管理(HCM),它们的对应关系如图1所示。
图1 串口更新系统框架
本系统的硬件部分为基于KL36芯片自行设计的开发板。KL36芯片为恩智浦公司开发的一款ARM Cortex-M0+内核的微控制器,主频可达48 MHz[4]。软件部分包括终端程序的BootLoader程序和User程序,以及上位机的串口更新程序HCM。
图1中,User程序为用户程序,设备为用户提供的所有功能均在该程序中实现。因此,对用户来说,终端程序更新即为User程序更新。BootLoader程序中包含终端设备的基础硬件驱动,它通过串口接收上位机管理HCM程序发送来的更新数据,并使用Flash存储器在线编程技术覆盖原有的User程序,从而完成串口更新操作。
2 终端程序设计
BootLoader程序为固化在Flash中,是不容更改的程序,向User程序提供最底层、最直接的硬件配置和控制接口,并提供更新User程序的功能。User程序为嵌入式终端的功能程序,负责实现嵌入式终端所需的功能。在存储上,BootLoader和User通过划分存储区域,实现共存。终端的Flash和RAM存储映像如图2所示。
图2 终端Flash和RAM存储映像
2.1 BootLoader程序
MCU上电之后至执行main函数的流程为:在MCU上电之后,芯片内部机制将把Flash中0x00000000~0x00000003地址的4个字节内容赋给内核寄存器SP(堆栈指针),然后把Flash中0x00000004~0x00000007地址的4个字节内容赋给内核寄存器PC(程序计数器)。Flash中0x00000004~0x00000007地址中一般存储启动函数的地址,具体内容查询芯片的启动文件,本系统中的启动文件为“startup_MKL36Z4.S”。至此,PC寄存器中的内容为启动函数地址,因此,MCU会执行启动函数。启动函数中一般将执行如下操作:① 根据设置开关看门狗;② 初始化系统时钟;③ 开启GPIO(通用输入输出)端口时钟门;④ 将Flash中的初始化数据(一般存储在data段)拷贝至RAM中;⑤ 清零未初始化的bss段;⑥ 跳转到main函数或_START函数(_START函数为系统函数,会自动跳转到main函数)。至此,MCU启动完成,并进入了main函数[5]。
由图2可知,MCU上电之后默认执行的程序为BootLoader程序,该程序的执行流程如图3所示。
BootLoader程序首先进行初始化操作,之后将会判断当前Flash中是否已经烧录了User程序。User程序与BootLoader程序在物理上是分开的,BootLoader程序很难判断User程序是否存在并且完整。但是,经过研究发现,可以通过判断User程序的MSP指针(该指针位于程序起始地址的第4~7个字节)是否正确来判断是否有User程序。
若存在User程序,则需要判断User程序是否需要更新。判断是否需要进行程序更新的方法有很多种,如:① 文献[6]和文献[7]提出了重启时等待更新命令一段时间的方法,该方法需要手动重启,且每次上电均需要等待一段时间,既不方便操作,也大大增加了开机时间;② 文献[8]提出了通过读取引脚状态决定是否需要程序更新的方法,该方法需要在更新前设置好引脚状态,不方便应用;③ 文献[9]提出了基于CAN总线的程序升级方法,但CAN总线功能仅部分终端支持,不具有普适性。
图3 BootLoader程序执行流程图
基于对以前文献等资料的总结和实践经验,提出了基于RAM在热复位时数据不丢失特点实现的在线串口更新方法。由图2可知,0x1FFF_F800~0x1FFF_F80B是一段既不属于BootLoader程序又不属于User程序的RAM。因此,在热复位时,该段数据可以保存。当终端UE接收到上位机管理程序HCM更新命令之后,将更新命令写入该段RAM并重启,在重启的时候只需要判断该段RAM中的数据是否为更新命令即可知道是否需要更新程序。
至此,BootLoader程序完成了串口更新所需要的功能。下面将阐述技术的实现方案:终端的外设驱动都已经包含在BootLoader程序的工程中,因此,在烧录BootLoader程序之后,这些驱动将会被存储在终端的Flash中。为了在User程序中可以使用烧录在Flash中的驱动程序,需要在BootLoader程序中将这些驱动的接口(即入口函数)存储在Flash的指定区域中。User程序将从Flash中的该区域将这些驱动的接口读出并转化为函数指针,然后User程序即可通过函数指针使用固化在Flash中的驱动。
2.2 User程序
上电之后,在BootLoader程序处理完相应操作后将会跳转至User程序。跳转方法为:将当前MSP指针更改为User程序的MSP指针,同时将User程序第4~7字节的数据作为函数指针并调用,该操作将使得MCU进入User程序的复位函数中。User程序的执行流程如图4所示。
图4 User程序的执行流程
本系统实现了无需手动重启的嵌入式终端串口更新功能。该功能是在串口中断中实现的,串口中断的服务例程位于BootLoader程序中,通过将中断向量表拷贝至RAM的指定位置,使得User程序中触发串口中断时依然能够进入BootLoader程序区的中断服务例程,从而触发更新操作。
同时,利用函数指针,本系统将终端基础硬件资源的驱动存储在BootLoader程序区中,并对外提供简单的调用方法,达到了降低User程序编程难度和防止驱动被恶意修改的目的。
3 上位机程序设计
在完成终端程序的编码之后,通过编译系统,可以将程序编译生成HEX文件。程序的烧录过程即为解析HEX文件的含义,并将指定的数据写入到终端设备的指定Flash中。这一过程需要由计算机程序完成,即本系统中的上位机管理HCM程序。
HCM程序将HEX文件进行解析,并按照与BootLoader程序约定好的数据帧协议进行组帧,然后将数据逐帧发送至BootLoader程序,由BootLoader程序完成更新User程序的操作。HCM程序主要的执行流程如图5所示。
3.1 HEX文件解析
HEX文件是可以烧写到单片机中,被单片机执行的一种文件格式。HEX文件以行为单位,每行为一条HEX记录,每条记录以冒号开始,共包含6段数据,如表1所示[10]。
3.2 数据帧协议设计
由于通信过程的复杂性,使得数据通信过程中有一定概率造成数据的丢失、错位和错误等情况。数据通信协议是为保证通信双方能够进行有效且可靠的数据通信而制定的一系列约定[11]。本系统采用固定位置的通信协议,即固定位置的数据具有固定的意义。
图5 上位机程序的执行流程
字段长度/B内容开始标记1字符“:”数据长度1数据区字节数偏移量2数据区中数据应存储的空间地址,记录类型为数据记录时有效记录类型100:数据记录;01:文件结束记录;02:扩展段地址;03:开始段地址;04:扩展线性地址;05:链接开始地址数据区n取决于记录类型校验和1除开始标记和校验和之外的所有字段的所有字节之和的补码
为了保证协议的可复用性,本系统将通信协议分为两部分:通用数据帧协议和更新数据帧协议。通用数据帧协议如表2所示。
表2 通用数据帧协议
本协议用于实现上位机管理程序HCM与终端UE之间的数据通信,为了防止数据在传输过程中出现错误导致误操作,在协议中增加了CRC校验(循环冗余校验)来保证数据的完整性。CRC是一种多用于同步通信方式中的差错检出方式。在这种方式中,将所传数据序列看成为高次多项式G(x),将此多项式用预先规定的生成多项式P(x)去除,再将其余数码附加在所传数据的尾部一并传送。在接收方,用同样的生成多项式去除,若除得的结果余数值为零,则说明接收到的数据是正确的[12]。
当command为4时,发送的有效数据为更新数据,其帧协议如表3所示。
表3 更新数据帧协议
更新数据是通过通用数据帧协议进行通信的,即更新数据帧的全部内容为通用数据中的有效数据。
4 实验验证与性能评测
将所设计的串口更新系统应用在KL36硬件平台上,并进行性能评测。本次评测的主要目的是检测所设计系统的可靠性、稳定性和更新速度。为了方便快捷地检测本系统,编写了一套自动烧录1000次的上位机程序,程序界面如图6所示。
上位机管理程序HCM主要有4个功能区,具体功能区的含义如表4所示。
表4 功能区功能表
基于该测试程序做了两项测试:可靠性测试和更新速度测试,具体如下。
(1) 可靠性测试。取3个终端设备(命名为A,B,C)。其中,A放置于室内环境中,B放置于潮湿的环境中,C放置于电磁干扰严重且周围有大功率电器的环境中。分别使用本测试程序和JTAG调试器将User程序烧录至设备。使用的User程序的HEX文件大小为57 KB,被上位机管理程序HCM切割为53帧。记录烧录的成功次数、失败次数和成功率。测试结果如表5所示。
表5 可靠性测试结果
图6 串口更新系统测试程序
由表5可知,本系统的可靠性要优于JTAG调试器。本系统在3个终端设备上烧录1000次,未出现任何失败,而使用JTAG烧录1000次会有烧录失败的情况。由此说明,本系统具有极高的可靠性,这得益于本系统设计的合理性以及多种防错机制的结合。
(2) 更新速度测试。为了评测本系统的更新速度性能,使用JTAG调试器和本系统分别将同一User程序(与可靠性测试使用相同的User程序)烧录至同一终端设备,并记录烧录使用的时间。测试结果如表6所示。
表6 更新速度测试结果
由表6可知,JTAG的更新速度要优于本系统,这说明JTAG调试器在速度性能上存在一定优势。但是,本系统的更新耗时在可承受范围之内,而且,本系统具有如下优势:① 省去额外购买硬件的开销;② 传输距离更远,可实现远程更新;③ 更新过程可控,能保证程序的稳定性和可靠性;④ 硬件驱动固化在BootLoader程序中,减少了User程序的代码量。因此,速度的牺牲是值得的。
5 结束语
为了解决使用JTAG调试器烧录程序所存在的弊端,设计并实现了一套基于串口通信的程序更新系统。该系统在物理结构上将终端程序分为BootLoader和User。BootLoader固化在Flash中,不对外提供源代码,User实现用户需要的功能并对外提供源代码。BootLoader提供了通过串口更新User的功能,并集成了终端设备基础硬件资源的驱动,使得用户可以直接通过接口进行调用,而不用知道其源代码和实现过程。这既保证了串口更新的可靠性,又保证了基础硬件资源的驱动不会被恶意修改。本系统已经在本实验室的PLC远程监控系统项目中得到了成功应用,目前,该项目运行良好,更新系统工作正常。