电子产业一站式赋能平台

PCB联盟网

搜索
查看: 64|回复: 0
收起左侧

MCUboot Swap模式升级流程及应用

[复制链接]

334

主题

334

帖子

3289

积分

四级会员

Rank: 4

积分
3289
发表于 2024-6-26 11:45:00 | 显示全部楼层 |阅读模式
转自 | 瑞萨嵌入式小百科
2 _- u. r6 a5 k. h* s5 r( o上周给大家分享了《MCUboot Overwrite模式升级流程及应用》,今天继续给大家分享另外一种Swap模式升级流程及应用.  d9 R. |. O1 b* }; B# `
0 \5 n* n/ G9 b9 `7 p/ T7 ?
本文以瑞萨RA4M2 512K Code Flash产品为例,使用Flat mode(不启用TrustZone)说明Swap模式进行升级时的注意事项。
9 K' m& m8 W& f/ t" K. K
; k" }+ D- X5 Y! G. i6 `首先回顾一下Swap模式升级的流程。9 s  U+ b7 N3 ?6 N3 i2 u6 [# h

; T# A- r1 {" k9 @# R$ e

mpctg33n24t64063127839.png

mpctg33n24t64063127839.png

8 i/ L+ g8 z! {: q7 P2 w5 ^MCUboot Swap模式图解4 C4 W9 Y; ~# C7 Z

6 s4 n6 U, S  u- G# f- p& S从代码框架来看,整体划分为三部分,Bootloader,Primary Slot(保存了低版本的User Application v1.0)和Secondary Slot(保存了待更新的高版本User Application v2.0)。+ A: u$ C, a0 w$ i" x" n: y/ f. p
+ G$ q1 Y2 s2 W/ ]- X
初始状态下,芯片中烧录了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。
6 t; _# P# h$ e# p7 L
: ]9 W& }; H( k, Z' \在e2 studio中进行开发时,Bootloader和User Application为相互独立的Project,但位于同一个Workspace中。先Build Bootloader Project,然后Build位于Primary Slot的User Application Project,由于Bootloader规定了对于整个存储空间的划分,同时包含了对User Application Image进行签名/验签所用的密钥,因此Application Project会依据Bootloader build输出的Bootloader Data File代替原有的Linker Script File(链接脚本文件)进行link,并利用Bootloader包含的密钥进行Image映像文件的处理。+ |) D. X. p- m: w; P
1 I" X5 X8 ~8 X' R
1) Y4 m+ h  U, y1 J5 J& @8 j" F
新建Bootloader并配置MCUboot参数- p& D. U  X! f. T# V  c& r, |
由于Bootloader是整个系统的关键,因此我们第一步创建Bootloader Project并配置一些关键选项如Flash layout和加密算法等。
' `9 j6 |) |7 n( A/ D$ ^* K" k- O' [6 B3 m0 n- K2 j
对于Bootloader Project,可以在e2 studio中新建并命名。在FSP的Stack选项卡下,点击New Stack → Bootloader → MCUboot,即可将该功能添加进来。, Y! C1 C, P- N9 W! ~
6 R, r: G& L' _3 K1 ]1 }+ `6 ~

b4bx1imc4sf64063127939.png

b4bx1imc4sf64063127939.png

/ Z* A. p! A4 ?5 ^0 `/ T4 ~: ?- lFSP中添加MCUboot7 Y- m! c4 [5 r

8 U: y" W0 d. K, r5 S* I; W6 j添加MCUboot之后,由于它依赖一些底层驱动,如Flash,Crypto等,因此会在初始界面提示错误,按照提示信息逐个修复即可,此处不详细展开。  T* Q+ A$ k  Q/ h+ N0 d  q( f4 a
, w' a/ b7 s+ }4 R, Q# D( }) N! }

uey013lr1r164063128039.png

uey013lr1r164063128039.png

: F* r8 D9 b& T0 z! P  vFSP中MCUboot
- m$ o. b- M' M2 c7 F0 j: x) o! k  O6 L0 o' u8 l& ^( t
注意,如需使用示例密钥对Application Image进行处理,则需要添加MCUboot Example Keys。该Key仅供测试使用,量产时需进行替换。
+ a4 w! @6 }+ M! t) A' e/ @
% x3 G( w2 K6 y5 x5 m% ^

icio4mna22n64063128139.png

icio4mna22n64063128139.png

3 g% |- {5 J. E3 F6 K" V% ]FSP中MCUboot Example Keys配置( h7 Y; M9 ~' _4 `2 }7 K( G

- ?4 w& o* Y" t3 @( ]5 z假如使用Crypto相关的driver,则参考下图的配置修复相关error。
6 W# @, C! W/ J% u* C! o0 u6 m$ V6 g9 n

tf3bmqohaym64063128239.png

tf3bmqohaym64063128239.png

6 p3 T3 r* _# N+ E; I0 GFSP中MCUboot下MbedTLS (Crypto Only)配置参考3 ~5 D" @; Q) r8 `( w
/ v* m  K! S1 I4 R( V* w
将所有的错误修正后,配置MCUboot的关键属性。
2 M# S% A$ L% ~0 T. q# a, L3 `5 k$ J
4 z( m% M! j1 T6 O/ |8 d; v

rqmmfmcjc0s64063128339.png

rqmmfmcjc0s64063128339.png

& Y! G$ l: Q- S) C, r4 X& |FSP中MCUboot General属性
0 l( r) S2 S& s# Z( K" W/ X+ L" d7 N' V* c( E- ]' v
展开Common选项下的General属性,对于几个可配置的关键选项,说明如下:
$ X- y* K# J9 [9 b/ U9 p+ H& C; I0 K
  • 升级模式Upgrade Mode,可以从Overwrite,Swap和Direct XIP中选择,此次选择Swap。该选项是决定Bootloader大小的关键性因素,Overwrite模式最小,Swap模式最大。
  • Validate Primary Image,建议设定为Enabled,除非资源非常紧张,开启这部分功能带来的代码量增加不过几十字节而已。
  • Downgrade Prevention (Overwrite Only),由于该选项仅在Overwrite模式可选,因此设定为Disabled。: X6 O. [6 z0 v& Y, x
    6 Q/ h4 E9 |1 x" S; W2 R
    2 d! ?$ [3 d; L1 t' ~

    o5dxzw1o4sy64063128439.png

    o5dxzw1o4sy64063128439.png
    . B4 `4 X3 j9 d# ?* n- C
    FSP中MCUboot Signing and Encryption Options属性
    : I9 H7 _9 f; J# ^) W+ L8 H% o; h0 A) K  g6 P6 c
    展开Common选项下的Signing and Encryption Options属性,对于几个可配置的关键选项,说明如下:
    + T4 Y# G% X) x) \' J( t3 `2 [, U
    $ A' h# M! w- y2 G0 [
  • 签名类型Signature Type,规定了对于Application Image进行签名所用的方式,可从None,ECDSA P-256,RSA 2048,RSA 3072四项中任选其一。假如使能签名,则代码量最小的是ECDSA P-256
  • Custom可以从--confirm和--pad两者中任选其一
    # Q" a/ N4 L7 w! G. O3 d* R
    - 默认选项为--confirm,在对Image进行签名操作时,会将该Image做标记,Bootloader判断时会将Secondary Slot和Primary Slot交换。下次复位时,两个Slot不会交换。3 W; n+ x4 X' `/ d3 Z
    - 设定为--pad时,签名操作会将Image的Trailer部分标记为“可考虑使用该Image升级”。将Image写入Secondary Slot之后,Bootloader会先将Secondary Slot和Primary Slot进行交换,使得Secondary Slot中的Image得到一次执行的机会。在执行的过程中,假如调用了boot_set_confirmed()函数,则下次复位后,不执行Swap。假如在执行的过程中,并没有调用boot_set_confirmed()函数,则下次复位后,继续执行Swap,代码回到旧版本的Image。这是实现代码回滚的一种方式,我们会在下一篇文章中做详细介绍。' a& x8 P5 c+ Z% C2 a6 W

    & y1 u4 ]; r4 u
  • Encryption Scheme,根据对于Application Image是否加密进行设定。默认是Disabled,假如使能,则可以从ECIES-P256和RSA-OAEP (RSA 2048 only)中任选其一。Encryption Enabled情况下,Bootloader代码量会明显增加。+ m* g  [4 z/ R& v1 L* p+ M
    / \" b- f: _2 f' a8 h
    接下来配置Flash Layout
    8 o  I8 J" u* Y) a" Z. B! g/ O
    ; x) ]! ~+ i, f! ^7 R/ D对于Flash Layout来说,由于升级模式已锁定Swap,在此基础上决定Bootloader的大小因素就只剩下校验算法的选择了。
    & B; d6 X* O* y- `8 Z9 V( M! s: ?% }4 J, b
    由于Bootloader占据从0地址开始的空间,而RA4M2在低地址上的8个block大小均为8KB,因此我们先将Bootloader大小设定为64KB,即0x10000。Swap模式需要保留一个Block大小(32K)的空间用于对两个Slot内容进行交换,因此还剩512 – 8*8 – 32 = 416KB。假如将这416KB等分,则208K无法被32K整除,因此只能等分Block 8~Block 19,Primary Slot和Secondary Slot各占6个Block (32KB)。2 \' I1 b& F4 v

    $ `& l/ I) ]& I9 G: g既然如此,我们索性把Bootloader设定为96KB(Block 0~8),即0x18000。Primary Slot占据6个Block (Block 9~14),Secondary Slot占据6个Block (Block 15~20),最高地址的Block 21作为Swap模式下的Scratch area。' S% g4 U7 _. q: D# F/ j$ i
    ! e5 u, y6 y( t8 K- s

    xzkumerjehd64063128539.png

    xzkumerjehd64063128539.png
    1 a7 o/ ]* w: J9 l7 ]$ e0 V4 E
    RA4M2 Code Flash地址空间% B& e+ w0 k8 s3 M
      G6 F+ i+ _5 g9 N) i" y6 o8 b

    cdace1uzlzg64063128639.png

    cdace1uzlzg64063128639.png
    . w. g( h. c9 F' t! G. e9 x- e
    FSP中MCUboot Flash Layout设置
    4 o* Z$ Q6 m+ n, q6 `& m- P! f4 B( z: I* ]8 h0 P+ |0 R4 V7 A
    Bootloader Flash Area Size (Bytes):* T; v/ B- e# K/ B! W8 n
    设定为0x18000即可7 J" W6 ^2 {% C
    + e" X( H" g# `
    Image 1 Header Size (Bytes):5 G+ z6 y; Z6 u2 D
    前面的划分Primary Slot和Secondary Slot包含Header,对于Cortex-M33内核的产品,有中断向量表对齐的要求,因此我们建议将Header size统一设定为0x200,以支持Application的所有中断。
    2 X: M2 ^) y- ~/ X
    3 ?8 A! M  v. r# ^9 {4 yImage 1 Flash Area Size (Bytes):
    6 p2 \; ?! z4 f# _根据前面的计算结果,填入0x30000(6个32K block)
    1 \: _6 Q) m' y) i4 A0 M6 T7 u# ^, W' V2 G
    Scratch Area用于暂存两个Slot内容交换时的最小单元,因此我们将Scratch Area大小设定为Block size 0x8000(32K)。
    * M5 X9 R- a8 c: o9 D/ Q; X8 _9 v: Z1 r6 E6 F4 A
    至此,对于Bootloader的配置已经完成了。' t! \* C' Y" z
    4 Q: q: \+ L3 V3 m9 Y4 z
    接下来我们需要在hal_entry.c中增加对函数mcuboot_quick_setup()的调用。在e2 studio界面下,Project Explorer中找到Developer Assistance找到Call Quick Setup,鼠标左键点选,保持左键按下的状态,拖动到hal_entry.c文件的hal_entry()函数定义之前。6 s8 {* {  L+ J& ]5 d  w% i
    8 {; F$ t" }5 j7 H1 a

    442drfn1fyj64063128739.png

    442drfn1fyj64063128739.png
    ) w6 a' W. k4 w/ C" ~
    利用Developer Assistant向源码中增加mcuboot_quick_setup定义
    . ^3 Y: E2 K9 f( Q3 Q9 T4 r$ S8 c" J' L9 r0 u: a" h4 V3 Q
    然后在hal_entry()入口处增加对函数mcuboot_quick_setup的调用。
    9 y! q5 v. {. C  L0 P/ e7 n, j+ `/ W* _

    baptur0ku3x64063128839.png

    baptur0ku3x64063128839.png
    7 t5 w9 j' j" v( ]6 P2 B- h' @/ J
    在hal_entry()入口处增加调用mcuboot_quick_setup. d+ z) U6 t$ [' z$ @( N1 I
    & L& c6 I0 o/ w2 f6 o8 f( {% P
    Build Project可以顺利完成,提示“0 errors, 0 warnings”。在Debug文件夹下确认包含同名的***.bld文件,用文本编辑器打开,检查内容。
    # L6 d! {+ B/ }0 R
    1 `* j4 K7 P  `

    gxcl0pgbico64063128939.png

    gxcl0pgbico64063128939.png
    ; B! W( j9 q/ c6 d$ E+ t+ g9 N
    Bootloader Project Build生成的.bld文件
    8 l' ^) ]# M+ k+ O: e* \" `
    5 M% ]' z! G+ ~+ m- l.bld文件是XML格式的,主要包含两部分:5 X$ D9 P' A2 H0 `* F, D
    , x3 r7 b" k5 O& C# n- ^  c7 Z
    第一部分是symbol,主要是Bootloader对Flash Layout的设定,FLASH_IMAGE_START值为0x00018200,即位于Primary Slot的Application Project实际Link(链接)地址。FLASH_IMAGE_LENGTH值为0x0002FE00,即Primary Slot大小(0x30000)减掉Header Size(0x200)。9 N( j( i' k* g% o: H7 T/ f$ o

    $ T( a0 o: @3 w" e第二部分是对Application Image进行签名所用到的Python命令,该命令的输入是Application Project Build生成的原始Binary(二进制)文件,输出是同名的签名后的文件,后缀是.bin.signed。同时传入的参数还有文件版本,签名所用的密钥等。由于RA4M2搭载了支持TrustZone的Cortex-M33内核,因此文件的结构包含了对TrustZone的支持。对于不启用TrustZone的应用场景,我们仅需关注Python命令的第一部分。1 M; ^6 A* m; x; S) W- c
    ; X0 S- M5 X; n1 w1 _
    2
    & B, S9 O2 J+ m& ?2 [- t4 x9 r6 H将Application Project和Bootloader关联起来
      x& E) k) e' r9 T" ]接下来,我们要利用该Bootloader调试目标Application Project,如何才能将Bootloader和Application关联起来呢?就需要借助刚才提到的Bootloader Project Build所生成的***.bld文件。  [: p: F6 I: e
    - U4 ]+ W, C; s6 p9 y( r
    除了新建Project,也可以将任意一个现有的Project跟Bootloader关联起来,此时,该Project编译的地址为Primary Slot起始地址加上Header大小。# K* L' K+ ^+ l" F" G! R

    % b1 d/ B5 I& B- H" l* {1 i: TApplication Project会利用.bld中的内容替代原始的链接脚本文件(linker script file)。编译的起始地址来自标号FLASH_IMAGE_START,图中的值为0x00018200,可以看到,Header大小0x200已经包含进来。) L" W5 Y" Y4 q7 V' C
    / m" S; s: V; x
    另外,由于需要使用Python对Application Image进行处理,因此需要在本地安装Python以及相关插件的支持。该操作仅需执行一次。$ T; h& w; U8 k% }$ A

    3 w9 J. x" X* z% x3 l& S' V具体的步骤如下,在Project Tree界面下找到ra\mcu-tools\MCUboot\scripts,鼠标点击右键,Command Window,则会在打开命令行界面,并进入scripts文件夹。键入如下命令,安装Python所需的lib。
    3 l4 N! N) p) g
    ) p) a4 V) F( S7 mpip3 install --user -r scripts/requirements.txt, r  J* q" f4 X4 {0 g$ y

    : V! D) [# k% Y, U7 N

    4wclgo1xesq64063129039.png

    4wclgo1xesq64063129039.png
    - {8 u2 V/ |+ {7 m9 n
    Python安装所需Lib的提示信息' L! B# J" Q$ N

    / r1 _: I! D/ E$ _; S4 M* k: z6 J9 B# wPython命令中包含e2 studio中的Placeholder,针对某个具体的Project,在执行的时候会解析为Workspace下的Project路径以及Project名称。5 l( ]0 K1 @$ O+ ~* Y

    ) _% e2 Q- @/ E5 j# E6 S/ Q通过环境变量将Application Project关联起来
    ' @/ P" Y0 l( g8 s/ s& B
    * _) }3 p5 ?, K" t  x打开Application Project的属性界面,在C/C++ Build → Build Variables下添加.bld文件。! ~7 \: |1 L- ~, ?4 {6 x# Z. m1 |

    ) i* T6 I3 w+ k+ W+ `7 q

    gn4dhiddg0264063129140.png

    gn4dhiddg0264063129140.png
    + G$ D0 ~& V0 ^; ~, o
    添加.bld文件到Application Project的Build Variables) R4 `: h5 Y5 ]% O$ q

    1 O. ?" y, K1 z4 h- L' e同时,对Application Project Image进行签名操作所需的公钥放在Bootloader中,因此也需要将该文件链接到Application Project中,具体的实现方式如下:
    / g% J- ^+ @! r1 G7 J) }5 }' i
    % k: M- L9 U; J7 k" {

    0fjpvww05bc64063129240.png

    0fjpvww05bc64063129240.png
    % w9 p( U+ Z' Z# f
    添加Public Key for Sign3 X2 m8 X5 e% A  l# K  e
    & }" T# X  S7 E0 f& i
    注意,此时Public Key for Sign依然位于Bootloader Project所在路径,该配置只是引入该文件的地址,使得在Application Project中调用Python脚本对Image进行签名操作时找到该Public Key。8 Q% @4 ^! J" E% n

    6 T* U6 g2 q* g8 M* o9 R另外,Image文件的版本信息可以通过添加Environment variable实现,配置方式如下:
    . i" q) O1 I- K) P- @# o% h+ @. {5 }) N! q  |* s

    ajoeakxxxwi64063129340.png

    ajoeakxxxwi64063129340.png

    " `# M6 [. s: g" m: F4 ^将Image版本号添加到Environment variable
    # _; Z; \' |/ R6 R. p& w! @3 Q' @# E2 H4 q
    最终生成的版本信息会以4字节添加到Header中。
    ) s; J) A1 Z8 i& s2 P2 Y/ W
    0 q) N4 {) X! `' p7 m/ W7 Z为保证每次Environment variables有变化或者Bootloader生成的***.bld发生改变时,Application Project都可以重新编译,需在Pre-build中增加以下内容:  v% `/ W) V: o& G

    , X2 W" f6 z: N8 t7 u, O- Rrm -f ${ProjName}.elf9 l$ ]! M. e6 q8 d# l3 b

    ' c. L9 A& c7 a& G$ j. S' E# v% \

    drzy4oah5wr64063129440.png

    drzy4oah5wr64063129440.png
    ( u/ T2 G8 C: g4 T
    Pre-build step添加删除***.elf的操作, V" J, @' f! H, A- j& x4 }
    3 |" d$ K, v7 v& V% T
    完成了以上的所有基础配置后,可以编译Application Project。在Console界面查看Build Log,可以发现编译完成后,增加了对Image文件的处理。2 V4 H3 d8 r1 ~- {! [- l9 x
    0 [8 B- Z/ ~$ C( F( {* `: }

    qxogyjhrumu64063129540.png

    qxogyjhrumu64063129540.png
    0 Y' H3 _" I) @9 R4 b7 X; s+ D
    对Image签名操作对应的Python内容
    " r) s3 T8 L5 e; h6 c- U( [4 u# Y9 A
    此时生成的***.bin.signed文件包含了Header,TLV和Trailer等内容,可以被Bootloader识别并运行。利用工具打开该文件,可以发现它不同于原始的Application Image文件:5 N/ W  `) M3 {" Y9 O
    : N* G2 O) F0 k: J" @7 A2 Z1 D

    f0ucxg142or64063129640.png

    f0ucxg142or64063129640.png
    : s  k" D2 z8 |& D
    .bin.signed文件结构
    ! y6 g2 a2 x" a+ E9 M6 T
    " ?) Y8 ~/ n- Z: @" ?; }开始的0x200字节是Header信息,在e2 studio中通过Environment variable传入的版本信息1.0.0在0x14地址偏移上。关于其他部分的细节,感兴趣的朋友可自行查阅。5 D2 C; y* I% O' I  l0 r6 [
    4 D$ ^! j+ a/ z/ v) t) F
    Application Image开始的0x200处,第二个4字节即当前的中断向量表起始地址,可以看到是小端格式的0x00018ab9,在Primary Slot地址空间(0x00018000~0x87FFF)内。6 g8 B9 Z4 D& [8 Z
    / X& [5 d% i  f. [* C  o8 \
    ! `  O! c$ |4 S0 j3 j. j4 _
    3" j4 [& v! O, j" w. w
    调试Application Project) d. [0 k5 b  K! }& H
    由于芯片上电后需要从0地址(具体地说是0004h地址处)的中断向量开始运行,因此,调试Application Project时需要下载Bootloader文件,我们在Application Project的Debug Configuration中添加相关部分。
    8 w0 l3 S+ ]$ W9 ^, k) O2 |9 l" X
    " w: o% B; \2 t' F8 a) L" ]& x) h

    5twze11xilr64063129740.png

    5twze11xilr64063129740.png

    5 c; P$ h4 [5 _- S6 o: o# t& EApplication Project Debug Configuration Startup选项卡配置1 {4 v" X* E- m3 K

    ) E, K, V) V7 l' g7 g' \( @$ j* B增加对于Bootloader的加载,类型选项设定为Image and Symbols,这样调试状态下可以跟踪Bootloader中代码运行的状态。
    & b' `1 F! x+ l1 b; `: b
    / T, P' s( W/ q/ B1 s. z同时,将Application Project对应的***.elf → Load type设定为Symbols only,仅下载标号。由于加载了Application Project对应的symbol,因此我们可以调试时检查代码的运行状态。但实际下载到code flash的内容是经过了Python脚本处理,增加了Header,TLV和Trailer等信息的***.bin.signed文件,因此可以通过Bootloader的安全校验。
    / y) |1 ]! s! j& Y
    $ N5 ~- j/ ~- Z6 T按下Debug按钮,启动调试,此时可以发现PC停在Bootloader的reset向量处。# [: r( t$ V4 }% d

      G* Y8 b  h% U& [5 f6 F  D: J* G& d) n4 W6 z, _
    调试Application Project
    $ ]- {( k" Y* s6 D8 E" z
    * ?+ R- J. a$ g/ m  E点击Load Ancillary按钮
    # I, ^4 ]: W# l5 m# e2 u, M$ o4 u; d! x
    ,将Application Project Debug文件夹下的***.bin.signed下载到芯片上,注意选择地址为Primary Slot起始地址0x18000。+ ^; E, I% K  U  i9 T( L! g
    ! C5 c, D& a. j* `9 U$ _
    3 h# r& k8 p* F- w
    将1.0.0版本Image ***.bin.signed文件下载到Primary Slot的起始地址0x180005 s9 @. }3 q+ G) p; d

    & @* w& e0 i' P* ?$ z在memory窗口检查当前Primary Slot中的内容,可以看到Image版本为1.0.0。  H3 l# h0 S# w! s$ U2 Z6 l
    % U5 b! m! y1 Q& [
    0 _% E6 \8 X6 b8 Y1 L# {; D( D" i
    PC Primary Slot中存储了1.0.0版本的Image, M( o# K4 e# B$ U/ d( ]' E
    7 R* }, z0 S2 [) a* H
    点击Resume,可以发现PC指针停在Primary Slot的Application Project Reset向量处,此时PC指针地址0x00018ab8位于Primary Slot地址空间范围(0x18000~0x37FFF)。如下图所示。+ o$ s: s; @' }$ B3 o
    ! o4 y8 U, v9 J- C  @2 M( P1 Q
    之后在任意时刻暂停,通过PC指针的地址空间范围和对应的代码标号可以发现PC已经运行在Application Project中了。
    & [  p4 T2 P! D# L* F
    1 N8 o" s5 D& U- i3 z; y
    1 M& I. u' Y+ }8 a2 v0 j9 y) z3 UPC指针运行在Primary Slot中
    # E/ T; {5 \# o' M$ G% E
    7 b' ^6 c, T& {再次点击resume,则可以观察到代码运行在Primary Slot的Application Project中。
      U/ T3 N) p! d+ }9 R1 b* y4 R( W" @
    4
    " Q" c8 k/ ?' j( Y* [( T升级并验证
    7 f1 a- ]; r$ q6 {由于升级方式是基于应用层面的实现,因此依赖客户的设计。如果需要展示,则建议参考下方链接Application Note中的内容,对应的示例代码包含了遵循XModem协议利用UART传输Image。
    ( p1 {. ]9 v$ [, Rhttps://www.renesas.com/us/en/document/apn/ra6-mcu-advanced-secure-bootloader-design-using-mcuboot-and-code-flash-dualbank-mode
    / p; A" Z7 k7 n5 y' a7 t9 S
    + _3 p, i* l7 b6 o# J; Y% o在调试状态下,可以通过将待更新的Image文件下载到Secondary Slot中,重启即可使得升级生效。
    * q- ~9 b- R/ D/ L% C* M2 a) ^3 ~( I
    在Application Project上稍作修改,比如原始的Project在EK-RA4M3上使三个LED(红绿蓝)一起闪烁,而我们将代码更新为只有一个LED(蓝色)闪烁。同时,将Image Version从1.0.0更改为1.1.0,重新Build Project,确认Debug文件夹下的.bin.signed重新生成了。6 Q1 C2 g! |5 V

    ' c* n: h6 L. I9 J. u" C5 h现在将1.1.0版本的Image烧录到Secondary Slot中,点击Load Ancillary,选中***.bin.signed,目标地址选择0x48000。
    : h' Z5 d/ ?1 d! S+ I& |% A+ C. K% d' }, z# a$ O. V

    ' o, v% @* v! ]! k, d将1.1.0版本Image下载到Secondary Slot中. U' Z  L: J* W, W  C9 X" d

    1 k6 T% t1 Z2 _% ]下载成功后查看Memory中的内容,可以确认Secondary Slot存储了1.1.0版本的Image。
    . N3 X5 K+ M% n! h
    0 M6 a( t, A8 V: {& l; r0 \$ W. {. A& X
    Secondary Slot保存了1.1.0版本的Image0 }8 b$ H( w8 e% Z0 {  t
    & e8 n8 Y/ Z4 |, o/ b
    按下Reset按钮& v" G8 m! F& n7 [3 b
    / r/ m$ J, b& f% W5 o3 ~  Z
    ,使得Bootloader运行,启动代码升级。* [3 q7 U2 o) r' S2 `7 m6 B

    0 H) |! P3 ]' T3 R  ]1 i可以看到EK-RA4M3从三颗LED闪烁变为仅有一颗蓝色LED闪烁,表明升级成功。
    ) b* d# U2 J1 M( Z8 y. H* ^1 q' t4 P0 B$ h
    升级完成后查看Primary Slot和Secondary Slot,发现两个Slot内容已经交换了。Primary Slot中保存了1.1.0版本的Image文件,而Secondary Slot中保存了1.0.0版本的Image文件,如下图所示。6 u, N' L0 y7 h4 F$ C  Z/ z

    5 W3 k! h" ^0 L/ ]4 }/ |3 [, T! O. p* b# O* l# k! f, o( }
    Primary Slot保存了1.1.0版本的Image,Secondary Slot保存了1.0.0版本的Image( L1 t% h7 D% a- [
    + _4 L' M5 p& e, R5 z
    . Z( q4 P" b! o5 l, F* Z. s
    ------------ END ------------
    - }/ U; n; B# s, X7 U& t& [1 i. z# G$ u  ~! b( W5 q( h# z! m8 F
    MCUboot Overwrite模式升级流程及应用
    $ m! b4 U8 v9 a0 O4 c- D
    % Z8 C& Z# o. g2 V7 p8 r
    & |9 q, c4 R3 c, i单片机TCM相比DMA的优势4 U9 v0 @+ f" Q9 H' z

    7 j, r! [! \! A! l) X; E9 p5 F; q1 W0 W3 t7 y% N, b# O
    在MCU上实现AI将成为常态
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表