0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

記錄一下bootloader升級(jí)Bug分析及復(fù)現(xiàn)最后解決的整個(gè)過(guò)程

汽車ECU開發(fā) ? 來(lái)源:汽車電子嵌入式 ? 作者:Tomas Li ? 2022-11-22 09:03 ? 次閱讀

前言

這幾天遇到一個(gè)bootloader升級(jí)的奇怪問題,分析問題的過(guò)程使用了一些常用的分析工具和方法覺得很有普遍性,這里記錄一下Bug分析、復(fù)現(xiàn)最后解決的整個(gè)過(guò)程,希望能給大家?guī)?lái)一些啟發(fā)。

正文

環(huán)境描述

ECU使用瑞薩公司的RH850芯片,bootloader支持應(yīng)用的雙分區(qū)刷寫。

測(cè)試用例

當(dāng)前程序處于A分區(qū) --> 開始升級(jí),跳入bootloader --> 升級(jí)A分區(qū)程序 --> 故障注入,跳過(guò)升級(jí)的0x34服務(wù),直接開始0x36服務(wù)傳輸升級(jí)包程序

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

圖1:Bootloader故障注入測(cè)試

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

圖2:Bootloader升級(jí)常用的UDS服務(wù)ID

期望結(jié)果

Bootloader升級(jí)失敗,0x11 01軟件復(fù)位后Bootloader校驗(yàn)A分區(qū)失?。J(rèn)跳到A分區(qū)),程序跳到B分區(qū),正常運(yùn)行B分區(qū)程序。

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

圖3:A分區(qū)升級(jí)失敗后跳到B分區(qū)期望正常通信狀態(tài)

實(shí)際結(jié)果

Bootloader升級(jí)失敗,0x11 01軟件復(fù)位后Bootloader校驗(yàn)A分區(qū)失敗(默認(rèn)跳到A分區(qū)),程序跳到B分區(qū),程序的通信都異常(每次重啟后只發(fā)出一幀報(bào)文,間隔很久又會(huì)發(fā)出一幀報(bào)),但是診斷功能是OK的。

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

圖4:A分區(qū)升級(jí)失敗后跳到B分區(qū)實(shí)際異常通信狀態(tài)

問題分析

1)診斷功能OK的,說(shuō)明程序沒有跑死,上電只發(fā)一幀報(bào)文很像是應(yīng)用滿足條件關(guān)閉通信了。ECU在以下三個(gè)狀態(tài)下會(huì)關(guān)閉通信。

. IGOFF

.低電壓(低于6.5V)

.低功耗模式 && 沒有處于EOL(End Of Line,下線模式)

第一個(gè)和第二個(gè)條件直接測(cè)試外部硬件輸入可以確定不可能滿足。第三個(gè)條件需要診斷觸發(fā),理論上是不可能滿足條件。

初步結(jié)論1:不是外部硬件輸入狀態(tài)導(dǎo)致關(guān)閉通信,也不是診斷時(shí)間關(guān)閉通信。

2)嘗試各種正常情況下的刷寫操作

. 處于A分區(qū),刷A分區(qū)

. 處于A分區(qū),刷B分區(qū)

. 處于B分區(qū),刷A分區(qū)

. 處于B分區(qū),刷B分區(qū)

結(jié)果,無(wú)論最后是在A分區(qū)還是B分區(qū),通信都是正常的。

初步結(jié)論2:正常情況下的程序刷寫都成功,且通信正常。

3)問題發(fā)生后ECU就一直處于故障狀態(tài)了,這個(gè)時(shí)候可以考慮使用調(diào)試器的熱插拔功能(Hot Plug-in,不重新Download程序到ECU當(dāng)中,直接進(jìn)入調(diào)試模式,ECU中運(yùn)行的還是故障狀態(tài)下的程序)。

調(diào)試上位機(jī):RH850提供的CS+

調(diào)試仿真器:瑞薩專用的E2

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

圖5:CS+的熱插拔選項(xiàng)

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

圖6:CS+的調(diào)試器E2配置

圖7:程序進(jìn)入了低功耗狀態(tài)下關(guān)閉通信的分支

按照1)中的分析,程序不可能進(jìn)入低功耗狀態(tài)下關(guān)閉通信的分支,除非是進(jìn)行分支判斷的全局變量被異常篡改了。

