一文看懂汽车电子ECU bootloader工做原理及开发要点

随着半导体技术的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设愈来愈多,存储器也愈来愈大。消费者对于汽车节能(经济和法规对排放的要求)型、温馨性、互联性、安全性(功能安全和信息安全)的要求愈来愈高,特别是近年来新能源电动车、车联网和自动驾驶技术的兴起,更大大加速了汽车电子技术的发展。汽车电子ECU(Electronic Control Unit--电控单元)集成的功能日益复杂,为了应对软件远程(在线)功能升级(增长新的功能)和bug修复的需求、对bootLoader(启动加载程序)的需求愈来愈多。本文详细介绍了汽车电子ECU bootloader的通常性工做原理和开发要点,其适用于全部的汽车电子ECU bootloader开发。html

  

1、bootloader的功能编程

  BootLoader,顾名思义,就是驻留在ECU非易失性存储器中的一段程序加载代码,每次ECU复位后,都会运行bootloader。它会检查是否有来自通讯总线的远程程序加载请求,若是有,则进入bootloader模式,创建与程序下载端(一般为PC上位机)的总线通讯并接收通讯总线下载的应用程序、解析其地址和数据代码,运行NVM(None Valitale Momory--非易失性存储器)驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更新。若是没有来自通讯总线的远程程序加载请求,则直接跳转到应用程序复位入口函数(复位中断ISR,也称做Entry_Point()--使用Processor Expert的CodeWarrior 工程或者Startup()函数--普通CodeWarrior 工程),运行应用程序。安全

  基于此,汽车ECU的bootloader三大主要概念以下:编辑器

  与远程程序下载端创建可靠的总线通讯以获取要更新应用程序;函数

  解析应用程序编程文件(S19/HEX/BIN)得到其在NVM中的地址和程序代码及数据;工具

  运行NVM驱动将应用程序的代码和数据编程到NVM中并校验;开发工具

2、如何创建可靠的总线通讯?编码

  汽车ECU常见的数据总线有CAN和LIN,所以一般汽车ECU的bootloader都是经过CAN或者LIN下载数据的。固然也能够基于其余总线,好比基于SPI总线或者I2C总线(典型如一些带有安全监测的功能安全ECU,经过主MCU对功能安全监测MCU的程序进行升级)以及以太网(基于Enternet通讯的中控或者全液晶仪表的ECU以及下一代高速网关和ADAS ECU)。加密

  TIps:prototype

  a、不一样的ECU通讯总线不同,具体须要用到某种通讯总线取决于实际应用;

  b、通讯总线有ECU的MCU外设实现,因此在bootloader中必须开发相应的通讯总线外设驱动程序,实现基本的数据发送和接收功能;

  c、为了保证通讯的可靠性,必须开发一个基于通讯总线完善的通讯协议,应用程序下载端和bootloader之间须要创建请求命令(request command)、确认(acknowledge)、等待(block wait)、错误重传(error re-send)等机制----bootloader根据不一样的请求命令完成不一样的任务并确认操做是否完成(ACK)以及数据是否正被确完整的传输,若出现数据错误(经过校验和或者ECC实现),须要进行自动重传;

  d、应用程序下载端经过须要在PC上基于VC或者C#、QT、Labview等开发GUI软件,实现c中要求的总线通讯协议,通常在其底层都是经过调用相应的总线设备,如USB转CAN/LIN的转发器设备的动态库(DLL)的API接口来实现数据的收发,相应的总线USB转发设备都会提供相应的驱动库(DLL)。所以bootloader开发者通常还需具有必定的PC上位机软件开发能力;

  e、为了实现数据的可靠传输,通常在总线通讯协议中添加信源编码,即在发送是对有效数据进行校验和或者ECC计算并将结果在通讯数据帧中和有效数据一块儿发送,bootloader接收端,接收到数据帧后对有效数据域进行发送端一样的校验和或者ECC计算,得出结果与接收到的校验和或者ECC计算结果值进行比较从而判断数据的完整性。应用程序编程文件(S19/HEX/BIN)都具备相应的校验和机制,因此能够采起直接传送程序编程文件行的方式;不然,用户须要在上位机软件中首先解析编程文件,再将其中的地址和数据及代码封装打包成某种定制的通讯协议,在bootloader中还得对其进行解包,这样一来,略显麻烦,但有些主机厂(Car OEM)为了知识产权保护,有本身的bootloader协议,这种状况下,bootloader开发者就必须按照主机厂的要求来开发;

  f、一些正规的大主机厂要求其ECU供应商开发放入ECU bootloader必须基于UDS等总线诊断协议,在UDS中规定了相应的CAN ID给bootloader使用,那么久必须在该类ECU中的bootloader工程中加入相应的UDS协议栈;

  

