0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

剖析汽车ECU的bootloader程序

汽车工程师 来源:汽车电子与软件 作者:freshcoolman 2021-09-24 10:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

BootLoad(简称Boot)是一种启动加载程序,或者称为引导程序,我们在操作系统嵌入式开发中经常用到,因为汽车ECU也是一种嵌入式系统,Boot程序主要用于ECU软件更新,汽车OTA升级,本文主要讲述汽车bootloader程序的工作原理和设计方法。

01

bootloader的功能

BootLoader,通常是驻留在ECU非易失性存储器(NVM,None Valitale Momory)中的一段程序加载代码,每次ECU复位后,都会运行bootloader。它会检查是否有来自通信总线的远程程序加载请求。

如果有,则进入bootloader模式,建立与程序下载端(通常为PC上位机)的总线通信并接收通信总线下载的应用程序、解析其地址和数据代码,运行NVM驱动程序,将其编程到NVM中,并校验其完整性,从而完成应用程序更新。

如果没有来自通信总线的远程程序加载请求,则直接跳转到应用程序复位入口函数(复位中断ISR,也称作Entry_Point()–使用Processor Expert的CodeWarrior 工程或者Startup()函数–普通CodeWarrior 工程),运行应用程序。

0880881a-10bd-11ec-8fb8-12bb97331649.png

因此,汽车ECU的bootloader三个主要的作用:

与远程程序下载端建立可靠的总线通信以获取要更新应用程序;

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

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

下面就围绕这三个方面展开讲述。

02

如何建立可靠的总线通信?

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

注意事项:

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

通信总线由ECU的MCU外设实现,所以在bootloader中必须开发相应的通信总线外设驱动程序,实现基本的数据发送和接收功能;

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

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

为了实现数据的可靠传输,一般在总线通信协议中添加信源编码,即在发送是对有效数据进行校验和或者ECC计算并将结果在通信数据帧中和有效数据一起发送,bootloader接收端,接收到数据帧后对有效数据域进行发送端同样的校验和或者ECC计算,得出结果与接收到的校验和或者ECC计算结果值进行比较从而判断数据的完整性。应用程序编程文件(S19/HEX/BIN)都具有相应的校验机制,所以可以采取直接传送程序编程文件行的方式;

否则,用户需要在上位机软件中首先解析编程文件,再将其中的地址和数据及代码封装打包成某种定制的通信协议,在bootloader中还得对其进行解包,这样一来,略显麻烦,但有些主机厂为了知识产权保护,有自己的bootloader协议,这种情况下,bootloader开发者就必须按照主机厂的要求来开发;

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

3和5的注意事项都是为了满足Boot程序设计的安全要求,要特别重视。

03

解析编程文件(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++)打开的,只需要将包含地址和数据代码的S1、S2和S3开始的S19文件行合并即可,可以手动拷贝,也可以编写window批处理脚本来处理;当然也有专门的可以支持两个S19文件的合并,网上可以找到很多开源软件,比如常见的Srecord等;

04

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

注意事项:

MCU片上集成的NVM中EEPROM/D-Flash和C_Flash/P-Flash一般属于不同的block,所以可以直接在Flash上运行NVM驱动对EEPROM/D-Flash进行擦除和编程操作;

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

由于NVM的工作速度一般较CPU内核频率和总线频率低,所以运行NVM驱动前必须对NVM进行初始化,将设置分频器其工作频率设置为正常工作所需频率范围;

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

由于以上2的要求,通常需要将bootloader的NVM驱动拷贝到MCU的RAM中运行,其可以将其完成的NVM拷贝到RAM中运行,也可以只拷贝NVM command launch到等待command完成的几条指令到RAM执行即可,因为NVM驱动中其他操作(比如填写NVM操作命令、写入编程地址和数据等)并不会往占用数据总线上往NVM中写入数据;

NVM的驱动程序驻留在Flash中,如果出现堆栈溢出等意外程序跑飞意外运行NVM驱动程序则会造成NVM内容意外擦除丢失或者修改的情况。因此需要对关键数据或代码(比如bootloader本身)进行保护以防止意外修改,或者更为安全的方法是**不将NVM驱动程序存放在NVM中,而是在bootloader最开始通过上位机将其下载到RAM中运行,bootloader结束后将该区域RAM清除,**从而避免由于意外运行NVM驱动程序造成的NVM数据丢失和修改。

一般MCU厂商都会给出其MCU的NVM驱动库,用户可以使用该类库实现NVM操作,如果是Freescale/NXP的汽车级MCU,还可以使用CodeWarrior IDE集成的Processor Expert生成相应的NVM驱动程序;

02

bootloader开发的其他要点

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. 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)的看门狗复位则属于硬件复位,其会将绝大部分外设(模拟时钟和外设)电路复位,更接近直接运行应用程序的情况。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19134

    浏览量

    404052
  • 编程
    +关注

    关注

    90

    文章

    3723

    浏览量

    97440
  • ecu
    ecu
    +关注

    关注

    14

    文章

    993

    浏览量

    57489
  • NVM
    NVM
    +关注

    关注

    1

    文章

    47

    浏览量

    19821

原文标题:技术|详解汽车ECU的bootloader程序

