色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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產品中有任何問題,,進入瑞薩技術論壇尋找答案或獲取在線技術支持。

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

    關注

    455

    文章

    50714

    瀏覽量

    423158
  • FlaSh
    +關注

    關注

    10

    文章

    1633

    瀏覽量

    147944
  • SWAP
    +關注

    關注

    0

    文章

    51

    瀏覽量

    12820
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68525

原文標題: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

    全志V853芯片swap功能簡介與tina上swap分區使用方法

    內存回收操作中,被回收的匿名頁會寫到swap分區。系統沒有swap分區的時候,依舊會進行swap操作
    發表于 07-18 09:36

    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 ?2438次閱讀

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

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

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

    Google 最新釋出的新版 Android Oreo 被發現加入名為“保護(Rollback Protection)”的新功能,包含了驗證啟動機制,它將禁止設備滾到舊版本的固件。如果嘗試安裝到舊版本的官方鏡像將會導致設備
    發表于 04-24 14:27 ?857次閱讀
    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 ?1832次閱讀

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

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

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

    今天這篇文章,我想聊一聊MySQL數據庫是如何應對故障恢復,與數據恢復的問題。一個最基本的數據庫,應當可以做到以下幾點
    的頭像 發表于 11-27 10:04 ?1120次閱讀
    MySQL數據庫是如何應對故障恢復與數據恢復<b class='flag-5'>回</b><b class='flag-5'>滾</b>的問題呢?
    主站蜘蛛池模板: 初中XXXXXL| 女教师の诱惑| 被高跟鞋调教丨vk| 亚洲欧洲日本天天堂在线观看| 蜜桃久久久亚洲精品成人| 国产成人免费视频| 99riav9 精品香蕉免费大视频| 午夜影视不用充钱的免费| 欧美国产成人在线| 久久内在线视频精品mp4| 国产精品av免费观看| jiz在线播放jizijzz| 中文字幕亚洲男人的天堂网络| 忘忧草研究所 麻豆| 全球真实小U女视频合集| 两个吃奶一个添下面视频| 国产在线精品视亚洲不卡| 成人永久免费视频| FREECHINESE东北女人真爽| 中文字幕专区高清在线观看| 亚洲精品一本之道高清乱码| 丝瓜涩涩屋黄瓜香蕉丝瓜| 全部老头和老太XXXXX| 美女脱精光让男生桶下面| 久久www成人看片| 果冻传媒2021一二三区| 国产精品人妻一区免费看8C0M| 成人在线免费视频| SM双性精跪趴灌憋尿调教H| 91麻豆久久| 中文无码第3页不卡av| 亚洲欧美综合中文| 亚洲精品国产在线观看| 幸福草电视剧演员表介绍| 无套内射在线观看THEPORN| 色欲AV亚洲情无码AV蜜桃| 日韩国产精品欧美一区二区| 热の中文 AV天堂| 日日碰狠狠添天天爽| 视频一区二区中文字幕| 天天狠狠色综合图片区|