1 记录一下bootloader升级Bug分析及复现最后解决的整个过程-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

记录一下bootloader升级Bug分析及复现最后解决的整个过程

汽车ECU开发 来源:汽车电子嵌入式 作者:Tomas Li 2022-11-22 09:03 次阅读

前言

这几天遇到一个bootloader升级的奇怪问题,分析问题的过程使用了一些常用的分析工具和方法觉得很有普遍性,这里记录一下Bug分析、复现最后解决的整个过程,希望能给大家带来一些启发。

正文

环境描述

ECU使用瑞萨公司的RH850芯片,bootloader支持应用的双分区刷写。

测试用例

当前程序处于A分区 --> 开始升级,跳入bootloader --> 升级A分区程序 --> 故障注入,跳过升级的0x34服务,直接开始0x36服务传输升级包程序

94742832-69fd-11ed-8abf-dac502259ad0.png

图1:Bootloader故障注入测试

94948c1c-69fd-11ed-8abf-dac502259ad0.png

图2:Bootloader升级常用的UDS服务ID

期望结果

Bootloader升级失败,0x11 01软件复位后Bootloader校验A分区失败(默认跳到A分区),程序跳到B分区,正常运行B分区程序。

94b79e14-69fd-11ed-8abf-dac502259ad0.png

图3:A分区升级失败后跳到B分区期望正常通信状态

实际结果

Bootloader升级失败,0x11 01软件复位后Bootloader校验A分区失败(默认跳到A分区),程序跳到B分区,程序的通信都异常(每次重启后只发出一帧报文,间隔很久又会发出一帧报),但是诊断功能是OK的。

94d68f9a-69fd-11ed-8abf-dac502259ad0.png

图4:A分区升级失败后跳到B分区实际异常通信状态

问题分析

1)诊断功能OK的,说明程序没有跑死,上电只发一帧报文很像是应用满足条件关闭通信了。ECU在以下三个状态下会关闭通信。

. IGOFF

.低电压(低于6.5V)

.低功耗模式 && 没有处于EOL(End Of Line,下线模式)

第一个和第二个条件直接测试外部硬件输入可以确定不可能满足。第三个条件需要诊断触发,理论上是不可能满足条件。

初步结论1:不是外部硬件输入状态导致关闭通信,也不是诊断时间关闭通信。

2)尝试各种正常情况下的刷写操作

. 处于A分区,刷A分区

. 处于A分区,刷B分区

. 处于B分区,刷A分区

. 处于B分区,刷B分区

结果,无论最后是在A分区还是B分区,通信都是正常的。

初步结论2:正常情况下的程序刷写都成功,且通信正常。

3)问题发生后ECU就一直处于故障状态了,这个时候可以考虑使用调试器的热插拔功能(Hot Plug-in,不重新Download程序到ECU当中,直接进入调试模式,ECU中运行的还是故障状态下的程序)。

调试上位机:RH850提供的CS+

调试仿真器:瑞萨专用的E2

94f65adc-69fd-11ed-8abf-dac502259ad0.png

图5:CS+的热插拔选项

95204e50-69fd-11ed-8abf-dac502259ad0.png

图6:CS+的调试器E2配置

图7:程序进入了低功耗状态下关闭通信的分支

按照1)中的分析,程序不可能进入低功耗状态下关闭通信的分支,除非是进行分支判断的全局变量被异常篡改了。

初步结论3:启动模式的全局变量被异常篡改,导致程序进入到低功耗模式下关闭通信了。

全局变量被异常篡改,一般是数组越界或者是指向全局变量的指针操作异常导致的,但是如果是这样的话,和升级没啥关系,无论最后跳到A分区还是B分区都会出现异常,所以应该不是程序本身的问题。

4)让测试同事在B分区进行故障注入测试。

. 当前处于B分区

. 升级B分区

. 跳过0x34开始传输数据服务

最后升级B分区失败,跳到A分区,A分区的通信是正常的。

初步结论4:B分区升级B分区进行故障注入后跳到A分区是正常的。

