吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

利用Swap模式實現代碼回滾操作

瑞薩MCU小百科 ? 來源:瑞薩MCU小百科 ? 作者:瑞薩MCU小百科 ? 2024-06-19 15:45 ? 次閱讀

前面介紹了MCUboot的基礎知識,您可通過上方鏈接回顧歷史文章,上次介紹了Swap模式,本次著重介紹利用Swap模式實現代碼回滾操作。在某些應用場景中,可能新版本的Firmware存在bug而需要返回至上一次的固件。

可以利用本文描述的這種方式實現以上目標。燒寫在Secondary Slot中的Image有一次運行的機會,即上電后在Bootloader控制下完成一次Swap操作,Secondary Slot中的高版本代碼被交換到Primary Slot中執行,在執行的過程中,根據某個函數的返回結果,在Trailer中對目標地址進行置位。

本文以RA4M2 512K Code Flash產品為例,使用Flat mode(不啟用TrustZone)說明Swap模式進行升級時的注意事項。

首先回顧一下Swap模式升級的流程。

a5e3cf74-2d28-11ef-a4c8-92fbcf53809c.png

MCUboot Swap模式圖解

從代碼框架來看,整體劃分為三部分,Bootloader,Primary Slot(保存了低版本的User Application v1.0)和Secondary Slot(保存了待更新的高版本User Application v2.0)。

初始狀態下,芯片中燒錄了Bootloader和Primary Slot,代碼從Bootloader處啟動,跳轉至Primary Slot中的User Application v1.0。在User Application v1.0運行過程中,接收來自外部的更高版本Firmware v2.0,并燒寫到Secondary Slot中,燒寫完成后,執行軟件復位Software reset,代碼重新從Bootloader開始運行。此時Bootloader判斷Secondary Slot中有待更新的Image,檢查其完整性等,校驗通過后,將Secondary Slot中的內容和Primary Slot中的內容交換(利用Scratch area作為暫存區域)。然后跳轉到Primary Slot中執行。比較升級操作的初始狀態和終止狀態,發現Primary Slot中運行的代碼從低版本的v1.0變為高版本的v2.0。

假如以當前升級操作的最后一個階段為新的起點,下次軟件復位后(以及之后的每次軟件復位),Bootloader會根據Trailer中的內容判斷,不需要重新執行swap操作了。

本次我們更改Bootloader的設定,如下所示,將兩種Image分別燒寫進Secondary Slot中,檢查升級的結果。

燒寫到Secondary Slot中的代碼版本均為v1.1.0,但是代碼有區別。

第一種代碼閃爍兩個LED(藍色和紅色),代碼中會調用boot_set_confirmed()函數

第二種代碼閃爍一個LED(藍色),代碼中并不調用boot_set_confirmed()函數

基于同樣的Bootloader和Primary Slot Application v1.0.0代碼,在Secondary Slot中燒寫兩種代碼,檢查升級后的狀態。

1修改Bootloader MCUboot選項

基于上次Swap模式的基礎工程,修改其中的關鍵配置Signing and Encryption Options → Custom,從--confirm更新為--pad,其他保持不變。

a612bc62-2d28-11ef-a4c8-92fbcf53809c.png

FSP中MCUboot Signing and Encryption Options屬性--pad

2創建第一種Application Project

創建一個Blinky Project,命名為ra4m2_app_v1,采用默認的Blinky模板,使得EK-RA4M2上的三個LED閃爍。

依次添加Build Variables → BootloaderDataFile,Environment Variable中設定MCUBOOT_IMAGE_SIGN_KEY和MCUBOOT_IMAGE_VERSION (設定為v1.0.0)。

導入ra4m2_app_v1且重命名為ra4m2_app_v2,從默認的閃爍三個LED改為兩個LED。

依次添加Build Variables → BootloaderDataFile,Environment Variable中設定MCUBOOT_IMAGE_SIGN_KEY和MCUBOOT_IMAGE_VERSION (設定為v1.1.0)。

在FSP → Stack中添加Bootloader → MCUboot Image Utilities

a64f8048-2d28-11ef-a4c8-92fbcf53809c.png

Application Project中添加MCUboot Image Utilities

根據錯誤提示,添加Flash driver,之后修改General屬性,如下圖所示,指向Bootloader所在路徑。

a6783862-2d28-11ef-a4c8-92fbcf53809c.png

Application Project中添加MCUboot Image Utilities

Build Project,可以看到以“0 errors”提示編譯完成。

a6a1adb4-2d28-11ef-a4c8-92fbcf53809c.png

