前面介紹了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模式升級的流程。
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,其他保持不變。
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
Application Project中添加MCUboot Image Utilities
根據(jù)錯(cuò)誤提示,添加Flash driver,之后修改General屬性,如下圖所示,指向Bootloader所在路徑。
Application Project中添加MCUboot Image Utilities
Build Project,可以看到以“0 errors”提示編譯完成。
對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
Application Project中添加MCUboot Image Utilities
根據(jù)錯(cuò)誤提示,添加Flash driver,之后修改General屬性,如下圖所示,指向Bootloader所在路徑。
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ù)入口處
在Developer Assistance中找到目標(biāo)函數(shù)
更新后的代碼如下所示。
Application Project調(diào)用boot_set_confirmed()函數(shù)
Build Project,可以看到以“0 errors”提示編譯完成。由于添加了boot_set_confirmed()函數(shù)調(diào)用,因此text段在之前(5108)基礎(chǔ)上有所增加。
對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。
Application Project Debug Configuration Startup選項(xiàng)卡配置
點(diǎn)擊Load Ancillary按鈕,將Application Project Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Primary Slot起始地址0x18000。
將1.0.0版本Image ***.bin.signed文件下載到Primary Slot的起始地址0x18000
點(diǎn)擊Load Ancillary按鈕,將ra4m2_app_v2 Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Secondary Slot起始地址0x48000。
將1.1.0版本Image ***.bin.signed文件下載到Secondary Slot的起始地址0x48000
檢查memory窗口的內(nèi)容,會(huì)發(fā)現(xiàn)初始狀態(tài)如下:
圖 初始狀態(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。
首次升級完成后,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)容即可。
復(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做如下修改。
Application Project Debug Configuration Startup選項(xiàng)卡配置
點(diǎn)擊Load Ancillary按鈕,將Application Project Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Primary Slot起始地址0x18000。
將1.0.0版本Image ***.bin.signed文件下載到Primary Slot的起始地址0x18000
點(diǎn)擊Load Ancillary按鈕,將ra4m2_app_v2_confirmed Debug文件夾下的***.bin.signed下載到芯片上,注意選擇地址為Secondary Slot起始地址0x48000。
將1.2.0版本Image ***.bin.signed文件下載到Secondary Slot的起始地址0x48000
下載完成后,檢查memory窗口,內(nèi)容如下:
初始狀態(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。
升級完成后, 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ù)支持。
-
芯片
+關(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)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論