3、解析编程文件(S19/HEX/BIN)

  不一样的MCU软件开发IDE编译连接生成的编程文件格式可能不一样,但S1九、HEX和BIN文件之间是能够相互转化的,因此只须要在bootloader中开一种编程文件的解析程序就能够了,其余的可使用相应的转换工具(convert tool)在上位机上进行转换;

  对编程文件的解析,目的在于得到应用程序的程序代码和数据及其在NVM中的存储地址;

  为了解析编程文件必须先了解其中的编码格式和原理,经常使用的S1九、HEX和BIN文件的格式说明请参考以下维基百科连接:

  S19文件:https://en.wikipedia.org/wiki/SREC_(file_format)

  HEX文件:https://en.wikipedia.org/wiki/Intel_HEX

  BIN文件:https://en.wikipedia.org/wiki/Binary_file

  TIps:

  S19和HEX文件都是能够直接使用文本编辑器(好比记事本,notepad++)打开的,只须要将包含地址和数据代码的S一、S2和S3开始的S19文件行合并便可,能够手动拷贝,也能够编写window批处理脚原本处理;固然也有专门的能够支持两个S19文件的合并,网上能够找到不少开源软件,好比常见的Srecord等;

  MCU的软件开发IDE通常都集成不一样编程文件之间的转换工具:好比S32DS的objcopy(Create Flash Image )

  以及Keil的Motorola S-Record to BINARY File Converter http://www.keil.com/download/docs/10.asp

4、NVM驱动程序开发

  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)操做。

  Tips:

  a、MCU片上集成的NVM中EEPROM/D-Flash和C_Flash/P-Flash通常属于不一样的block,因此能够直接在Flash上运行NVM驱动对EEPROM/D-Flash进行擦除和编程操做;

  b、NVM驱动通常都是经过运行一个NVM command序列,在其中经过NVM控制器寄存器给出不一样的NVM操做命令代码、NVM编程数据和目标地址的方式完成,典型的NVM command序列以下(Freescale的S12(X)系列MCU Flash write command 序列):

  

  c、因为NVM的工做速度通常较CPU内核频率和总线频率低,因此运行NVM驱动前必须对NVM进行初始化,将设置分频器其工做频率设置为正常工做所需频率范围;

  d、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);

  e、因为以上b的要求,一般须要将bootloader的NVM驱动拷贝到MCU的RAM中运行,其能够将其完成的NVM拷贝到RAM中运行,也能够只拷贝NVM command launch到等待command完成的几条指令到RAM执行便可,由于NVM驱动中其余操做(好比填写NVM操做命令、写入编程地址和数据等)并不会往占用数据总线上往NVM中写入数据;

  f、NVM的驱动程序驻留在Flash中,若是出现堆栈溢出等意外程序跑飞意外运行NVM驱动程序则会形成NVM内容意外擦除丢失或者修改的状况。所以须要对关键数据或代码(好比bootloader自己)进行保护以防止意外修改,或者更为安全的方法是不将NVM驱动程序存放在NVM中,而是在bootloader最开始经过上位机将其下载到RAM中运行,bootloader结束后将该区域RAM清除,从而避免因为意外运行NVM驱动程序形成的NVM数据丢失和修改。(PS:后续我会专门写一篇文章介绍相关的方法,尽请关注阅读)

  g、通常MCU厂商都会给出其MCU的NVM驱动库,用户可使用该类库实现NVM操做,若是是Freescale/NXP的汽车级MCU,还可使用CodeWarrior IDE集成的Processor Expert生成相应的NVM驱动程序;