對Application Project Build時輸出的Log

3創建第二種Application Project

導入第二步創建的project,并重命名ra4m2_app_v2_confirmed,從閃爍兩個LED改為一個LED。

依次添加Build Variables → BootloaderDataFile,Environment Variable中設定MCUBOOT_IMAGE_SIGN_KEY和MCUBOOT_IMAGE_VERSION (設定為v1.2.0)。

在FSP → Stack中添加Bootloader → MCUboot Image Utilities

a64f8048-2d28-11ef-a4c8-92fbcf53809c.png

Application Project中添加MCUboot Image Utilities

根據錯誤提示,添加Flash driver,之后修改General屬性,如下圖所示,指向Bootloader所在路徑。

a6783862-2d28-11ef-a4c8-92fbcf53809c.png

Application Project中添加MCUboot Image Utilities

在hal_entry.c中增加調用函數boot_set_confirmed()函數。

將光標放在hal_entry()函數入口處,打開Developer Assistant,點選Confirm Primary Image,保持鼠標左鍵按下狀態,拖拽至hal_entry()函數入口處

a707e6ce-2d28-11ef-a4c8-92fbcf53809c.png

在Developer Assistance中找到目標函數

更新后的代碼如下所示。

a72bea88-2d28-11ef-a4c8-92fbcf53809c.png

Application Project調用boot_set_confirmed()函數

Build Project,可以看到以“0 errors”提示編譯完成。由于添加了boot_set_confirmed()函數調用,因此text段在之前(5108)基礎上有所增加。

a7573da0-2d28-11ef-a4c8-92fbcf53809c.png

對Application Project Confirmed Build時輸出的Log

4調試App v1并在Secondary Slot中加載v1.1.0 Image(不調用boot_set_confirmed())

調試ra4m2_app_v1,如之前所示,在Debug Configuration做如下修改。除增加Bootloader對應的elf文件下載(Image and Symbols)之外,還需增加ra4m2_app_v2對應的Symbols only。

a7750efc-2d28-11ef-a4c8-92fbcf53809c.png

Application Project Debug Configuration Startup選項卡配置

點擊Load Ancillary按鈕a795d7fe-2d28-11ef-a4c8-92fbcf53809c.png,將Application Project Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Primary Slot起始地址0x18000。

a7aeb288-2d28-11ef-a4c8-92fbcf53809c.png

將1.0.0版本Image ***.bin.signed文件下載到Primary Slot的起始地址0x18000

點擊Load Ancillary按鈕a795d7fe-2d28-11ef-a4c8-92fbcf53809c.png,將ra4m2_app_v2 Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Secondary Slot起始地址0x48000。

a7d9d990-2d28-11ef-a4c8-92fbcf53809c.png

將1.1.0版本Image ***.bin.signed文件下載到Secondary Slot的起始地址0x48000

檢查memory窗口的內容,會發現初始狀態如下:

a80709f6-2d28-11ef-a4c8-92fbcf53809c.png

圖 初始狀態下, Primary Slot保存1.0.0,Secondary Slot保存1.1.0

點擊resume,可以發現EK-RA4M2上從閃爍三個LED變為閃爍兩個LED。

a825399e-2d28-11ef-a4c8-92fbcf53809c.png

首次升級完成后,Primary Slot保存1.1.0,Secondary Slot保存1.0.0

在調試界面繼續按下reset,重新運行會發現EK-RA4M2又回到閃爍三個LED。如果從升級事件的起始狀態和終止狀態看,都是閃爍三個LED。但是Secondary Slot中的1.1.0代碼得到一次運行的機會,出現過閃爍兩個LED的表現,由于沒有調用函數boot_set_confirmed(),因此沒有對Trailer進行設定,導致下次Bootloader運行時,又執行了一次Swap,最終芯片運行的還是v1.0.0版本。

為確認這一點,在每次運行時,檢查memory中兩個slot代碼內容即可。

a84a614c-2d28-11ef-a4c8-92fbcf53809c.png

復位完成后,Primary Slot保存1.0.0,Secondary Slot保存1.1.0

5調試App v1并在Secondary Slot中加載v1.2.0 Image(調用boot_set_confirmed())

調試ra4m2_app_v1,如之前所示,在Debug Configuration做如下修改。

a86d5170-2d28-11ef-a4c8-92fbcf53809c.png

Application Project Debug Configuration Startup選項卡配置

點擊Load Ancillary按鈕a795d7fe-2d28-11ef-a4c8-92fbcf53809c.png,將Application Project Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Primary Slot起始地址0x18000。