初步結(jié)論3:?jiǎn)?dòng)模式的全局變量被異常篡改,導(dǎo)致程序進(jìn)入到低功耗模式下關(guān)閉通信了。

全局變量被異常篡改,一般是數(shù)組越界或者是指向全局變量的指針操作異常導(dǎo)致的,但是如果是這樣的話,和升級(jí)沒啥關(guān)系,無(wú)論最后跳到A分區(qū)還是B分區(qū)都會(huì)出現(xiàn)異常,所以應(yīng)該不是程序本身的問題。

4)讓測(cè)試同事在B分區(qū)進(jìn)行故障注入測(cè)試。

. 當(dāng)前處于B分區(qū)

. 升級(jí)B分區(qū)

. 跳過(guò)0x34開始傳輸數(shù)據(jù)服務(wù)

最后升級(jí)B分區(qū)失敗,跳到A分區(qū),A分區(qū)的通信是正常的。

初步結(jié)論4:B分區(qū)升級(jí)B分區(qū)進(jìn)行故障注入后跳到A分區(qū)是正常的。

5)嘗試自己復(fù)現(xiàn)問題。測(cè)試同事的測(cè)試用例是跳過(guò)0x34服務(wù)后開始傳輸數(shù)據(jù),其實(shí)也就是A分區(qū)被擦除后升級(jí)失敗,跳到了B分區(qū)。那么理論上我復(fù)現(xiàn)問題的時(shí)候,只要滿足以下條件就能復(fù)現(xiàn)文:

. 當(dāng)前處于A分區(qū)

. 開始升級(jí)程序

. 擦除完A分區(qū)數(shù)據(jù)

. 還沒升級(jí)完A分區(qū)程序就斷開物理連接,確保A分區(qū)升級(jí)失敗

最后確實(shí)升級(jí)A分區(qū)失敗,跳到了B分區(qū),但是B分區(qū)的通信卻是正常的。為什么自己的測(cè)試結(jié)果和測(cè)試同事的測(cè)試結(jié)果不一樣了?-- 分析測(cè)試同事的測(cè)試用例:

. 開始升級(jí)

. 跳過(guò)0x34服務(wù)

. 0x36開始傳輸數(shù)據(jù)

和上面我的復(fù)現(xiàn)步驟對(duì)比,測(cè)試同學(xué)的測(cè)試用例因?yàn)樘^(guò)了0x34服務(wù),所以ECU的A分區(qū)是完全被擦除的狀態(tài),我的操作是在程序刷寫了一部分的情況下斷開物理連接,所以A分區(qū)被擦除后又被寫入部分?jǐn)?shù)據(jù)。

6)模擬測(cè)試同事的測(cè)試步驟。

擦除完A分區(qū)數(shù)據(jù)后還沒開始傳輸A分區(qū)的數(shù)據(jù)就立馬斷開物理連接。

成功復(fù)現(xiàn)問題!!!

分析5)和6)兩種操作,不同點(diǎn)就是擦除完A分區(qū)后數(shù)據(jù)后又往A分區(qū)寫入了部分?jǐn)?shù)據(jù)。寫入的部分?jǐn)?shù)據(jù)影響了A分區(qū)程序的運(yùn)行。

7)使用瑞莎公司提供的RFPV(Renesas Flash Programmer)將5)和6)兩種操作后的程序都讀出來(lái)進(jìn)行對(duì)比。

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

圖8:讀取兩種操作下的Flash中的程序

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

圖9:使用hexview工具對(duì)比B分區(qū)通信異常和B分區(qū)通信正常下的程序

異常情況下的程序從0x40000開始處數(shù)據(jù)是被擦除的,正常情況下的程序的0x40000開始的程序是有數(shù)據(jù)的。

為啥A分區(qū)0x40000處開始的數(shù)據(jù)會(huì)影響B(tài)分區(qū)的程序運(yùn)行?

8)查看A分區(qū)和B分區(qū)的鏈接文件

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

圖10:A分區(qū)鏈接文件

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

圖11:B分區(qū)鏈接文件

找到問題,A分區(qū)和B分區(qū)的標(biāo)定數(shù)據(jù)用的是同一塊Flash地址!

9)修改B分區(qū)鏈接文件

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

圖12:修改B分區(qū)鏈接文件的標(biāo)定量起始地址