5、bootloader开发的其余要点

  a、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);

  Tips:

  若是应用程序新过程当中断电或者意外复位,则应用程序更新失败,相应的应用程序完整性校验通不过,固然得从新下载,为了不这种状况下应用程序丢失,经常BootLoader须要对应用程序进行双备份,即便用两个不一样的NVM分区来保存应用程序,只有新的应用程序更新成功以后,才擦除老的应用程序,不然下次复位以后仍是运行老的应用程序

  b、bootloader到应用程序的跳转方法

  开发使用bootloader后,每次ECU复位以后都将首先运行bootloader,若无远程应用程序下载请求则直接跳转到应用程序复位函数地址,这里面有两个问题须要考虑:

  如何得到应用程序复位函数地址:方法有:1)经过连接文件固定应用程序的复位启动函数地址;2)从应用程序中断向量表的复位向量地址获取;推荐方法2):由于其灵活性好,每次应用程序变化后无需关心应用程序复位函数被编译到了NVM的具体地址,只须要将应用程序中断向量表中的复位向量取出运行便可:

  典型方法以下(假设S12(X)系列MCU的应用程序中断向量表基地址寄存器IVBR=0x7F):

  typedef void (*near tIsrFunc)(void);/* ISR prototype definition */

  word *Ptr; /*pointer used for ISR vector fecth*/

  Ptr = (word *)0x7FFE; /*get the ISR vector from the interrupt vector table of APP project */

  ((tIsrFunc)(*Ptr))(); /*covert and run*/

  跳转时机:方法有:1)bootloader更新完应用程序并校验其完整性OK以后,将用到的外设(好比CAN/LIN通讯总线模块、定时器、GPIO等)寄存器恢复到复位后的默认状态,而后直接跳转;bootloader更新完应用程序并校验其完整性OK以后,等待看门狗定时器超时溢出复位,在bootloader最开始判断无远程应用程序下载请求而跳转;推荐使用方法2):由于方法1)相对于软件复位,其跳转至应用程序复位启动函数时MCU的硬件环境与直接运行应用程序可能存在差别,而方法2)的看门狗复位则属于硬件复位,其会将绝大部分外设(模拟、时钟和外设)电路复位,更接近直接运行应用程序的状况。

  

  c、开发bootloader须要掌握的知识和调试方法技巧

  首先,开发bootloader须要对ECU所用的MCU的RAM和NVM资源十分清楚,而后对其进行分区,保证应用程序和bootloader的NVM分配没有重叠。因此必须了解所用软件开发工具IDE的连接文件的使用方法和编写规则;

  而后,须要判断中断向量表偏移是否成功,NVM驱动拷贝的地址和大小等信息,因此必须掌握所用软件开发工具IDE的编译连接结果中map文件的具体信息;

  此外,掌握如何将NVM函数重定向(将函数程序代码的存储地址和运行时地址分开)到RAM中执行的方法也十分有用;

  Tips:

  在开发应用程序时,须要先对其进行单独调试以保证其功能正常,这时虽然其外设中断向量表已经进行了偏移,但其复位向量必须的放置在默认中断向量表中复位向量所在的地址,不然下载后没法运行,进行正常调试,由于若是把应用程序的复位向量放在偏移后的应用程序中断向量表中,则默认的复位向量内容为0xFFFF(Flash擦除后的状态),CPU内核就会到0xFFFF的地址取指运行,显然不是真实的工程启动函数,因此没法运行,其结果跟一个新MCU未写入任何程序时上电运行的状况同样,会不断的出现非法地址复位;而在应用程序开发完成后,再将其偏移到应用程序中断向量中,以免与bootloader工程的Flash地址冲突;

  最后,掌握利用调试器的Hotsync或者attach方法加载elf文件中的调试信息对bootloader和应用程序进行无缝调试也是很是实用的,能够大大提升bootloader的调试效率;

  d、量产时bootloader和应用程序的下载方法

  推荐将bootloader和应用程序编译连接生成的编程文件进行合并,一次性使用量产工具(如Cyclone编程器)下载以提升生产效率。

 

引用地址:http://www.eeworld.com.cn/qcdz/article_2018042322465_2.html
相关文章
相关标签/搜索