毕乾坤
(陕西法士特汽车传动工程研究院智能传动研究所,陕西 西安 710119)
在电控单元(ECU)的下线测试流程中,ECU 的测试记录需要记录到下线试验台的数据库中,这样便于在产品发布后的维护和跟踪,因此需要按一定规则生成硬件ECU 的序列号,并把此序列号和下线测试数据对应上。原有的措施是在ECU 硬件壳体上贴上代表硬件序列号的条码标签纸,通过扫码枪扫码记录ECU 硬件的序列号,并存储下线数据。这种方案只适应在生产中,在后续实际维护和服务中,由于车辆的恶劣使用环境导致标签纸失效脱落,或者由于太脏不能看清,或者由于安装位置的原因没有办法看见标签纸,使EUC 在售后服务时增加了售后服务的成本。本文通过修改bootloader hex 文件的ECU 硬件序列号,并把bootloader 刷写到ECU 中,使产品在下线完成后硬件序列号就永久存储在FLASH 中,通过客户端软件的UDS服务就可以读取ECU硬件的序列号,不会因为后续产品的应用程序更新而导致硬件序列号的丢失。
当前汽车中ECU 的软件主要包括2 部分:bootloader 和应用程序(APP)。Bootloader 程序的目的是便于后续应用程序的更新,它在ECU 产品下线测试完成后就不会再更改。现在的微控制器(MCU)都有JTAG 口来用于程序的刷写,由于JTAG 口是一个功能很齐全的口,同时在硬件层面上也缺乏电气保护,不能适应恶劣的汽车电气使用环境,因此在ECU 的设计中不会把JTAG 通过ECU 的接插件引出,所以通用的做法是开发bootloader 引导程序来满足ECU 后续应用程序的更新。
应用程序(APP)则为实现ECU 相关功能的程序,它包括整个系统的控制策略。ECU 在上电启动时会先进入bootloader,bootloader 程序会检测应用程序是否存在并有效,如果应用程序有效,则会跳转到应用程序中执行应用程序的控制逻辑。应用程序在后续产品发布后是可以更新的,而bootloader 程序则大多数情况下是不能够更新的。
本文中的 bootloader 的设计和开发是基于“HIS Flashloader SpecificationVersion 1.1”,此规范为基于UDS 协议设计和开发bootloader,其中UDS 服务#22 为read DID 服务,DID 为0Xf18c(ECU 序列号ID)为读取ECU 的序列号。在本文中使用的bootloader 的ECU 序列号定义为一个16 个字节的全局常量字符串,因此在程序的编译完后ECU 的序列号定位在FLASH 地址范围内。通过编译后生成的map 文件找到ECU 序列号字符串的FLASH 地址位置,然后在Intel或 Motorola 格式 hex 文件中用生成的序列号替换掉bootloader 程序中默认的ECU 序列号,从而完成ECU 序列号的更新。
在下线测试的前一个工位是下线测试程序的下载,下线测试程序包括bootloader 和下线测试应用程序,这2 个程序可以合并为一个Intel 或Motorola 格式的文件,并通过JTAG口下载刷写。
本文中ECU 的微控制器为Infineon 的TC277 系列,Infineon 公司提供了免费的通过JTAG 接口下载程序的客户端工具Memtool,本文使用的Memtool 版本为4.7 版本。Memtool 4.7 提供了一个可以通过批处理操作来执行程序下载的方式,通过这种方式不需要在Memtool 的用户界面上点击鼠标来完成程序的刷写。Memtool 的程序界面如下图:
图1 Memtool 主界面
Memtool 主要支持的批处理命令为:
● Connect -等同于用户界面的“Connect”按钮,通过JTAG 口连接设备。
● open_file{file}- 等同于用户界面的“Open File…”,file为包括文件绝对路径的文件。
● select_all_sections -等同于用户界面的“Select All”,选择打开的刷写文件的所有节。
● add_selected_sections -等同于用户界面的“Add Sel. >>”,把选择的刷写节添加到刷写节中。
● program -等同于用户界面的“Program”,编程刷写选择的刷写节数据
● disconnect -等同于用户界面的“Disconnect”,断开设备的连接。
批处理文件生成:新建文本文件,输入下面的命令,并保存为扩展名为.mtb 文件。
connect
open_fileD: mcm_cx31.hex
select_all_sections
add_selected_sections
program
disconnect
通过点击上图中的“File”->“Run Batch…”,选中.mtb文件,Memtool 就会按照.mtb 文件中的命令执行。见下图:
图2 批处理界面
程序的设计和开发需要把上面介绍的2 个关键功能通过编程实现自动操作,简单的鼠标点击的操作,程序就能自动完成这2 个关键功能的实现,从而保证ECU 硬件序列号的更新。
(1)Bootloader 程序中ECU 硬件序列号的更新。通过上面的介绍实现ECU 硬件序列号的更新。
(2)执行Memtool 工具的批处理脚本实现程序的下载。本身Memtool 具有批处理实现程序下载的能力,本文要做的就是让程序自动调用批处理脚本,不需要测试员点击鼠标选中批处理脚本文件。
编写的程序需要触发 Infineon 的 JTAG 下载程序Memtool 的“Run Batch…”菜单命令来完成程序的刷写,这涉及到进程间的通讯,因为Memtool 程序是不能做修改的,所以进程间通信的方式就只能利用windows 消息来实现。开发的程序界面如下,当HW sn(硬件序列号)填写后,只要点击“updatehwsn”按钮,程序会自动打开并调用Memtool程序的批处理功能来完成hex file 的刷写,并把硬件序列号也更新ECU 的FLASH 中。
图3 程序主界面
点击“updatehwsn”按钮时程序执行操作如下:
(1)通过WINDOWS API 函数GetWindowText,遍历desktop 下windows 子窗口句柄,并找到Memtool 的窗口句柄;如果没有发现,则程序会启动Memtool 程序,然后重新查找并获取Memtool 的窗口句柄。
(2)用当前的ECU 序列号替换bootloader 的默认序列号,并生成新的hex 文件。
(3)用此新生成的hex文件作为memtool要刷写的文件,生成.mtb 的批处理脚本文件。
(4)通过WINDOWS API 函数PostMessage 发送模拟菜单点击的消息命令触发Memtool 的“Run Batch...”命令。
(5)等待1.5 秒,保证“Run Batch...”命令触发后启动的“Run Batch File”窗口出现。
(6)通过WINDOWS API 函数FindWindow,查找“Run Batch File”的窗口并获取窗口句柄。
(7)通过WINDOWS API 函数GetClassName 和GetWindowText,遍历“Run Batch File”窗口的子窗口,获 取类名字为"ComboBoxEx32"的子窗口和"&Open"按钮的子窗口句柄。
(8)通过WINDOWS API 函数SendMessage,发送消息WM_SETTEXT 给"ComboBoxEx32"的子窗口,把.mtb 的批处理文件的路径名传递给此子窗口。
(9)通过WINDOWS API 函数PostMessage,发送消息WM_COMMAND 给"&Open"按钮的子窗口,模拟鼠标点击“&Open”发出的消息。
(10)Memtool 按照.mtb 的批处理脚本刷写程序。
本文通过编写程序,可以实现ECU 硬件序列号的刷写操作,保证下线的ECU 的序列号被存储在ECU 硬件中,并能通过客户端服务程序调用UDS 服务#22 read DID(DID 为0Xf18c)读取ECU 硬件的唯一序列号,为后续ECU 的维修和服务时保证ECU 的可追溯性,能够减少后期服务的成本,经过实际使用,效果明显。