1. bootloader的功能
2. 如何建立可靠的总线通信?
3. 解析编程文件(S19/HEX/BIN)

4. NVM驱动程序开拓要点详解
5. bootloader开拓的其他要点
a. bootloader与运用程序的关系
b. bootloader到运用程序的跳转方法
c. 开拓bootloader须要节制的知识和调试方法技巧
d.量产时bootloader和运用程序的下载方法
总结
弁言一方面,随着半导体技能的不断进步(按照摩尔定律),MCU内部集成的逻辑功能外设越来越多,存储器也越来越大;另一方面,消费者对付汽车节能(经济和法规对排放的哀求)型、舒适性、互联性、安全性(功能安全和信息安全)的哀求越来越高,特殊是近年来新能源电动车、车联网和自动驾驶技能的兴起,更大大加速了汽车电子技能的发展。汽车电子ECU(Electronic Control Unit--电控单元)集成的功能日益繁芜,为了应对软件远程(在线)功能升级(增加新的功能)和bug修复的需求、对bootloader(启动加载程序)的需求越来越多。因此,本文将详细先容汽车电子ECU BootLoader的开拓要点,以供大家参考学习。
1. bootloader的功能Bootloader,顾名思义,便是驻留在ECU非易失落性存储器(None Valitale Momory--NVM,非易失落性存储器)中的一段运用程序加载代码,每次ECU复位后,都会而且必定首先运行bootloader。它会检讨是否有来自通信总线的远程程序加载要求,如果有,则进入bootloader模式,建立与程序下载端(常日为PC上位机,也称作bootloader host,当然也可以是其他ECU,比如汽车的车身掌握模块(BCM)或者中心网关掌握器(Central Gateway))的总线通信并吸收通信总线下载的运用程序、解析其地址和数据代码,运行NVM驱动程序,将其编程到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)。
实现要点
a. 不同的ECU通信总线不一样,详细须要用到某种通信总线取决于实际运用;
b.通信总线由ECU的MCU外设实现,以是在bootloader中必须开拓相应的通信总线外设驱动程序,实现基本的数据发送和吸收功能;
c.为了担保通信的可靠性,必须开拓一个基于通信总线的完善通信协议,运用程序下载端和bootloader之间须要建立要求命令(request command)、确认(ACK)、等待(block wait)、缺点重传(error re-send)等机制----bootloader根据不同的要求命令完身分歧的任务并确认操作是否完成(ACK)以及数据是否正被确完全的传输,若涌现数据缺点(通过校验和CRC或者ECC实现),须要进行自动重传;
d. 运用程序下载端通过须要在PC上基于VC或者C#、QT、Labview,Python等开拓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编译链接天生的编程文件格式可能不同,但S19、HEX和BIN文件之间是可以相互转化的,以是只须要在bootloader中开一种编程文件的解析程序就可以了,其他的可以利用相应的转换工具(convert tool)在上位机上进行转换;
对编程文件的解析,目的在于得到运用程序的程序代码和数据及其在NVM中的存储地址;
为理解析编程文件必须先理解个中的编码格式和事理,常用的S19、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:MCU的软件开拓IDE一样平常都集身分歧编程文件之间的转换工具:比如S32DS的objcopy(Create Flash Image )以及Keil MDK的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)操作。
实现要点
a. MCU片上集成的NVM中EEPROM/D-Flash和C_Flash/P-Flash一样平常属于不同的RWW(Read While Write)block,以是可以直接在Flash上运行NVM驱动对EEPROM/D-Flash进行擦除和编程操作;
b. NVM驱动一样平常都是通过运行一个NVM command序列,在个中通过NVM掌握器寄存器给出不同的NVM操作命令代码、NVM编程数据和目标地址的办法完成,范例的NVM command序列如下(Freescale的S12(X)系列MCU Flash write command 序列):
范例嵌入式MCU Flash命令序列
c. 由于NVM的事情速率一样平常较CPU内核频率和总线频率低,以是运行NVM驱动前必须对NVM进行初始化,将设置分频器其事情频率设置为正常事情所需频率范围;
d. MCU片内的NVM同一个RWW分区block上不能运行NVM的驱动对其自身进行擦除和编程操作,否则会传出RWW的总线访问冲突(每个NVM block只有一条数据总线,一个时候只能进行读出或者写入,不支持同时读出和写入)。因此对付仅有一个RWW block Flash的MCU来说,就必须在RAM中调用其NVM驱动,来对其自身进行擦除和编程操作,同时在launch Flash command到等待command完成期间必须关闭CPU全局中断,禁止外设中断相应,否则取中断向量和运行中断ISR都会访问Flash。要使能中断,就必须将中断向量表偏移到RAM或者NVM block(EEPROM/D-Flash)并将相应的中断ISR及其调用的所有代码也拷贝到其他RAM或者NVM RWW分区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 vs.运用程序(APP)内存分配
因此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/ /when jump to APP / 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编程器)下载以提高生产效率。
Tips:S19和HEX文件都是可以直策应用文本编辑器(比如记事本,notepad++)打开的,只须要将包含地址和数据代码的S1、S2和S3开始的S19文件行合并即可,可以手动拷贝,也可以编写window批处理脚本来处理;当然也有专门的Flash编程文件来合并,网上可以找到很多开源软件,比如常见的Srecord等;BIN文件则只能利用专门的软件来实现合并了。比如hex-view,J-Flash等;
总结
本文详细先容了汽车电子ECU bootloader的一样平常性事情事理和开拓要点,实在用于所有的汽车电子ECU bootloader开拓,当然不同的MCU其软件开拓工具IDE和CPU内核对中断的处理机制等各不相同,所往后续我还将连续推出系列"大众年夜众号文章,先容S12(X)系列MCU、MagniV S12Z系列MCU和Qorivva MPC56xx/57xx系列MCU以及KEA/S32K系列MCU的bootloader开拓实例先容,并供应相应的demo工程供大家参考学习,敬请关注!
胡恩伟
NXP汽车电子FAE
2017年9月17日于山城·重庆
2020年2月7日重新修订揭橥于今日头条订阅号