多节点软件触发式Bootloader设计与实现

郭帅++李军伟++高松



摘 要: 以8位微控制器MC9S08DZ60为例,搭建了电动汽车多节点灯光控制系统硬件平台,开发了基于CAN总线技术的多节点软件触发式引导加载程序,设计了Bootloader上位机,开发了一套应用于汽车灯光控制系统的Bootloader。通过对电动汽车灯光控制系统硬件平台进行程序升级,对Bootloader系统进行了性能测试。试验结果表明,所设计的Bootloader系统能够快捷、准确、方便地实现应用程序的在线升级,为汽车灯光控制系统应用程序的在线编程和数据更新提供了参考。
关键词: 汽车灯光控制系统; 软件触发; CAN总线; 引导加载程序; 在线编程
中图分类号: TN911?34; TP391 文献标识码: A 文章编号: 1004?373X(2017)18?0035?05
Design and realization of multi?node software trigger Bootloader
GUO Shuai, LI Junwei, GAO Song
(School of Traffic & Vehicle Engineering, Shandong University of Technology, Zibo 255049, China)
Abstract: Taking the 8?bit microcontroller MC9S08DZ60 as an example, the hardware platform of a electromobile lighting control system was built, a special multi?node software trigger Bootloader based on CAN bus technology was developed, and upper machine system of the Bootloader was designed. Then a Bootloader system for the automotive lighting control system was designed. The Bootloader system was tested through the program upgrading of the hardware platform for the automotive lighting control system. The test result of the Bootloader system shows that the Bootloader system can realize the online upgrading of applied program expediently and accurately, and provide a reference for the online programming and data?upgrading of the application program for the automotive lighting control system.
Keywords: automotive lighting control system; software trigger; CAN bus; Bootloader; online programming
0 引 言
汽車作为一个多控制器集成系统,往往需要对控制器进行程序设计和升级,因而应该设计多节点引导加载程序(Bootloader)实现多控制器程序升级,为体现Bootloader在升级程序中的便捷性,应采用软件触发的方式进行程序升级。长期以来,开发人员对Bootloader进行了大量研究,文献[1]针对电动汽车整车控制器设计了基于MC9S12XEP100的Bootloader,通过VC++开发了上位机系统,实现程序在线升级。文献[2]设计了基于MC9S12G128的U盘启动Bootloader,使用U盘携带目标下载代码,节省了单片机的内存空间。文献[3]根据CCP协议设计了基于飞思卡尔MC9S12DP512的 Bootloader,针对混合动力电动车控制器,实现了正确引导程序运行。虽然这些研究开发了各类芯片的Bootloader,给出了Bootloader设计的通用研究方法,但他们仅是针对单节点Bootloader,采用硬件触发方式进行程序升级,在实际车用控制器中无法便捷地实现程序升级,不能体现Bootloader技术在整车控制系统开发中的优势。
本文在CAN协议的基础上,采用自定义的数据传输协议,设计一套基于MC9S08DZ60的多节点软件触发式Bootloader,同时搭建一个汽车灯光控制系统的硬件平台,并通过该灯光控制系统硬件平台对所设计Bootloader系统进行性能测试。
1 Bootloader设计
Bootloader是系统加电后运行的固化在其中的一段程序,主要功能是为了完成软硬件所需要的初始化工作。其能实现用户程序的引导启动和固件自更新两个功能[3?5]。Bootloader的编程机制一般分为两种:FLASH kernel法和FLASH擦写函数法[6]。FLASH kernel法需要在进行程序升级时,要将Bootloader中与FLASH擦除和写入相关的程序都下载到单片机的RAM中,这样程序运行效率高,但是这对单片机的RAM资源要求也是非常高。FLASH擦写函数法是Bootloader比较常见的方式,它是将可执行代码下载到其内置的FLASH中,因为写入FLASH中的内容能永久保存,它适合固件程序的在线升级或数据更新[7?10]。由于MC9S08DZ60内部RAM资源有限,并且灯光控制系统对运行速度要求不高,所以本文所设计的Bootloader采用第二种FLASH擦写函数法。
2 控制器端Bootloader实现
对于嵌入式系统而言,不同硬件平台Bootloader的实现方法也各不相同。本文设计的整车控制器端Bootloader主要包含5部分:配置MSCAN通信模块、FLASH擦写模块设计、中断向量表映射、S19文件解析和Bootloader初始化。
2.1 配置MSCAN通信模块
CAN总线是一种应用十分广泛的通信协议之一,主要应用于对数据完整性要求非常高的汽车电子和工业控制领域[11?13]。Bootloader通过CAN通信进行程序升级,通过配置MSCAN通信模块,使单片机准确接收并处理数据。
飞思卡尔8位微控制器MC9S08DZ60的MSCAN模块有64 B的配置寄存器[14?15],为了能正常进行数据通信,需要对这些寄存器进行配置。MSCAN模块初始化流程如图1所示。本文设计的Bootloader选取2 MHz的固定系统时钟作为时钟源,使用250 Kb/s的波特率,设置CAN滤波参数,使灯光控制系统Bootloader程序只接收上位机的报文。
2.2 FLASH擦写模块设计
更新主程序的过程实际上就是对存储程序的 FLASH进行擦除和重新编程的过程。大部分的 FLASH当程序在其中运行时,不允许对其自身进行擦写操作,如果强行FLASH对FLASH进行操作,会因为编程电压较高使读取的数据不稳定,造成读取数据错误。所以本文设计的Bootloader把代码拷贝到RAM中执行,避免了FLASH直接对FLASH的操作。
FLASH擦写过程中,对时钟和晶振有严格要求。节点使用的晶振必须大于2 MHz,若外部参考时钟小于2 MHz,则无法完成编程和擦除功能。FLASH擦写时钟由配置FLASH时钟分配寄存器FCDIV的值实现,设置后的FLASH工作时钟必须为150~200 kHz。否则,若FLASH时钟频率小于150 kHz,FLASH会由于编程时间过长而损坏;若FLASH时钟频率大于200 kHz,又会导致不完全的编程和擦除。本文设计的Bootloader配置200 kHz的FLASH时钟频率,选取8 MHz外部晶振。
2.3 中断向量表映射
由于Bootloader和用户程序是相互独立,因此就需要解决两个程序中断向量不一致的问题,并且如何让两個程序能正确使用自己的中断向量,需要正确分配单片机的内存空间,MC9S08DZ60微控制器内存分配如图2所示。
通常MC9S08DZ60微控制器的中断向量表默认安排在0xFFC0~0xFFFF。其中复位向量在地址0xFFFE处,其余的向量包括用户向量依次往低字节的内存方向安排[16?17]。由于Bootloader和用户程序的中断向量表各自独立使用,所以Bootloader和用户程序的中断向量表分别在不同的内存区间。Bootloader接管了复位向量,使它指向了确定的地址处,而用户程序的复位向量指向的地址是未知的,为了能顺利引导用户程序启动,在下载过程中需要检测用户的复位向量,并把它安排在FLASH中的另一个确定的位置,留给Bootloader引导时自动调用。Bootloader运行时会使用到一些中断向量,所以Bootloader的中断向量表仍然处于0xFFC0~0xFFFF区间。因而,用户程序就不能使用与Bootloader相同内存区间来定义中断向量表,并且Bootloader是一段引导加载程序,不能随便被修改,所以就将用户程序的中断向量表搬移到另外一段内存区间内,以免影响Bootloader的中断向量。
2.4 S19文件解析
在程序更新的过程中,需要把S19程序文件下载到灯光控制器内。S19 文件为飞思卡尔推荐使用的标准文件传送格式——S?record目标文件格式。S?record目标文件格式是将目标代码及目标数据以十六进制ASCII的方式表示,使得目标文件在计算机系统和开发工具之间易于转换[18?19]。
S?record格式如表1所示。S19文件中的每一行被称为一条记录,记录总是以字母“S”开头,后面跟一位数字表示此记录的类型,数字是“0”表示S19文件的起始说明字符串;数字若是“1”,“2”或“3”代表此记录包含了程序数据,其中“1”为16位地址,“2”为24位地址,“3”为32位地址,MC9S08DZ60用的是16位地址,若是“9”则表明此记录为整个文件的最末一条记录。接下来一个字节表示了此记录所包含的字节数,它由起始地址、数据字节和位于末端的校验字节组成,其中的校验字节算法为:将长度、起始地址、数据相加,取三者之和的低8位,然后按位取。
2.5 Bootloader初始化
一般情况下,程序上电或复位后直接跳转到复位向量所指向的地址,直接运行main函数,但是Bootloader程序上电后,首先要判断是进入用户程序或是进入Bootloader下载程序。Bootloader初始化流程如图3所示。
通过判断0x1400内存是否写入1,选择进入Bootloader下载程序。当系统复位后检测0x1400内存没写入1,并且判断用户的复位向量所在地址0xF9FE已被写入,则使用JMP跳转语句直接跳向地址0xF9FE所保存的首地址运行用户程序;当节点复位后检测0x1400内存没写入1,但是判断用户的复位向量所在地址0xF9FE没有被写入,则使用JMP跳转语句直接跳向main函数,进入Bootloader的下载程序。
3 Bootloader上位机实现
Bootloader上位机程序主要是为了将S19文件以CAN通信的方式发送给灯光控制系统,实现控制器读取并升级程序代码。
3.1 Bootloader上位机通信协议
为了防止他人随意修改下载控制器应用程序,本文开发了一套自定义的数据通信协议。协议具体规定了电动汽车灯光控制器与上位机之间数据发送与接收、应答、报文校验、以及查询机制。Bootloader上位机协议如表2所示,电动汽车灯光控制器的ID设置为0xCF00402,上位机的报文ID分别为0xCF00400,0xCF00401,0xCF00403,0xCF00404,0xCF00405,0xCF00406,0xCF00408,电动汽车灯光控制器和上位机通信的帧类型为数据帧,数据段长度为8 B。
表2 Bootloader上位机协议
ID为0xCF00404,0xCF00405和0xCF00406是选择升级节点的命令报文,可以选择对主控节点、前灯节点或是后灯节点进行程序升级。ID为0xCF00400的报文是上位机发送给灯光控制器的操作指令,电动汽车灯光控制器接收到指令后,会对FLASH里的内容进行擦除或是编程。ID为0xCF00401的报文是上位机发送给电动汽车灯光控制器的S19文件的数据,上位机逐条发送S19文件,电动汽车灯光控制器查询接收S0,S1,S9的数据记录,对相应内存空间进行数据编程,并且会对接收的每一条S记录进行校验和计算,然后与接收到的校验和进行比较,确保数据接收的准确性。ID为0xCF00403的报文是上位机发送给灯光控制器的操作指令,可以通过返回值查询控制器软件和硬件版本信息。ID为0xCF00402的报文是控制器发送给上位机应答数据,分别返回擦除结束标志位和编程结束标志位。ID为0xCF00408的报文是上位机发送给控制器升级程序的标志位,通过修改用户程序内0x1400内存处的数据,实现升级程序的软件触发方式。
3.2 Bootloader上位机
基于VB 6.0开发了Bootloader上位机,采用USBCAN自带的二次开发函数,用于实现灯光控制系统的故障检测、故障清除、远程控制、CAN报文查看和软件在线升级等功能。汽车灯光系统上位机远程控制硬件平台如图4所示。通过上位机端界面,可以检测硬件平台的故障并进行故障清除,并且可以进行软件的在线升级等操作。

