摘 要:针对利用仿真器更新程序繁琐的问题,提出了一种全新的基于CDMA网络的远程升级解决方案。通过特殊的“常量定位”方式,实现引导升级合一和内嵌到应用程序的目的。采用虚拟复位技术,简化了升级流程。上位机通过Internet和CDMA网络与终端通信,支持数据包的断点续传,通过查看数据窗口中解析的数据包,实时了解升级的进度。测试结果表明,该方案提高了固件升级的便捷性,降低了升级的成本,有一定的参考价值。
关键词:嵌入式设备; 远程升级; 虚拟复位; 断点续传; CDMA
近年来,随着计算机技术及集成电路技术的发展,嵌入式设备广泛应用于通信、网络、工控、医疗、电子等领域。随着用户需求的提升,设备的升级越来越频繁。然而有些设备安装在高空高压环境下,作业危险性很大。因此,需要一套行之有效的设备管理及升级方案,让操作人员可以通过无线的方式[1]进行产品的升级和维护。
本文的软件升级方案以TI公司的MSP430F5438A[2]为例,通过片内Flash备份,引导升级合一,常量定位,虚拟复位等方式,避免了程序升级需要上电复位及设备意外掉电导致升级失败等风险,使终端设备实现了软件升级远程化,无需引导等待,掉电可恢复,数据包可断点续传,稳定可靠的目的。
1 基本原理
1.1远程升级系统介绍
CDMA2000 1X是CDMA2000第三代无线通信系统的第一个阶段,完全兼容IS-95,采用码分和频分结合的多址技术。CDMA2000 1X的空中信道支持的调制方式在兼容CDMAOne的基础上进行了极大的增强,单个用于传输分组数据的空中信道的最大传输速率可以达到307.2 kb/s,是真正意义上的第三代移动通信系统[3]。如图1所示,本方案中上位机作为网络服务器,将升级代码借助Internet、CDMA网络发送到远程终端的CDMA模块中。MSP430读取模块中的缓存,存入到内部的Flash中,待远程终端接收完全部的升级代码并校验正确后开始升级。
1.2 升级实现原理介绍
本方案将程序存储空间划分为Boot区、Code区、Temp区、Flag区和Vector区。Boot区存放基本的Flash读写、标志判断等代码(不含通信处理及基本操作);Code区存放完整的应用程序工程代码(含通信处理及基本操作);Temp区用于备份程序区的代码;Flag区是专门存放升级标志位的特殊区域;Vector区用于备份程序区的中断向量。其中Boot区代码使用特殊的“常量定位”方式添加到应用程序中,与Code区的应用程序一次编译完成,且Boot区提供UpdateAPI函数供Code区调用。
MSP430F543A的Code Flash最多为256 KB,共128段,擦除的时候必须按段擦除,写入或者读出的时候按字或者字节进行操作。在Main Flash 中每段seg均为512 B,在Information Flash中每段为128 B。由于BankA分为0x40000-0x45bff和0x5c00-0xffff两部分,段擦除会将两部分都擦除,故在BankA中不使用0x40000-0x45bff(共23 KB),用户中断向量和备份中断向量各为512 B,占据1 KB,Boot区分配16 KB。由于要程序升级可恢复,故做成备份的模式,这样就达到了Temp区和Code区均为(256 KB-23KB-1 KB-16 KB)/2=108 KB的最佳效果。
在应用程序中下载完代码并校验正确后置位升级进度,通过虚拟复位跳转到Boot区,读取升级标志位来选择相应的处理。如果置位的是下载完成标志,则按照分块交换的理念,逐个相对应地交换,待全部交换完成,则跳转到应用程序入口,开始执行交换后的新应用程序,如图2所示。
2 关键技术
2.1 常量定位技术
一个函数的入口地址称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。而Const常量定位技术就是从此衍生出来的。
在本方案中首先建立一个完整的工程,编写Boot区代码。开辟一段专门空间(0x5c00-0x5cff)来存储Boot区函数的入口地址,得到Boot区txt格式的文件,转换成16进制数据文件后,通过静态存储的方式定位到实际运行程序中在Boot区开辟的固定区间内(0x5c00-0x9bff),Code区通过Boot区提供的UpdateAPI函数入口地址,将其转换成Code区函数后供自己调用。
为了防止误升级,在Boot区定义一个读取软件版本信息的函数int s_Boot_GetUpdateVersion( ),此函数在Boot区的入口地址是56 6d,把它存放在0x5c00-0x5c01的空间内。在Code区中加入转换后的Boot区代码后,再自定义函数int(*Boot_GetUpdateVersion)(),然后将存储在0x5c00-0x5c01处的s_Boot_GetUpdateVersion入口地址赋给该函数,接着调用Code区的(*Boot_GetUpdateVersion)()函数即可实现软件版本信息读取的功能。
可见通过常量定位这种方式,可以将应用程序和Boot程序一次编译完成,Boot区提供UpdateAPI函数供Code区调用。
2.2 虚拟复位技术
所谓的虚拟复位不是通过产生外部的复位信号来迫使单片机复位,而是通过改变PC指针实现程序的跳转。通常的方法是在C语言中内嵌汇编语言来实现。只要在需要复位的地方嵌入汇编语言[4] asm("mov &0xFFFE,PC")即可实现虚拟复位[3]。然而内嵌汇编总是存在诸多麻烦,因此,提出一种新的虚拟复位方法:
((void (*)(void))0x5d00)();
由于0x5d00是复位地址,故把它强制转换成指向函数的指针,然后调用此函数,达到程序复位的目的。同时这种方法也解决了升级中存在的一个比较严重的问题:由于虚拟复位是通过内嵌的方式提供API函数供Code区函数调用的,而Code区的起始地址是0x9c00,则虚拟复位后的PC指针指向就是0x9c00,而不是Boot区的0x5d00。所以Code区的应用程序在执行虚拟复位时,无法跳转到Boot区,这样在Boot区要完成的代码交换也将无法进行。可见此种无需嵌入汇编的方法,简单方便且切实可行。
2.3 断点续传技术
UDP协议被称为一种不可靠的传输协议,因为从发送方到接收方的传递过程中出现数据包的丢失,协议本身并不能做出任何检测和提示,但具有TCP所望尘莫及的速度优势。为了使远程升级系统既获得实时的性能,又获得相对可靠性,必须在上层应用程序中完成安全和排序等功能,并建立可靠传递机制。
在本方案设计中,专门在Information Flash中开辟一段空间0x1800—0x187f,用来记录当前经过CRC16校验正确后的数据包数。为了保证Flash擦除的方便和稳定,规定数据包中数据的长度必须为128 B、256 B或者512 B,若所要传输的数据小于规定字节数,需在数据包中填充0xff方法以保证数据的一致性。当由于网络不稳定或者断电等突发情况下导致升级失败时,若再次启动升级,终端设备要首先读取当前数据包数,擦除Flash中空余的存储空间,然后发送含有当前数据包数的升级配置数据包给上位机,上位机在获得当前命令包后计算下一数据包在解析文件中的位置,并组包发送。从而避免了相同数据包的重复发送和Flash的全部擦除。
3 上位机软件设计
上位机方案采用Visual C++中的MFC对话框编程,其中的关键是对升级文件TXT文件的处理。@为地址引导符,其后数据为地址,即接下来代码所存入的Flash地址起始位置。如果地址为0xFF80-0xFFFF,则为中断向量地址,特别@后面的FFFE是应用程序中断向量表中的复位地址。q为结束字符,表明文件结束。
上位机完成对文件的解析后,通过数据包与终端进行交互。数据包定义如表1所示。
其中命令码是用来区分数据包所要执行的具体操作。由于寻址范围超过了64 KB,故采用4 B来表示地址信息。
4 风险避免措施
升级中不可避免地存在各种风险,本方案采取如下措施: (1)将Code区和Temp划分为若干块,每次完成块交换后,都将置备份标志,如果交换过程中有一块交换不成功则再次虚拟复位,通过升级标志位的判断进行恢复处理,将已经和Temp交换的部分再次交换回来保证原程序依然可用。(2)在下载代码的过程中,每一包数据在上位机都计算CRC16校验值,然后单片机接收数据后重新计算CRC16值,如果两者相等才认为这包数据正确,给出正确回应[5]。(3)遇到在应用程序中代码下载不完整或者代码下载时断电的情况,可通过读取升级进度标志,单片机重新复位后不会在Boot区中进行代码交换。(4)专门划分一个区域用于记录升级进度信息,通过修改进度信息来进行相应的处理[5]。(5)在等待升级完成的过程中,发送一定数目的升级完成确认包(地址信息为01 01 01 01,命令码为88),如果收到回应,则确认升级完成。(6)本方案并不擦除原来的程序,只是将Code区和Temp区互换,所以可以实现升级区变为备份区,备份区变为升级区,等待下次文件的写入,也可以按照需求还原程序。通过这种校验、存储、替换的方式,可以有效地降低由于传输错误导致升级失败的风险。
5 测试结果及总结
为了保证通信的速率和稳定,本测试设置通信超时为5 s,重发次数为5次。即发送的数据包如果5 s内没有回应,则重发。重发次数最多为5次,否则提示升级失败。打开端口后,等待设备的登录,登录成功且升级文件解析正确后才可进行升级。点击“程序升级”按钮,上位机和终端开始交互。终端接收完正确数据后,虚拟复位完成Code区和Temp区的代码交换。运行新程序后终端重启CDMA模块仍然发送包含新IP地址和终端ID的通信连接数据包给上位机。若终端ID前后一致且对升级完成确认包的回应正确,则表明升级成功。测试结果如图3所示。
本方案借助Internet、CDMA网络成功地实现了远程终端的软件升级。同时运用常量定位技术达到了升级无需引导等待的目的;虚拟复位、断点续传和升级进度标志的应用增加了升级程序抗风险的能力;采用片内Flash备份的方式,支持升级和备份恢复的功能。随着通信技术和自编程序技术的发展,本方案对嵌入式终端设备的软件更新具有极大的参考意义。
参考文献
[1] 唐文, 刘芳伶. MSP430系列单片机软件在线升级设计与实现[J].通信技术,2012,45(1):144-146.
[2] 美国德州仪器.MSP430 Flash SelfProgramming Technique[Z]. SLLAA103.2004.
[3] 张云. 第三代移动通信技术特点、后续演进及其全球竞争格局[J]. 中国集成电路, 2009(2):67-72.
[4] 孙亚萍, 张慧熙.一种新型DSP软件在线升级方法的研究与实现[J].微型机与应用,2010,29(5):72-74.
[5] 罗文, 王莉娜, 肖鲲.基于GPRS的嵌入式系统远程监控和升级[J].电子技术应用, 2010,36(5):159-162.