三、如何实现Bootloader
1.通信
与上位机下载端建立可靠的总线通信以获取要更新应用程序:CAN驱动,CAN Driver 模块实现 CAN 报文的收发。
2.Flash Driver
用于操作 Flash 的擦除、写入和读取功能。主要包括 Flash 硬件初始化,Flash block 块的读写操作及擦除功能。基于软件运行安全性考虑,Flashdiver 一般不会存在放在 fash中,避免正常程序在发生错误时可能的非法修改。在需要执行应用程序或应用数据需要时,首先将 Flash diver 下载至 ram中,然后执行相应的更新。
3.协议
①传输协议:ISO-15765-2,
传输层主要是提供数据的组包和拆包功能服务,能够实现报文的分段传输及数据传输过程中的错误检测和超时处理。
②UDS 协议:ISO-14229-1
协议中定义的 Bootloader 程序刷写流程,包括:诊断会话切换、安全状态切换、标识符读写、程序刷写和ECU复位等。
③Watch Dog 监控 Bootloader 超时或者死机,对 ECU 复位。
④NvM 驱动包括对 NvM 的读写操作支持。
四、Bootloader的功能
BootLoader,顾名思义,就是驻留在 ECU 非易失性存储器中的一段程序加载代码,每次ECU 复位后,都会运行 bootloader。它会检查是否有来自通信总线的远程程序加载请求,如果有,则进入bootloader 模式,建立与程序下载端(通常为 PC 上位机)的总线通信并接收通信总线下载的应用程序、解析其地址和数据代码,运行NVM(NoneValitaleMomory--非易失性存储器)驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更新。如果没有来自通信总线的远程程序加载请求,则直接跳转到应用程序复位入口函数,运行应用程序。
五、Bootloader的三大技术点
①与远程程序下载端建立可靠的总线通信以获取要更新应用程序
②解析应用程序编程文件(S19/HEX/BIN)获得其在 NVM 中的地址和程序代码及数据
③运行 NVM 驱动将应用程序的代码和数据编程到 NVM 中并校验
1.可靠通信总线建立
汽车 ECU'常见的数据总线有 CAN 和 LIN,因此通常汽车 ECU 的 bootloaderCAN 或者 LIN都是通过下载数据的。当然也可以基于其他总线,比如基于SPI总线或者 I2C 总线以及以太网。
①通信总线由ECU 的 MCU 外设实现,所以在 bootloader 中必须开发相应的通信总线外设驱动程序,实现基本的数据发送和接收功能。
②为了保证通信的可靠性,必须开发一个基于通化总线完善的通信协议,应用程序下载端和 bootloader 之间需要建立请求命令(request command)、确认(acknowledge)、等待(block wait)、错误重传(error re-send)等机制----bootloader 根据不同的请求命令完成不同的任务并确认操作是否完成(ACK)以及数据是否正被确完整的传输,若出现数据错误(通过校验和或者ECC实现),需要进行自动重传;
③应用程序下载端通过需要在 PC 上基于 VC 或者 C#、QT、Labview 等开发GUI软件,实现C语言中要求的总线通信协议,一般在其底层都是通过调用相应的总线设备,如USB转CAN/LIN 的转发器设备的动态库(DLL)的 API接口来实现数据的收发,相应的总线USB转发设备都会提供相应的驱动库(DLL)。
④一些正规的大主机厂要求其 ECU 供应商开发放入 ECU bootloader 必须基于UDS等总线诊断协议,在UDS中规定了相应的CANID给bootloader使用,那么久必须在该类 ECU 中的 bootloader 工程中加入相应的 UDS协议栈。
2.应用编程文件解析
不同的MCU软件开发IDE编译链接生成的编程文件格式可能不同,但S19、HEX和 BIN 文件之间是可以相互转化的,所以只需要在 bootloader 中开一种编程文件的解析程序就可以了,其他的可以使用相应的转换工具(convert tool)在上位机上进行转换。
对编程文件的解析,目的在于获得应用程序的程序代码和数据及其在NVM中的存储地址。
3.NVM驱动程序开发
NVM(Non-Volatile Memory,非易失性存储器)驱动程序开发涉及管理和操作非易失性存储器设备,如闪存(Flash)、EEPROM(电可擦除可编程只读存储器)等。这些设备通常用于存储重要的数据,如操作系统的启动程序、固件更新、系统配置等。
①ECU 的 NVM 一般包括其 MCU 片内集成的用于存放数据的 EEPROM 或者 Data-Flash 和用于存储程序代码/数据的Code-Flash/Program-Flash 以及 MPU 扩展的片外 NOR Flash 或者NAND-Flash。
②NVM 驱动程序包括对 NVM 的擦除(erase)、编程(program)和校验(verify)等基本操作,也包括对 NVM 的加密(secure)/解密(unsecure)和加保护(protection)/解保护(unprotection)操作。
注:MCU 片上集成的NVM中EEPROM/D-Flash和C-Flash/P-Flash 一般属于不同的 block,所以可以直接在 Flash 上运行 NVM 驱区动对 EEPROM/D-Flash 进行擦除和编程操作。
③NVM 驱区动一般都是通过运行一个NVM command 序列,在其中通过NVM 控制器寄存器给出不同的NVM 操作命令代码、NVM 编程数据和目标地址的方式完成。
④由于 NVM 的工作速度一般较 CPU内核频率和总线频率低,所以运行 NVM驱动前必须对 NVM 进行初始化,将设置分频器其工作频率设置为正常工作所需频率范围。
⑤一般 MCU 厂商都会给出其 MCU的NVM 驱动库,用户可以使用该类库实现 NVM 操作,如果是Freescale/NXP的汽车级 MCU,还可以使用CodeWarrior IDE集成的Processor Expert 生成相应的NVM 驱动程序。