a7aeb288-2d28-11ef-a4c8-92fbcf53809c.png

將1.0.0版本Image ***.bin.signed文件下載到Primary Slot的起始地址0x18000

點擊Load Ancillary按鈕a795d7fe-2d28-11ef-a4c8-92fbcf53809c.png,將ra4m2_app_v2_confirmed Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Secondary Slot起始地址0x48000。

a7d9d990-2d28-11ef-a4c8-92fbcf53809c.png

將1.2.0版本Image ***.bin.signed文件下載到Secondary Slot的起始地址0x48000

下載完成后,檢查memory窗口,內容如下:

a8fff6d8-2d28-11ef-a4c8-92fbcf53809c.png

初始狀態下, Primary Slot保存1.0.0,Secondary Slot保存1.2.0

點擊resume,可以發現EK-RA4M2上從閃爍三個LED變為閃爍一個LED。在調試界面繼續按下reset,會發現EK-RA4M2依然保持閃爍一個LED。

為確認這一點,在memory窗口檢查首次升級完成后,Primary Slot中保存了v1.2.0 Image,而Secondary Slot中保存了v1.0.0 Image。即使再經過升級操作,也不會重新swap。根本原因是,Secondary Slot中燒錄的v1.2.0 Image在運行的時候編輯了Trailer中的相關Flag,使得Bootloader依據該Flag,判斷無需進行Swap。

升級完成后,memory窗口內容如下,Primary Slot中保留v1.2.0而Secondary Slot中保留1.0.0。

a91c38e8-2d28-11ef-a4c8-92fbcf53809c.png

升級完成后, Primary Slot保存1.2.0,Secondary Slot保存1.0.0

示例代碼中我們僅僅是在secondary slot調用了boot_set_confirmed()函數,實際應用中,可以給調用該函數附加一些條件,如執行某個運算后根據返回的結果決定是否調用函數,運算結果符合預期,則調用函數使得當前Image生效。

需要技術支持?

如您在使用瑞薩MCU/MPU產品中有任何問題,,進入瑞薩技術論壇尋找答案或獲取在線技術支持。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 芯片
    +關注

    關注

    456

    文章

    51170

    瀏覽量

    427227
  • FlaSh
    +關注

    關注

    10

    文章

    1642

    瀏覽量

    148663
  • SWAP
    +關注

    關注

    0

    文章

    51

    瀏覽量

    12914
  • 代碼
    +關注

    關注

    30

    文章

    4825

    瀏覽量

    69043

原文標題:MCUboot系列(4)RA Swap模式下代碼回滾在FSP中的支持

