一、引言
随着flash存储器件的普遍使用,在线编程IAP(In Application Programming)的下载方式得到广泛的推广与应用。flash在线编程技术是指ECU的flash存储器具有电可擦除、可写入的特点,可以实现MCU代码的在线更新。传统的在线编程应用系统采用PC机并行口或串行口实现数据通信,需要专用的硬件设备支持,开发成本较高,且编程操作不方便。
汽车车身控制系统的控制对象比较多而且分布于整个车体,系统应用的电子控制单元ECU(Electronic Control Unit)节点安装位置分散,如前节点和仪表节点在驾驶台部位,后节点在车尾部位,左、右门节点则在左、右门部位等。车身控制系统采用的是分布式控制方式,但基于分布式系统的编程应用工具比较少,难以实现系统在线编程应用和代码升级。
控制器局域网CAN(Controller Area Network)总线属于现场总线范畴,是一种有效支持分布式控制和实时控制的串行通讯网络,目前已经在汽车电子应用系统中得到了广泛的应用。将CAN总线在线编程技术应用到汽车车身控制系统中,完成ECU节点的代码下载功能,既可以实现控制系统的在线编程应用与升级,又能充分利用现场总线的应用特点。
二、系统分析与设计
(一)系统整体设计分析
车身控制系统由若干ECU节点组成,每个节点采用Freescale处理器MC68HC908GZ系列单片机作为MCU,能够支持flash在线应用编程。PC机通过USBCAN接口卡接入CAN总线网络,当系统处于在线编程状态时,PC机通过CAN总线网络可以方便的与ECU节点通信,车身控制系统软、硬件设计无需做任何改动,就能够利用已有的硬件应用系统平台实现代码下载、系统在应用升级。如图1所示在线编程系统包括三部分:PC机节点、CAN总线通信网络和ECU节点。
[img]2006121912192625616.gif[/img]
在线编程软件体系分为三层结构:控制层、通信层和实现层,在线编程功能通过软件设计实现。最高层为控制层,运行在上位机PC计算机中,主要负责代码生成和ECU节点在线编程的启停;中间层为通信层,运行在CAN总线设备上,实现CAN总线链路层和部分应用层功能,如报文发送、接收及滤波;底层为实现层,运行在ECU节点,实现对嵌入式节点的编程操作,具体结构见图2。通信层处理的数据有三种:控制命令、代码数据和反馈信息,其中控制命令和代码数据由控制层向实现层传递,反馈信息则是由实现层向控制层传递,所有数据传输遵循系统定制的CAN总线应用层协议,该协议在分布式控制系统中CAN总线协议应用层的基础上,重新划分报文标志符空间,并定义相应的含义和可执行操作。本文主要探讨系统的具体实现,总线协议的扩展定义不作详细介绍。
[img]2006121912195129137.gif[/img]
(二)PC机控制层软件的设计
整个控制系统中,控制层软件位于PC机节点,通过与实现层软件通信来控制编程操作的启停和代码的总线数据传输,不直接参与对ECU节点的控制功能操作。
控制层软件的功能主要包括两部分:首先是生成下载到flash中的最终代码数据,PC机软件不参与flash编程,但必须为ECU节点提供编程所需要的信息,因此,PC机软件对生成的二进制代码进行分析,获取flash编程的必要信息,如代码长度、写入flash的地址、校验字等;其次是控制在线编程的启动和停止,控制层维护一个称为反馈信息表格的数据结构,表格中的信息表明哪些节点编程结束、哪些节点需要重新启动在线编程,根据表格内容的含义,对不同ECU节点发送不同的命令报文,启动相应操作。
控制层软件完全由PC机实现,但系统中PC机不仅仅完成控制层功能,还包括通信层的部分功能。PC机通过转换模块接入CAN总线网络,除了完成接收发送CAN总线报文的基本功能外,更重要的是实现系统定制的CAN通信协议。
(三)ECU节点软件的分析
实现层位于ECU节点,直接完成flash编程操作,是整个在线编程系统的核心部分。按系统运行流程,实现层软件可以分为三部分:首先,完成状态切换,进入在线编程状态;其次,接收代码报文,并进行校验;最后,将接收到的代码写入flash空间,验证无误后,结束在线编程。同通信层类似,实现层需要定义ECU节点在线编程协议。在线编程技术的基本原理:从结构上将Flash存储器映射为两个存储空间,运行一个存储体上的程序,打开flash高压编程开关对另一个存储体进行编程操作。MC08HC908GZ60的内部flash存储器具有保护功能,可以设置flash写保护空间,将flash空间分为两段,一段为系统区,存储系统代码,另一段为保护区,存储实现层代码,对系统区编程时,保护BootLoader代码,两个代码段共存于一个系统,又不会相互干扰。系统打开高压开关后,任何读flash操作都是非法的,系统进入在线编程状态后,需要将flash编程代码拷贝到RAM中,再运行相关代码。在线编程时,RAM空间需要划分出两段专用空间,一段为CAN接收缓冲区,一段为代码空间,是在线编程时代码存放和运行空间。
同样的,ECU节点不仅运行实现层软件,同时完成了通信层的部分功能,本质上通信层是对系统定制的CAN通信协议的具体实现,由PC机节点和ECU节点代码共同完成,两者通过CAN总线实现通信的过程就是通信层的工作过程。
三、ECU节点的软件设计
在线编程系统中,ECU节点的代码即为保护区的代码,可以分为两部分:通信层部分代码和实现层代码。通信层代码主要由CAN报文接收中断函数和报文发送函数组成,两函数都是不允许在线更新,因此代码必须位于flash保护区中。
[img]2006121912203092853.gif[/img]
保护区除了存储通信层部分代码外,还包括实现层的全部代码。实现层的主要功能是flash编程操作,将接收缓冲区的代码数据写入flash的确定地址空间内,在flash编程操作前需要完成节点的状态迁移,即ECU节点必须进入在线编程状态。本系统采用的方式是在启动过程中检测启动报文,若检测到有启动报文到达,则跳入特定的地址,进入在线编程状态。具体流程图3所示:
系统启动后,先检测是否收到启动报文,然后转入相应的状态,省略了启动后的初始化操作。由图可知,有两处跳转可以进入正常运行状态,这可以通过“JMP Main”汇编指令完成,保护区地址不变,那么启动向量就不需要改变。MC08HC908GZ60共有26个中断源,中断向量位于(0xFFCC-0xFFFF)空间内,内容是支持在线更新的,如何实现更新呢?有两种解决方法:第一种, MC08HC908GZ60的中断向量表固定在(0xFFCC-0xFFFF)之间的52个字节内,对中断向量表空间的内容进行单独编程写入。注意,不是整页写入,中断向量表所在页空间中部分地址是保留空间,部分地址是寄存器地址,不可能用图3编程流程对向量表空间编程,只能对页内部分空间执行在线编程操作。第二种解决方法:通过辅助表格实现中断向量表的在线更新,如图4所示。
[img]2006121912205977845.gif[/img]
所谓辅助表格是一个存放指令的数据结构,表格内存放跳转到中断入口的指令,中断向量则对应辅助表格中的单元格地址,辅助表格的地址是用户定义的,位于支持在线编程的系统区空间。辅助表格中所有指令均采用扩展寻址,指令长3个字节,设辅助表格地址Tbl_Start,则表格中第N单元格的地址为Tbl_Start+(26-N)*3,辅助表格代码如下:
ORG Tbl_Start ;辅助表格的起始地址
JMP Address_ISR24 ;跳转到24号中断处理程序入口
JMP Address_ISR23 ;跳转到23号中断处理程序入口
――――――――――
JMP Main ;跳转到Main主函数入口
上面的代码属于系统区代码,除首地址外,其他地址均根据需要随时改变的。中断向量表中内容则可以保持不变,代码如下:
ORG $FFCC ;中断向量表的地址空间0xFFCC-0xFFFF
Vectors FDB Tbl_Start, Tbl_Start+3, Tbl_Start+6―――― ;向量表的内容
这样,中断向量表代码可以在保护区内保持不变,不需要对表内容直接进行更新。
四、结束语
利用CAN总线完成对汽车电子控制系统节点的在线编程,利用了已有的硬件条件解决了车身分布式控制系统的现场升级问题。系统主要通过软件方式实现,不需要进行单独硬件开发,开发过程易于掌握。在线编程时,只需要将PC机节点接入车身控制系统预留的CAN总线接口即可,操作方便,本技术模型不仅可以应用于汽车电子领域,还可以推广到其他分布式控制系统,应用前景看好。