最后上板驗(yàn)證通過(guò),問題解決。

10)為啥標(biāo)定量的數(shù)據(jù)被擦除后會(huì)影響到通信?-- 猜測(cè)是標(biāo)定段數(shù)據(jù)被擦除后標(biāo)定相關(guān)的協(xié)議數(shù)據(jù)讀寫異常,最后導(dǎo)致進(jìn)行分支判斷的全局變量被異常篡改了。目前還未想到驗(yàn)證猜想的辦法。

總結(jié)

這個(gè)問題分析了足足一天,分析問題的過(guò)程很具有代表性:發(fā)現(xiàn)問題 --> 推測(cè)原因 -->驗(yàn)證猜想 --> 驗(yàn)證失敗 -->對(duì)比分析推測(cè)-->猜測(cè)驗(yàn)證 -->成功解決,逐步抽絲剝繭,層層遞進(jìn),最后解決問題。

希望對(duì)各位看官有所啟示。中間還用到了調(diào)試器的熱插拔功能,編程器的讀取ECU程序的功能,hexview對(duì)比Hex文件的功能,這些功能在分析問題中經(jīng)常用到。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ecu
    ecu
    +關(guān)注

    關(guān)注

    14

    文章

    853

    瀏覽量

    54217
  • bootloader
    +關(guān)注

    關(guān)注

    2

    文章

    232

    瀏覽量

    45368
  • EOL
    EOL
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    12211
  • rh850
    +關(guān)注

    關(guān)注

    2

    文章

    24

    瀏覽量

    4538

原文標(biāo)題:Bootloader升級(jí)A分區(qū)失敗跳到B分區(qū)后通信異常

