精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

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

利用Swap模式實(shí)現(xiàn)代碼回滾操作

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

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

可以利用本文描述的這種方式實(shí)現(xiàn)以上目標(biāo)。燒寫在Secondary Slot中的Image有一次運(yùn)行的機(jī)會(huì),即上電后在Bootloader控制下完成一次Swap操作,Secondary Slot中的高版本代碼被交換到Primary Slot中執(zhí)行,在執(zhí)行的過程中,根據(jù)某個(gè)函數(shù)的返回結(jié)果,在Trailer中對目標(biāo)地址進(jìn)行置位。

本文以RA4M2 512K Code Flash產(chǎn)品為例,使用Flat mode(不啟用TrustZone)說明Swap模式進(jìn)行升級時(shí)的注意事項(xiàng)。

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

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

MCUboot Swap模式圖解

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

初始狀態(tài)下,芯片中燒錄了Bootloader和Primary Slot,代碼從Bootloader處啟動(dòng),跳轉(zhuǎn)至Primary Slot中的User Application v1.0。在User Application v1.0運(yùn)行過程中,接收來自外部的更高版本Firmware v2.0,并燒寫到Secondary Slot中,燒寫完成后,執(zhí)行軟件復(fù)位Software reset,代碼重新從Bootloader開始運(yùn)行。此時(shí)Bootloader判斷Secondary Slot中有待更新的Image,檢查其完整性等,校驗(yàn)通過后,將Secondary Slot中的內(nèi)容和Primary Slot中的內(nèi)容交換(利用Scratch area作為暫存區(qū)域)。然后跳轉(zhuǎn)到Primary Slot中執(zhí)行。比較升級操作的初始狀態(tài)和終止?fàn)顟B(tài),發(fā)現(xiàn)Primary Slot中運(yùn)行的代碼從低版本的v1.0變?yōu)楦甙姹镜膙2.0。

假如以當(dāng)前升級操作的最后一個(gè)階段為新的起點(diǎn),下次軟件復(fù)位后(以及之后的每次軟件復(fù)位),Bootloader會(huì)根據(jù)Trailer中的內(nèi)容判斷,不需要重新執(zhí)行swap操作了。

本次我們更改Bootloader的設(shè)定,如下所示,將兩種Image分別燒寫進(jìn)Secondary Slot中,檢查升級的結(jié)果。

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

第一種代碼閃爍兩個(gè)LED(藍(lán)色和紅色),代碼中會(huì)調(diào)用boot_set_confirmed()函數(shù)

第二種代碼閃爍一個(gè)LED(藍(lán)色),代碼中并不調(diào)用boot_set_confirmed()函數(shù)

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

1修改Bootloader MCUboot選項(xiàng)

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

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

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

2創(chuàng)建第一種Application Project

創(chuàng)建一個(gè)Blinky Project,命名為ra4m2_app_v1,采用默認(rèn)的Blinky模板,使得EK-RA4M2上的三個(gè)LED閃爍。

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

導(dǎo)入ra4m2_app_v1且重命名為ra4m2_app_v2,從默認(rèn)的閃爍三個(gè)LED改為兩個(gè)LED。

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

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

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

Application Project中添加MCUboot Image Utilities

根據(jù)錯(cuò)誤提示,添加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時(shí)輸出的Log

3創(chuàng)建第二種Application Project

導(dǎo)入第二步創(chuàng)建的project,并重命名ra4m2_app_v2_confirmed,從閃爍兩個(gè)LED改為一個(gè)LED。

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

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

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

Application Project中添加MCUboot Image Utilities

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

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

Application Project中添加MCUboot Image Utilities

在hal_entry.c中增加調(diào)用函數(shù)boot_set_confirmed()函數(shù)。

將光標(biāo)放在hal_entry()函數(shù)入口處,打開Developer Assistant,點(diǎn)選Confirm Primary Image,保持鼠標(biāo)左鍵按下狀態(tài),拖拽至hal_entry()函數(shù)入口處

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

在Developer Assistance中找到目標(biāo)函數(shù)

更新后的代碼如下所示。

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

Application Project調(diào)用boot_set_confirmed()函數(shù)

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

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

對Application Project Confirmed Build時(shí)輸出的Log

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

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

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

Application Project Debug Configuration Startup選項(xiàng)卡配置

點(diǎn)擊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

點(diǎn)擊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窗口的內(nèi)容,會(huì)發(fā)現(xiàn)初始狀態(tài)如下:

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

圖 初始狀態(tài)下, Primary Slot保存1.0.0,Secondary Slot保存1.1.0

點(diǎn)擊resume,可以發(fā)現(xiàn)EK-RA4M2上從閃爍三個(gè)LED變?yōu)殚W爍兩個(gè)LED。

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

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

在調(diào)試界面繼續(xù)按下reset,重新運(yùn)行會(huì)發(fā)現(xiàn)EK-RA4M2又回到閃爍三個(gè)LED。如果從升級事件的起始狀態(tài)和終止?fàn)顟B(tài)看,都是閃爍三個(gè)LED。但是Secondary Slot中的1.1.0代碼得到一次運(yùn)行的機(jī)會(huì),出現(xiàn)過閃爍兩個(gè)LED的表現(xiàn),由于沒有調(diào)用函數(shù)boot_set_confirmed(),因此沒有對Trailer進(jìn)行設(shè)定,導(dǎo)致下次Bootloader運(yùn)行時(shí),又執(zhí)行了一次Swap,最終芯片運(yùn)行的還是v1.0.0版本。