文章出处:【微信号:e700_org,微信公众号:汽车工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    L99PM62XP:汽车ECU电源管理的强大解决方案

    L99PM62XP:汽车ECU电源管理的强大解决方案 在汽车电子领域,电源管理集成电路(PMIC)对于电子控制单元(ECU)的稳定运行至关重要。L99PM62XP作为一款具备LIN和高
    的头像 发表于 03-12 16:50 316次阅读

    CAN协议的深度剖析

    单元(ECU)之间的高效通信问题。本文将从技术原理、帧结构、错误处理机制、应用场景及未来发展趋势等方面,对CAN协议进行深度剖析
    的头像 发表于 03-03 17:08 742次阅读
    CAN协议的深度<b class='flag-5'>剖析</b>

    L9952GXP:汽车ECU的高效电源管理解决方案

    L9952GXP:汽车ECU的高效电源管理解决方案 引言 在汽车电子领域,对于电源管理系统的要求日益严苛。高效、稳定且具备多种保护功能的电源管理IC成为了汽车
    的头像 发表于 02-27 15:50 292次阅读

    L9952GXP:汽车ECU的高效电源管理解决方案

    L9952GXP:汽车ECU的高效电源管理解决方案 引言 在汽车电子领域,电源管理系统IC对于确保电子控制单元(ECU)的稳定运行至关重要。STMicroelectronics的L99
    的头像 发表于 02-11 14:55 216次阅读

    USBISP/USBasp编程器给Atmega32U4下载Arduino bootloader引导程序

    对于新出厂的ATmega32U4芯片内部是没有arduino引导程序的,需要用户预先下载bootloader后才能用串口下载自己的应用程序.在某些罕见情况下旧的bootloader会导
    的头像 发表于 01-31 14:38 930次阅读
    USBISP/USBasp编程器给Atmega32U4下载Arduino <b class='flag-5'>bootloader</b>引导<b class='flag-5'>程序</b>

    汽车ECU系统基础芯片MC33989:功能、特性与应用全解析

    汽车ECU系统基础芯片MC33989:功能、特性与应用全解析 在汽车电子的世界里,发动机控制单元(ECU)堪称汽车的“心脏大脑”,高效稳定的
    的头像 发表于 01-30 17:20 807次阅读

    安富利汽车TSN ECU解决方案推动车载网络技术升级

    汽车向智能化、网联化狂奔的时代,车载网络早已不是简单的“信号传递通道”,而是支撑自动驾驶、智能座舱、车路协同的“神经网络”。新一代汽车ECU作为这个网络的核心节点,正朝着更强大、更可靠、更灵
    的头像 发表于 01-24 14:19 3379次阅读

    新能源汽车车载ECU出厂故障检测

    案例背景No.1新能源汽车车载ECU出厂故障检测,是保障整车安全与性能的核心前置环节。其通过模拟整车运行工况,对ECU硬件电路、软件逻辑及与电池、电机、电控等关键系统的通信适配性进行全面校验,精准
    的头像 发表于 01-08 14:18 1594次阅读
    新能源<b class='flag-5'>汽车</b>车载<b class='flag-5'>ECU</b>出厂故障检测

    新思科技Silver虚拟ECU平台重塑汽车软件创新范式

    汽车行业的软件定义汽车(SDV)架构中,涵盖电子控制单元(ECU)、区域控制单元(ZCU)和中央计算单元(CCU),软件复杂度与日俱增,导致开发周期冗长拖沓,延缓了嵌入式设备的部署。为应对这些挑战
    的头像 发表于 12-17 10:21 1762次阅读
    新思科技Silver虚拟<b class='flag-5'>ECU</b>平台重塑<b class='flag-5'>汽车</b>软件创新范式

    Bootloader固件升级的步骤

    一、Bootloader 概念及用处 1、BootLoader 是一段引导式程序,就是单片机启动时候运行的一段小程序,这段程序负责单片机固件
    发表于 11-19 07:41

    ECU刷写完全指南:从理论到实践

    ECU刷写是现代汽车电子开发中的核心环节,基于UDS诊断协议实现控制器软件的更新与维护。本文将以USBCANFD-400U接口卡为例,详细介绍CANFD总线环境下ECU刷写的标准流程与实操要点
    的头像 发表于 11-12 11:37 1437次阅读
    <b class='flag-5'>ECU</b>刷写完全指南:从理论到实践

    BootLoader app程序反复重启,IAP升级失败怎么处理?

    keil开发的BootLoader程序,用RT-Thread Studio开发的app程序,板子每次上电后,从BootLoader程序跳转到
    发表于 09-10 07:36

    MT6501可编程磁性角度传感器:提升汽车ECU位置反馈精度的利器

    在当今汽车行业飞速发展的时代,汽车的智能化和自动化程度越来越高。汽车电子控制单元(ECU)作为汽车的“大脑”,对
    的头像 发表于 07-30 17:40 966次阅读

    用是德示波器3000T X系列的手势操作简化汽车ECU复杂信号调试

    随着汽车电子技术的飞速发展,现代汽车中电子控制单元(ECU)的数量和复杂性不断增加。这些ECU负责管理车辆的各种功能,从发动机控制到安全系统,再到信息娱乐系统。因此,调试这些
    的头像 发表于 07-01 18:04 779次阅读
    用是德示波器3000T X系列的手势操作简化<b class='flag-5'>汽车</b><b class='flag-5'>ECU</b>复杂信号调试

    方案分享 | ARXML 规则下 ECU 总线通讯与 ADTF 测试方案

    汽车电子开发新进展:ARXML 规则与 ADTF 框架结合,实现 ECU 总线通讯高效测试
    的头像 发表于 06-25 09:53 3163次阅读
    方案分享 | ARXML 规则下 <b class='flag-5'>ECU</b> 总线通讯与 ADTF 测试方案