5)尝试自己复现问题。测试同事的测试用例是跳过0x34服务后开始传输数据,其实也就是A分区被擦除后升级失败,跳到了B分区。那么理论上我复现问题的时候,只要满足以下条件就能复现文:

. 当前处于A分区

. 开始升级程序

. 擦除完A分区数据

. 还没升级完A分区程序就断开物理连接,确保A分区升级失败

最后确实升级A分区失败,跳到了B分区,但是B分区的通信却是正常的。为什么自己的测试结果和测试同事的测试结果不一样了?-- 分析测试同事的测试用例:

. 开始升级

. 跳过0x34服务

. 0x36开始传输数据

和上面我的复现步骤对比,测试同学的测试用例因为跳过了0x34服务,所以ECU的A分区是完全被擦除的状态,我的操作是在程序刷写了一部分的情况下断开物理连接,所以A分区被擦除后又被写入部分数据。

6)vwin 测试同事的测试步骤。

擦除完A分区数据后还没开始传输A分区的数据就立马断开物理连接。

成功复现问题!!!

分析5)和6)两种操作,不同点就是擦除完A分区后数据后又往A分区写入了部分数据。写入的部分数据影响了A分区程序的运行。

7)使用瑞莎公司提供的RFPV(Renesas Flash Programmer)将5)和6)两种操作后的程序都读出来进行对比。

953f872a-69fd-11ed-8abf-dac502259ad0.png

图8:读取两种操作下的Flash中的程序

955e7cb6-69fd-11ed-8abf-dac502259ad0.png

图9:使用hexview工具对比B分区通信异常和B分区通信正常下的程序

异常情况下的程序从0x40000开始处数据是被擦除的,正常情况下的程序的0x40000开始的程序是有数据的。

为啥A分区0x40000处开始的数据会影响B分区的程序运行?

8)查看A分区和B分区的链接文件

957b3bf8-69fd-11ed-8abf-dac502259ad0.png

图10:A分区链接文件

9591e1aa-69fd-11ed-8abf-dac502259ad0.png

图11:B分区链接文件

找到问题,A分区和B分区的标定数据用的是同一块Flash地址!

9)修改B分区链接文件

95ace392-69fd-11ed-8abf-dac502259ad0.png

图12:修改B分区链接文件的标定量起始地址

最后上板验证通过,问题解决。

10)为啥标定量的数据被擦除后会影响到通信?-- 猜测是标定段数据被擦除后标定相关的协议数据读写异常,最后导致进行分支判断的全局变量被异常篡改了。目前还未想到验证猜想的办法。

总结

这个问题分析了足足一天,分析问题的过程很具有代表性:发现问题 --> 推测原因 -->验证猜想 --> 验证失败 -->对比分析推测-->猜测验证 -->成功解决,逐步抽丝剥茧,层层递进,最后解决问题。

希望对各位看官有所启示。中间还用到了调试器的热插拔功能,编程器的读取ECU程序的功能,hexview对比Hex文件的功能,这些功能在分析问题中经常用到。






审核编辑:刘清

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

    关注

    14

    文章

    886

    浏览量

    54482
  • bootloader
    +关注

    关注

    2

    文章

    235

    浏览量

    45611
  • EOL
    EOL
    +关注

    关注

    0

    文章

    10

    浏览量

    12248
  • rh850
    +关注

    关注

    2

    文章

    24

    浏览量

    4598

原文标题:Bootloader升级A分区失败跳到B分区后通信异常