文章出處:【微信號(hào):eng2mot,微信公眾號(hào):汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    汽車ECU的Bootloader升級(jí)過(guò)程分析

    MCU正常運(yùn)行時(shí)總是從固定地方取指令,順序運(yùn)行,程序更新時(shí)需要使用燒錄器等工具燒錄,于是有人將程序設(shè)計(jì)成,由個(gè)程序跳轉(zhuǎn)到另個(gè)程序,這個(gè)程序通常稱作Bootloader,另個(gè)叫做A
    的頭像 發(fā)表于 04-20 10:31 ?1.2w次閱讀

    project復(fù)現(xiàn)過(guò)程踩到坑對(duì)應(yīng)的解決方案

    最近做的個(gè) project 需要復(fù)現(xiàn) EMNLP 2020 Findings 的 TinyBERT,本文是對(duì)復(fù)現(xiàn)過(guò)程對(duì)踩到坑,以及對(duì)應(yīng)的解決方案和實(shí)現(xiàn)加速的
    的頭像 發(fā)表于 08-19 11:09 ?1671次閱讀

    STM32F745 USART1 Bootloader失敗原因分析與解決

    使用 STM32F745 進(jìn)行產(chǎn)品開發(fā)的時(shí)候,出現(xiàn)了使用 STM32CubeProgramer 無(wú)法通過(guò) USART1 Bootloader 進(jìn)行程序升級(jí)的問題。為了解決客戶的問題,我在 NUCLEO-F746ZG 開發(fā)板上,復(fù)現(xiàn)
    的頭像 發(fā)表于 01-13 10:33 ?2331次閱讀
    STM32F745 USART1 <b class='flag-5'>Bootloader</b>失敗原因<b class='flag-5'>分析</b>與解決

    STM32 Bootloader實(shí)現(xiàn)

    主要采用256000bps串口傳輸BIN文件數(shù)據(jù),文件每10KB分為個(gè)數(shù)據(jù)包下發(fā),同時(shí)控制LED作為簡(jiǎn)單的輸出;最后做CRC校驗(yàn),整個(gè)升級(jí)過(guò)程
    發(fā)表于 08-26 11:46

    記錄次STM32H743 CANFD調(diào)試過(guò)程中的BUG

    記錄次STM32H743 CANFD調(diào)試過(guò)程中的BUG
    發(fā)表于 08-13 06:30

    bootloader的主要作用是什么

    :OTA:簡(jiǎn)介bootloader是嵌入式開發(fā)領(lǐng)域非常重要的環(huán),特別是在商業(yè)領(lǐng)域。bootloader的主要作用是程序升級(jí),也就是更新代碼。俗話說(shuō)得好,人非圣賢,孰能無(wú)過(guò),我們寫的代
    發(fā)表于 11-10 06:33

    記錄一下UI界面的思路與main函數(shù)掃描問題

    在上篇文章中,轉(zhuǎn)載了種上流的方法,使用狀態(tài)機(jī)、函數(shù)指針、結(jié)構(gòu)體、結(jié)構(gòu)體指針等,異常的上流,但是有些bug。目錄調(diào)試其他矩陣鍵盤掃描的思路暴力掃描另外記錄
    發(fā)表于 01-18 07:18

    記錄一下MCU存在ROM中的bootloader的三種方法

    網(wǎng)上查到的直接進(jìn)入TIVA系列MCU存在ROM中的bootloader的三種方法,記錄一下。使用 TM4C ROM bootloader 的三種方式:Flash Empty當(dāng) MCU
    發(fā)表于 02-14 06:45

    使用OTA升級(jí)的方法更新帶ymodem bootloader的rbl文件

    bootloader 的 rbl 文件,方便部分朋友的操作。步驟1使用 ota 升級(jí)的方法,更新下面的 rtthread.rbl 文件。發(fā)張 OTA 過(guò)程中的圖片。!??! 特別需
    發(fā)表于 09-27 10:59

    記錄一下RK3399 GPIO電源域配置過(guò)程

    1、RK3399 GPIO配置問題/電源域配置  平臺(tái)RK3399  OS Linux  Kernel 4.4  硬件需要拉高gpio1 A3來(lái)使能OTG功能,但是在配置dts后直沒有電壓,最后查下來(lái)是硬件與軟件的電源域配置不
    發(fā)表于 11-08 17:40

    Bootloader是什么Bootloader的介紹和過(guò)程詳細(xì)解

    3.Bootloader工作模式 4.Bootloader啟動(dòng)過(guò)程5.vivi Bootloader源代碼分析 6.vivi
    發(fā)表于 12-11 17:33 ?45次下載
    <b class='flag-5'>Bootloader</b>是什么<b class='flag-5'>Bootloader</b>的介紹和<b class='flag-5'>過(guò)程</b>詳細(xì)解

    單片機(jī)的Bootloader可以實(shí)現(xiàn)用戶輕松升級(jí)程序

    并存儲(chǔ)在規(guī)定的Flash中。 這個(gè)過(guò)程與手機(jī)端更新APP類似。 以STM8單片機(jī)為例,該如何實(shí)現(xiàn)Bootloader呢?今天和大家分享一下。 01 什么是Bootloader
    的頭像 發(fā)表于 10-23 16:57 ?4858次閱讀
    單片機(jī)的<b class='flag-5'>Bootloader</b>可以實(shí)現(xiàn)用戶輕松<b class='flag-5'>升級(jí)</b>程序

    介紹一下CAN Bootloader整個(gè)實(shí)現(xiàn)過(guò)程

    對(duì)于大多數(shù)汽車軟件開發(fā)者來(lái)說(shuō),從客戶需求的角度,他們更多關(guān)心Bootloader的下載模式。
    發(fā)表于 06-29 11:13 ?1502次閱讀
    介紹<b class='flag-5'>一下</b>CAN <b class='flag-5'>Bootloader</b>的<b class='flag-5'>整個(gè)</b>實(shí)現(xiàn)<b class='flag-5'>過(guò)程</b>

    記錄一下uboot編譯的問題

    前幾天編譯uboot時(shí)遇到些問題,先記錄一下,linux嵌入式開發(fā)還是蠻意思的,要想玩的溜,就必須掌握最基本的uboot、kernel移植、適配、裁剪。
    的頭像 發(fā)表于 07-21 16:05 ?724次閱讀
    <b class='flag-5'>記錄</b><b class='flag-5'>一下</b>uboot編譯的問題

    某些bug正常運(yùn)行時(shí)會(huì)出現(xiàn),當(dāng)打開串口log時(shí)又不再復(fù)現(xiàn)怎么辦?

    。但是在某些情況,當(dāng)我們打開串口log時(shí),這些bug就不再復(fù)現(xiàn)了。 這種情況,我們需要考慮以下幾個(gè)方面來(lái)解決這個(gè)問題。 首先,我們需要確定一下
    的頭像 發(fā)表于 10-31 14:37 ?301次閱讀