资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
详解汽车ECU的bootloader程序bootloader 的功能BootLoader,通常是驻留在 ECU非易失性存储器(NVM , None ValitaleMomory )中的一段程序加载代码,每次 ECU复位后,都会运行 bootloader。它会检查是否有来自通信总线的远程程序加载请求,如果有, 则进入bootloader模式,建立与程序下载端(通常为 PC上位机)的总线通 信并接收通信总线下载的应用程序、解析其地址和数据代码,运行NVM驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更 新。如果没有来自通信总线的远程程序加载请求,则直接跳转到应用程序 复位入口函数(复位中断ISR,也称作Entry_Point ()-使用Processor Expert 的 CodeWarrior 工程或者 Startup ()函数普通 CodeWarrior 工 程),运行应用程序。ApplkttionJ 初睹比因此,汽车ECU的bootloader 三个主要的作用:1. 与远程程序下载端建立可靠的总线通信以获取要更新应用程序;2解析应用程序编程文件(S19/HEX/BIN )获得其在NVM中的地址和程序 代码及数据;3.运行NVM驱动将应用程序的代码和数据编程到 NVM中并校验;下面就围绕这三个方面展开讲述。如何建立可靠的总线通信?汽车ECU常见的数据总线有CAN和LIN,因此通常汽车ECU的 bootloader都是通过CAN或者LIN下载数据的。当然也可以基于其他总 线,比如基于SPI总线或者I2C总线(典型如一些带有安全监测的功能安 全ECU,通过主MCU对功能安全监测MCU的程序进行升级)以及以太 网(基于Enternet通信的中控或者全液晶仪表的ECU以及下一代高速网关 和 ADAS ECU )。注意事项:1. 不同的ECU通信总线不一样,具体需要用到某种通信总线取决于实际应用;2. 通信总线由ECU的MCU外设实现,所以在bootloader中必须开发相应的 通信总线外设驱动程序,实现基本的数据发送和接收功能;3. 为了保证通信的可靠性,必须开发一个基于通信总线完善的通信协议,应用程序下载端和bootloader之间需要建立请求命令(request command )、 确认(acknowledge )、等待(block wait )、错误重传(errorre-send )等 机制-bootloader根据不同的请求命令完成不同的任务并确认操作是否完 成(ACK )以及数据是否正被确完整的传输,若出现数据错误(通过校验 和或者ECC实现),需要进行自动重传;4. 应用程序下载端通过需要在 PC上基于VC或者C#、QT、Labview等开发 GUI软件,实现中要求的总线通信协议,一般在其底层都是通过调用相应 的总线设备,如USB转CAN/LIN的转发器设备的动态库(DLL )的API 接口来实现数据的收发,相应的总线 USB转发设备都会提供相应的驱动库(DLL )。因此bootloader开发者一般还需具备一定的PC上位机软件开发 能力;5. 为了实现数据的可靠传输,一般在总线通信协议中添加信源编码,即在发 送是对有效数据进行校验和或者ECC计算并将结果在通信数据帧中和有效 数据一起发送,bootloader接收端,接收到数据帧后对有效数据域进行发 送端同样的校验和或者ECC计算,得出结果与接收到的校验和或者 ECC 计算结果值进行比较从而判断数据的完整性。应用程序编程文件(S19/HEX/BIN )都具有相应的校验机制,所以可以采取直接传送程序编 程文件行的方式;否则,用户需要在上位机软件中首先解析编程文件,再 将其中的地址和数据及代码封装打包成某种定制的通信协议,在 bootloader中还得对其进行解包,这样一来,略显麻烦,但有些主机厂为 了知识产权保护,有自己的bootloader协议,这种情况下,bootloader开 发者就必须按照主机厂的要求来开发;6. 一些正规的大主机厂要求其ECU供应商开发放入ECU bootloader必须基 于UDS等总线诊断协议,在 UDS中规定了相应的CAN ID给bootloader 使用,那么就必须在该类 ECU中的bootloader工程中加入相应的UDS协 议栈;3和5的注意事项都是为了满足Boot程序设计的安全要求,要特别重视。解析编程文件(S19/HEX/BIN )不同的MCU软件开发IDE编译链接生成的编程文件格式可能不同,但S19、HEX和BIN文件之间是可以相互转化的,所以只需要在bootloader中开一种编程文件的解析程序就可以了,其他的可以使用相应的转换工具(convert tool )在上位机上进行转换;MCU的软件开发IDE 一般都集成不 同编程文件之间的转换工具:比如 S32DS的objcopy (Create Flash Image )以及 Keil 的 Motorola S-Record to BINARY File Converter。解析编程文件的目的在于获得应用程序的程序代码和数据及其在NVM中的存储地址;为了解析编程文件必须先了解其中的编码格式和原理,常用的 S19、HEX 和BIN文件的格式说明请自行查阅。S19和HEX文件都是可以直接使用文本编辑器(比如记事本,notepad+ )打开的,只需要将包含地址和数据代码的 SI、S2和S3开始 的S19文件行合并即可,可以手动拷贝,也可以编写 window批处理脚本 来处理;当然也有专门的可以支持两个 S19文件的合并,网上可以找到很 多开源软件,比如常见的Srecord等;NVM驱动程序开发ECU的NVM 一般包括: MCU片内集成的用于存放数据的 EEPROM 或者Data-Flash;用于存储程序代码/数据的Code-Flash/Program-Flash; MPU 扩展的片外 NORFlash 或者 NAND-Flash ;NVM驱动程序的作用包括对NVM的擦除(erase )、编程(program )和校验(verify )等基本操 作;对 NVM 的加密(secure)/解密(unsecure )和加保护(protecTIon )/解 保护(unprotecTIon )操作。注意事项:1. MCU 片上集成的 NVM 中 EEPROM/D-Flash 和 C_Flash/P-Flash 一般属于 不同的block,所以可以直接在Flash上运行NVM驱动对EEPROM/D- Flash 进行擦除和编程操作;2. NVM驱动一般都是通过运行一个 NVM command序列,在其中通过 NVM 控制器寄存器给出不同的NVM操作命令代码、NVM编程数据和目标地址 的方式完成,典型的 NVM command 序列有(Freescale的S12(X)系列 MCU Flash write command 序列);3. 由于NVM的工作速度一般较CPU内核频率和总线频率低,所以运行 NVM驱动前必须对NVM进行初始化,将设置分频器其工作频率设置为正 常工作所需频率范围;4. MCU片内的NVM同一个block上不能运行NVM的驱动对其自身进行擦除和编程操作,否则会传出read while write 的总线访问冲突(每个 NVM block只有一条数据总线,一个时刻只能进行读出或者写入,不支持同时读 出和写入)。因此对于仅有一个 block Flash的MCU来说,就必须在 RAM中调用其NVM驱动,来对其自身进行擦除和编程操作,同时在 launch Flash command 到等待command完成期间必须关闭CPU全局中 断,禁止外设中断响应,否则取中断向量和运行中断ISR都会访问Flash。要使能中断,就必须将中断向量表偏移到 RAM或者NVM block(EEPROM/D-Flash )并将响应的中断ISR也拷贝到其他 RAM 或者NVM block上(当然该中断向量表也必须更新指导新的中断 ISR);5. 由于以上2的要求,通常需要将bootloader的NVM驱动拷贝到MCU的 RAM中运行,其可以将其完成的 NVM拷贝到RAM中运行,也可以只拷 贝NVM command launch 到等待command完成的几条指令到 RAM执行即 可,因为NVM驱动中其他操作(比如填写 NVM操作命令、写入编程地址 和数据等)并不会往占用数据总线上往 NVM中写入数据;6. NVM的驱动程序驻留在Flash中,如果出现堆栈溢出等意外程序跑飞意外 运行NVM驱动程序则会造成NVM内容意外擦除丢失或者修改的情况。因 此需要对关键数据或代码(比如bootloader本身)进行保护以防止意外修 改,或者更为安全的方法是*不将NVM驱动程序存放在NVM中,而是在 bootloader最开始通过上位机将其下载到 RAM中运行,bootloader结束后 将该区域RAM清除,*从而避免由于意外运行 NVM驱动程序造成的 NVM数据丢失和修改。7. 一般MCU厂商都会给出其MCU的NVM驱动库,用户可以使用该类库实 现NVM操作,如果是Freescale/NXP 的汽车级MCU,还可以使用 CodeWarrior IDE 集成的Processor Expert 生成相应的 NVM 驱动程序;02bootloader开发的其他要点1. bootloader与应用程序的关系:bootloader和应用程序分别是两个完整的 MCU软件工程,各自都由自己的 启动代码、main ()函数、链接文件、外设驱动程序和中断向量表;因此bootloader和应用程序的链接文件中,对 NVM的地址空间分配必须 分开独立,不能重叠(overlap ),但其RAM分配没有约束,两者都可以 使用整个RAM空间,因为跳转到应用工程后,将启动代码将重新初始化 RAM ;bootloader必须使用MCU默认的中断向量表,因为每次复位后 MCU都是 从其默认中断向量表的复位向量取地址执行的;应用程序的中断向量必须 进行偏移(通过相应的中断向量偏移寄存器,如S12(X)系列MCU的IVBR寄存器或者 ARM Cortex M 系列MCU的SCB-VTOR寄存器); 而NVM(P-Flash )的擦除都是按照sector进行的,所以为了充分利用 NVM(P-Flash )空间,都将bootloader分区到包含默认中断向量表的若干 NVM(P-Flash ) sector ( S12(X)系列 MCU 的 NVM 最后若干 sector, ARM Cortex M 系列MCU从0地址开始的若干sector );注意: 如果应用程序新过程中断电或者意外复位,则应用程序更新失败,相应的 应用程序完整性校验通不过,当然得重新下载,为了避免这种情况下应用 程序丢失,常常BootLoader需要对应用程序进行双备份,即使用两个不同 的NVM分区来保存应用程序,只有新的应用程序更新成功之后,才擦除 老的应用程序,否则下次复位之后还是运行老的应用程序2. boo tloader到应用程序的跳转方法:开发使用bootloader后,每次ECU复位之后都将首先运行bootloader,若 无远程应用程序下载请求则直接跳转到应用程序复位函数地址,这里面有 两个问题需要考虑:如何获得应用程序复位函数地址:方法有:1)通过链接文件固定应用程序 的复位启动函数地址;2)从应用程序中断向量表的复位向量地址获取;推 荐方法2):因为其灵活性好,每次应用程序变化后无需关心应用程序复位 函数被编译到了 NVM的具体地址,只
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号