图4 汽车灯光系统上位机
上位机成功升级主节点程序界面如图5所示,通过人机界面的进度条,可以方便地了解程序的升级情况,实现操作人员对程序升级过程进行控制;通过USBCAN接口卡,按照制定的通信协议,完成整车控制器与上位机之间数据传输,实现二者之间的CAN通信;通过人机界面的数据显示窗口,读取S19文件,解释程序,发送程序,实现S19文件的数据解析;通过人机界面的发送状态窗口,接收到控制器发送的应答信号,将处理结果实时显示在人机交互界面上,方便采取有效的操作。
4 Bootloader性能测试
为了验证设计的Bootloader的在线升级程序的功能,将用户程序通过Bootloader下载到单片机内,用户程序的S19文件如图6所示。用户程序集成了CAN通信功能、定时器功能、汽车灯光系统控制功能,可以用来直观地显示用户程序的升级结果。Bootloader程序下载到芯片内存中的数据如图7所示。通过将内存区间数据与S19文件内数据进行对比,发现用户程序可以准确地下载到控制器指定的内存中,实现了灯光控制器升级和更新用户程序的功能。
为了验证设计的Bootloader的可靠性,搭建电动汽车灯光控制系统硬件平台如图8所示。升级程序之后的电动汽车灯光控制系统可以正常运行,将组合开关拨至示近光灯,根据控制策略,近光灯、示宽灯和牌照灯同时亮起,符合用户程序的运行逻辑,证明用户程序运行正常。
5 结 语
本文基于MC9S08DZ60微控制器设计了多节点软件触发式Bootloader,并搭建了电动汽车灯光控制系统硬件平台。通过实测试验进行了灯光控制系统性能测试,结果表明所设计的Bootloader能够快速、准确、方便地实现电动汽车灯光控制系统多节点应用程序的在线升级,为汽车灯光控制系统应用程序的设计和数据更新提供有效参考。
参考文献
[1] 杨竞喆,王志福,刘杰.基于MC9S12XEP100的整车控制器CAN Bootloader设计与实现[J].车辆与动力技术,2014(1):25?29.
[2] 戚长城,杨延相.总线式ECU两级Bootloader的设计与实现[J].计算机工程,2015,41(7):95?99.
[3] 张艳,鲍可进.整车控制器Bootloader的设计与[实现J].计算机工程,2011,37(12):233?236.
[4] 刘林,张晓丹,张作峰.Bootloader程序在MCF51AC系列单片机上的实现[J].计算机系统应用,2011,20(11):118?122.
[5] DU Haixing. Analysis and porting of embedded Bootloader based on ARM [J]. Microcomputer information, 2010, 29(2): 57?59.
[6] 朱少辉,夏超英.基于CAN总线的ECU在线编程技术[J].单片机与嵌入式系统应用,2014,14(1):24?27.
[7] 王亚刚.嵌入式Bootloader机制的分析与移植[J].计算机工程,2010,36(6):267?269.
[8] 马学文,朱名日,程小辉.嵌入式系统中Bootloader的设计与实现[J].计算机工程,2005,31(7):96?97.
[9] 黎君.基于ARM9嵌入式系统的Bootloader移植[J].科学技术与工程,2011,11(32):8061?8064.
[10] 王景存,高峰.基于ARM9的Bootloader的分析及设计[J].现代电子技术,2010,33(2):44?46.
[11] 田会峰.基于S3C2440的Bootloader设计与实现[J].自動化技术与应用,2010,29(7):29?32.
[12] 王宜怀,曹金华.嵌入式系统设计实战[M].北京:北京航空航天大学出版社,2012.
[13] 王宜怀,吴瑾,张书奎,等.嵌入式技术基础与实践[M].北京:清华大学出版社,2012.
[14] SAE. CAN vehicle application layer: SAE J1939/71?2016 [S]. USA: SAE, 2016.
[15] Anon. Road vehicles?diagnostics on controller area networks (CAN), part 2: Network layer services: ISO 15765?2 [S]. [S.l.]: ISO, 2004.
[16] Anon. Freescale′s HC08 and HCS08 apps gets full certification via LDRA software [J]. Health and beauty close?up, 2011, 234: 111?120.
[17] 林志贵,钟晴晴.HCS08系列FLASH在线编程方法的比较与分析[J].天津工业大学学报,2011(5):71?75.
[18] Anon. Motorola S?records文件格式 [EB/OL]. (2011?09?07) [2015?11?26]. http://blog.csdn.net/zyboy2000/article/details/6757604.
[19] Anon. MC9S08DZ60 Datasheet [EB/OL]. [2015?11?26]. http://www.alldatasheet.com/datasheet?pdf/pdf/153370/FREESCALE/MC9S08DZ60.html.