為確認(rèn)這一點(diǎn),在每次運(yùn)行時(shí),檢查memory中兩個(gè)slot代碼內(nèi)容即可。

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

復(fù)位完成后,Primary Slot保存1.0.0,Secondary Slot保存1.1.0

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

調(diào)試ra4m2_app_v1,如之前所示,在Debug Configuration做如下修改。

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

Application Project Debug Configuration Startup選項(xiàng)卡配置

點(diǎn)擊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

點(diǎn)擊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窗口,內(nèi)容如下:

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

初始狀態(tài)下, Primary Slot保存1.0.0,Secondary Slot保存1.2.0

點(diǎn)擊resume,可以發(fā)現(xiàn)EK-RA4M2上從閃爍三個(gè)LED變?yōu)殚W爍一個(gè)LED。在調(diào)試界面繼續(xù)按下reset,會(huì)發(fā)現(xiàn)EK-RA4M2依然保持閃爍一個(gè)LED。

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

升級完成后,memory窗口內(nèi)容如下,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調(diào)用了boot_set_confirmed()函數(shù),實(shí)際應(yīng)用中,可以給調(diào)用該函數(shù)附加一些條件,如執(zhí)行某個(gè)運(yùn)算后根據(jù)返回的結(jié)果決定是否調(diào)用函數(shù),運(yùn)算結(jié)果符合預(yù)期,則調(diào)用函數(shù)使得當(dāng)前Image生效。

需要技術(shù)支持?

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

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

    關(guān)注

    453

    文章

    50406

    瀏覽量

    421833
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1621

    瀏覽量

    147754
  • SWAP
    +關(guān)注

    關(guān)注

    0

    文章

    51

    瀏覽量

    12798
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4748

    瀏覽量

    68356

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    在CCG5代碼中怎么實(shí)現(xiàn)DR_SWAP?

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

    為什么CyInstaller時(shí)未顯示正確的錯(cuò)誤消息?

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

    請問有直接操作flash來實(shí)現(xiàn)代碼的燒寫嗎?

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

    實(shí)現(xiàn)代碼自動(dòng)生成的步驟

    重復(fù)性的勞動(dòng),為什么不交給工具來做呢,這就產(chǎn)生了使用代碼生成代碼的想法。本文提到的實(shí)現(xiàn)文本內(nèi)容批量替換是實(shí)現(xiàn)代碼自動(dòng)生成的一個(gè)步驟,實(shí)現(xiàn)了找
    發(fā)表于 08-17 09:14

    內(nèi)核空間實(shí)現(xiàn)代碼的相關(guān)資料分享

    嵌入式LINUX驅(qū)動(dòng)學(xué)習(xí)之5.ioctl字符設(shè)備驅(qū)動(dòng)編程(二)內(nèi)核空間實(shí)現(xiàn)代碼#include #include #include #include #include #include #include
    發(fā)表于 12-24 06:21

    OTA有哪些分類? OTA分區(qū)策略是什么?

    OTA有哪些分類?OTA分區(qū)策略是什么?
    發(fā)表于 02-10 07:26

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

    內(nèi)存回收操作中,被回收的匿名頁會(huì)寫到swap分區(qū)。系統(tǒng)沒有swap分區(qū)的時(shí)候,依舊會(huì)進(jìn)行swap操作
    發(fā)表于 07-18 09:36

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

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

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

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

    設(shè)計(jì)模式的原則及實(shí)現(xiàn)代碼的復(fù)用

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

    Android Oreo 內(nèi)置保護(hù),禁止操作系統(tǒng)降級

    Google 最新釋出的新版 Android Oreo 被發(fā)現(xiàn)加入名為“保護(hù)(Rollback Protection)”的新功能,包含了驗(yàn)證啟動(dòng)機(jī)制,它將禁止設(shè)備滾到舊版本的固件。如果嘗試安裝到舊版本的官方鏡像將會(huì)導(dǎo)致設(shè)備
    發(fā)表于 04-24 14:27 ?847次閱讀
    Android Oreo 內(nèi)置<b class='flag-5'>回</b><b class='flag-5'>滾</b>保護(hù),禁止<b class='flag-5'>操作</b>系統(tǒng)降級

    嵌入式linux沒有swap分區(qū),swap現(xiàn)象如何實(shí)現(xiàn)

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

    支付寶:多線程事務(wù)怎么

    可以發(fā)現(xiàn)子線程組執(zhí)行時(shí),有一個(gè)線程執(zhí)行失敗,其他線程也會(huì)拋出異常,但是主線程中執(zhí)行的刪除操作,沒有,@Transactional注解沒有生效。
    的頭像 發(fā)表于 01-09 11:42 ?1818次閱讀

    多線程事務(wù)怎么?一個(gè)簡單示例演示多線程事務(wù)

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

    MySQL數(shù)據(jù)庫是如何應(yīng)對故障恢復(fù)與數(shù)據(jù)恢復(fù)的問題呢?

    今天這篇文章,我想聊一聊MySQL數(shù)據(jù)庫是如何應(yīng)對故障恢復(fù),與數(shù)據(jù)恢復(fù)的問題。一個(gè)最基本的數(shù)據(jù)庫,應(yīng)當(dāng)可以做到以下幾點(diǎn)
    的頭像 發(fā)表于 11-27 10:04 ?1092次閱讀
    MySQL數(shù)據(jù)庫是如何應(yīng)對故障恢復(fù)與數(shù)據(jù)恢復(fù)<b class='flag-5'>回</b><b class='flag-5'>滾</b>的問題呢?