文章出处:【微信号:eng2mot,微信公众号:汽车ECU开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    汽车ECU的Bootloader升级过程分析

    MCU正常运行时总是从固定地方取指令,顺序运行,程序更新时需要使用烧录器等工具烧录,于是有人将程序设计成,由个程序跳转到另个程序,这个程序通常称作Bootloader,另个叫做A
    的头像 发表于 04-20 10:31 1.3w次阅读

    project复现过程踩到坑对应的解决方案

    最近做的个 project 需要复现 EMNLP 2020 Findings 的 TinyBERT,本文是对复现过程对踩到坑,以及对应的解决方案和实现加速的
    的头像 发表于 08-19 11:09 1763次阅读

    STM32F745 USART1 Bootloader失败原因分析与解决

    使用 STM32F745 进行产品开发的时候,出现了使用 STM32CubeProgramer 无法通过 USART1 Bootloader 进行程序升级的问题。为了解决客户的问题,我在 NUCLEO-F746ZG 开发板上,复现
    的头像 发表于 01-13 10:33 2514次阅读
    STM32F745 USART1 <b class='flag-5'>Bootloader</b>失败原因<b class='flag-5'>分析</b>与解决

    STM32 Bootloader实现

    主要采用256000bps串口传输BIN文件数据,文件每10KB分为个数据包下发,同时控制LED作为简单的输出;最后做CRC校验,整个升级过程
    发表于 08-26 11:46

    无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析

    本文将针对客户无法使用内置Bootloader的DFU方式进行固件升级的问题进行分析
    发表于 08-06 09:52

    记录次STM32H743 CANFD调试过程中的BUG

    记录次STM32H743 CANFD调试过程中的BUG
    发表于 08-13 06:30

    bootloader的主要作用是什么

    :OTA:简介bootloader是嵌入式开发领域非常重要的环,特别是在商业领域。bootloader的主要作用是程序升级,也就是更新代码。俗话说得好,人非圣贤,孰能无过,我们写的代
    发表于 11-10 06:33

    记录一下UI界面的思路与main函数扫描问题

    在上篇文章中,转载了种上流的方法,使用状态机、函数指针、结构体、结构体指针等,异常的上流,但是有些bug。目录调试其他矩阵键盘扫描的思路暴力扫描另外记录
    发表于 01-18 07:18

    记录一下MCU存在ROM中的bootloader的三种方法

    网上查到的直接进入TIVA系列MCU存在ROM中的bootloader的三种方法,记录一下。使用 TM4C ROM bootloader 的三種方式:Flash Empty當 MCU
    发表于 02-14 06:45

    记录一下RK3399 GPIO电源域配置过程

    1、RK3399 GPIO配置问题/电源域配置  平台RK3399  OS Linux  Kernel 4.4  硬件需要拉高gpio1 A3来使能OTG功能,但是在配置dts后直没有电压,最后查下来是硬件与软件的电源域配置不
    发表于 11-08 17:40

    Bootloader是什么Bootloader的介绍和过程详细解

    3.Bootloader工作模式 4.Bootloader启动过程5.vivi Bootloader源代码分析 6.vivi
    发表于 12-11 17:33 48次下载
    <b class='flag-5'>Bootloader</b>是什么<b class='flag-5'>Bootloader</b>的介绍和<b class='flag-5'>过程</b>详细解

    单片机的Bootloader可以实现用户轻松升级程序

    并存储在规定的Flash中。 这个过程与手机端更新APP类似。 以STM8单片机为例,该如何实现Bootloader呢?今天和大家分享一下。 01 什么是Bootloader
    的头像 发表于 10-23 16:57 4960次阅读
    单片机的<b class='flag-5'>Bootloader</b>可以实现用户轻松<b class='flag-5'>升级</b>程序

    介绍一下CAN Bootloader整个实现过程

    对于大多数汽车软件开发者来说,从客户需求的角度,他们更多关心Bootloader的下载模式。
    发表于 06-29 11:13 1814次阅读
    介绍<b class='flag-5'>一下</b>CAN <b class='flag-5'>Bootloader</b>的<b class='flag-5'>整个</b>实现<b class='flag-5'>过程</b>

    记录一下uboot编译的问题

    前几天编译uboot时遇到些问题,先记录一下,linux嵌入式开发还是蛮意思的,要想玩的溜,就必须掌握最基本的uboot、kernel移植、适配、裁剪。
    的头像 发表于 07-21 16:05 857次阅读
    <b class='flag-5'>记录</b><b class='flag-5'>一下</b>uboot编译的问题

    某些bug正常运行时会出现,当打开串口log时又不再复现怎么办?

    。但是在某些情况,当我们打开串口log时,这些bug就不再复现了。 这种情况,我们需要考虑以下几个方面来解决这个问题。 首先,我们需要确定一下
    的头像 发表于 10-31 14:37 373次阅读