文章出處:【微信號:瑞薩MCU小百科,微信公眾號:瑞薩MCU小百科】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在CCG5代碼中怎么實現DR_SWAP

    請教個問題,在 CCG5代碼中怎么實現DR_SWAP?我們配置了端口 0 作為源對外充電,但是我們希望 PORT0 做了 UFP。我們是這樣寫的代碼:案例 APP_EVT_PD_合同談
    發表于 02-26 06:27

    為什么CyInstaller時未顯示正確的錯誤消息?

    在安裝PSoC Creator、PSoC設計器或PSoC程序員時,可能會出現此問題。當CyInstaller而不顯示任何錯誤消息時,按照以下步驟查找根本原因:1)首先,進入Windows中
    發表于 07-11 10:59

    請問有直接操作flash來實現代碼的燒寫嗎?

    針對stm32:isp好像需要短接boot0或者boot1,而iap要有堆棧來暫存代碼,所以有沒有一種可以直接操作flash來實現代碼的燒寫的???大神come。。。求拍醒。。。
    發表于 08-26 04:37

    實現代碼自動生成的步驟

    重復性的勞動,為什么不交給工具來做呢,這就產生了使用代碼生成代碼的想法。本文提到的實現文本內容批量替換是實現代碼自動生成的一個步驟,實現了找
    發表于 08-17 09:14

    內核空間實現代碼的相關資料分享

    嵌入式LINUX驅動學習之5.ioctl字符設備驅動編程(二)內核空間實現代碼#include #include #include #include #include #include #include
    發表于 12-24 06:21

    OTA有哪些分類? OTA分區策略是什么?

    OTA有哪些分類?OTA分區策略是什么?
    發表于 02-10 07:26

    操作代碼的原理是什么

    目錄跑馬燈+蜂鳴器的位操作實現代碼部分Led.c部分Led.h部分Buzzer.c部分Buzzer.h部分位操作是什么?位操作代碼的原理是什
    發表于 02-25 07:07

    S32 Design Studio for Power Architecture V2.1版的安裝已

    S32 Design Studio for Power Architecture V2.1 版的安裝已
    發表于 03-31 08:04

    什么是熱交換磁盤模式(Hot swap Disk Modul

    什么是熱交換磁盤模式(Hot swap Disk Module ) 熱交換技術僅僅在RAID 1,3,5,10,30 和50 的配置情況下才可以工作。 熱交換模式允許系統
    發表于 01-19 23:26 ?2457次閱讀

    設計模式的原則及實現代碼的復用

    for modification。 意思:軟件模塊應該對擴展開放,對修改關閉。 舉例:在程序需要進行新增功能的時候,不能去修改原有的代碼,而是新增代碼實現一個熱插拔的效果(熱插拔:靈活的去除或添加功能,不影響到原有的
    發表于 09-26 15:12 ?0次下載

    Android Oreo 內置保護,禁止操作系統降級

    Google 最新釋出的新版 Android Oreo 被發現加入名為“保護(Rollback Protection)”的新功能,包含了驗證啟動機制,它將禁止設備滾到舊版本的固件。如果嘗試安裝到舊版本的官方鏡像將會導致設備
    發表于 04-24 14:27 ?872次閱讀
    Android Oreo 內置<b class='flag-5'>回</b><b class='flag-5'>滾</b>保護,禁止<b class='flag-5'>操作</b>系統降級

    嵌入式linux沒有swap分區,swap現象如何實現

    ,如何實現linux中支持的swap功能的呢?1,嵌入式linux隨產品發布時,運行的邏輯往往是在設計之初就確定了。因而在選擇內存大小時,避免了可用內存的不足的問題。因而不會出現swap現象和需求...
    發表于 11-02 11:21 ?12次下載
    嵌入式linux沒有<b class='flag-5'>swap</b>分區,<b class='flag-5'>swap</b>現象如何<b class='flag-5'>實現</b>

    支付寶:多線程事務怎么

    可以發現子線程組執行時,有一個線程執行失敗,其他線程也會拋出異常,但是主線程中執行的刪除操作,沒有,@Transactional注解沒有生效。
    的頭像 發表于 01-09 11:42 ?1886次閱讀

    多線程事務怎么?一個簡單示例演示多線程事務

    在spring中可以使用@Transactional注解去控制事務,使出現異常時會進行,在多線程中,這個注解則不會生效,如果主線程需要先執行一些修改數據庫的操作,當子線程在進行處理出現異常時,主線程修改的數據則不會
    發表于 08-09 12:22 ?696次閱讀
    多線程事務怎么<b class='flag-5'>回</b><b class='flag-5'>滾</b>?一個簡單示例演示多線程事務

    MySQL數據庫是如何應對故障恢復與數據恢復的問題呢?

    今天這篇文章,我想聊一聊MySQL數據庫是如何應對故障恢復,與數據恢復的問題。一個最基本的數據庫,應當可以做到以下幾點
    的頭像 發表于 11-27 10:04 ?1169次閱讀
    MySQL數據庫是如何應對故障恢復與數據恢復<b class='flag-5'>回</b><b class='flag-5'>滾</b>的問題呢?
    百家乐规则技法| 青田县| 网上棋牌游戏赚钱| 大发888亚洲城娱乐城| 大发888dafa8668| 大发888娱乐城电话| 大发888真钱娱乐场| 破解百家乐官网游戏机| 百家乐遥控牌靴| 百家乐官网平注法到6568| 百家乐官网必胜方法如果你还想继续不看可能后悔一生 | 百家乐官网赌场详解| 百家乐官网新庄| 聚宝盆百家乐官网的玩法技巧和规则 | 百家乐官网必胜下注法| 定安县| 网上百家乐官网赌场| 百家乐官网桌布橡胶| 百家乐官网投注网出租| 保单百家乐路单| 希尔顿百家乐试玩| 大发888娱乐城首页| 总统娱乐城能赢钱吗| 呼和浩特市| 凯发百家乐官网是否是程序控制| 狮威百家乐官网的玩法技巧和规则| 百家乐统计概率| 百家乐制胜秘| 大发888游戏客户端下载| 网上真人娱乐场| bet365 备用网址| 百家乐官网大眼仔用法| 电子百家乐官网假在线哪| 百家乐最新套路| 巴黎人百家乐的玩法技巧和规则| 大发888下注| 百家乐官网学院教学视频| 娱乐城送| 百家乐官网开过的路纸| 新世纪百家乐现金网| 威尼斯人娱乐场地址|