电子产业一站式赋能平台

PCB联盟网

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

粉丝学习STM32 IAP升级遇到的问题

[复制链接]

840

主题

840

帖子

6491

积分

高级会员

Rank: 5Rank: 5

积分
6491
发表于 2024-11-19 08:01:00 | 显示全部楼层 |阅读模式

wt2rxk0nxol64012789922.gif

wt2rxk0nxol64012789922.gif
  Y. U  v; n9 D2 S* I
点击上方蓝色字体,关注我们/ Z; v1 V2 I& p# z
来源于粉丝提问。
2 z: J4 q8 `2 F2 E6 g5 _$ }3 C& v% i( Q$ {7 E, w6 o; E

mzfvs0kzqow64012790022.png

mzfvs0kzqow64012790022.png

5 ?* w3 d5 ~, ~  {3 S
! j& |, z& r1 O3 \! z) N7 d' Y

0ug1jrywqiq64012790122.png

0ug1jrywqiq64012790122.png

6 v0 W4 o" d8 }7 s2 t2 C& X9 m, B9 F4 ~0 H/ x" i

; @( W! {! S& o2 O( ?/ L; r7 R问题1:IAP的退出机制是通过跳转到业务APP实现的,实际上是“转移控制权”而非退出循环。
5 X( @* s8 S+ o2 D, i
$ ~% w: S( I4 k/ R
: C# `! X( s" F; N" Z" o
问题2:你对复位需求的理解是对的,要实现“不复位更新”,需要调整架构,如在业务APP中集成IAP功能,或者通过双备份机制支持热更新。
4 u3 C5 K$ m# `* [/ @" I9 Z; T1( u; K  f" G+ n
问题1:IAP应用的while循环是怎么退出的?, o% g) D- [' K+ P
在你提供的IAP程序代码中,while(1)是一个无限循环。从代码逻辑看,IAP应用的退出并没有显式的break语句。
$ H8 b, o4 N% I( E: B2 j9 X2 u6 c1 F1 v# S+ a
它的退出依赖于以下逻辑:8 ~& A& I6 t, _/ ~- z
  • 当用户按下按键(代码中使用了key_get()),且满足相关条件时,会调用iap_load_app()函数。
  • iap_load_app()函数中完成了对目标APP的跳转操作。
  • 跳转通过设置MCU的向量表和程序计数器(PC寄存器)完成,实际等同于切换到业务APP的代码空间并开始执行。
  • 一旦跳转到业务APP,MCU的控制权就交给了业务APP,IAP程序实际上“停止”了,因为MCU不再执行IAP的指令。2 ]$ k3 A  x/ Q0 O/ k/ y1 o+ }7 N
    0 `, v. k' t( P: ?! |" I
    本质上,IAP应用的退出依赖于代码跳转(跳转到新的程序入口点),而不是常规意义的循环退出。/ ^' E# e- d3 \' _5 V# b

    9 A; c( Z( ^3 U, k$ A因此,while(1)虽然没有显式退出,但程序已经通过跳转到新的APP实现了功能切换。
    ; r0 ?  T' E8 |/ E2$ q* \+ x, U; O, Q
    问题2:业务APP运行后,如何进行代码更新?
    9 U9 `5 Y% u& |% B% @
    0 t: u' s" _2 ^! ?+ Y' o2 _- Z; X你的理解大体正确:在业务APP运行期间,IAP应用已经被“替换”,无法直接从业务APP切回到IAP应用。
    # t$ v& K2 ?( z+ p
    2 a: N* V' v* @9 ?: I4 Y3 ^! F9 w根据这位粉丝提供的图片资料现有流程理解:
  • IAP应用作用:
    7 C7 ^* S' S; N2 y9 G: S7 `# [# g
  • IAP程序运行后,可以通过串口或其他接口接收新的业务APP文件,并将其烧录到FLASH指定区域。
  • 烧录完成后,IAP应用跳转到业务APP的入口,业务APP开始运行。* X$ x  F+ ?2 k% n! a* E3 }0 Z
  • 问题描述:
    2 V! ?( C$ U4 J+ z$ _8 I
  • 在业务APP运行期间,业务APP接管了全部系统资源(如串口等),IAP程序不再运行,无法进行新业务APP的下载和烧录。
  • 如果需要更新APP,只能通过复位MCU重新启动IAP程序,再次进入更新模式。
    - g; L/ u, @9 Q% s# e) X
    [/ol]
    7 Y) s, c2 I4 m: G, j3
    ! H. O4 B6 d4 l要实现“在业务APP运行期间,不复位,更新业务APP”的方法4 a! x3 T3 R/ D3 |/ j* C, T' n7 ^
    这种需求可以通过设计实现,但需要对程序架构进行调整,以下是几个常见的解决方案:
    ) {4 i  [5 i# ?9 _; c# V0 Q) z: a: b9 @: a6 G8 W- X# U& x
    2 H) ?  l" b2 u( L( {4 ^
    方案1:业务APP中集成IAP功能
      @/ R4 S4 O1 A在业务APP中预留IAP功能代码,例如:9 N5 c5 D* |& _1 E/ S0 |' g9 H# @
  • 在业务APP运行时监听某个特殊信号(如通过串口发送特定指令);
  • 收到信号后,业务APP调用IAP功能模块完成新代码的下载和烧录;
  • 烧录完成后,直接跳转到新的业务APP。# t/ S" o9 G+ N# j  }9 N- m
    , ^2 z+ d5 S! X+ O. k3 E7 D

    2 g3 u% c! C  w, V9 v' A优点:业务APP运行期间即可完成更新,无需复位。
    . Y3 n- r$ j  ]7 n
    ) _2 [2 {  p# P' A% k& U1 h0 {缺点:增加了业务APP的复杂性(需同时管理业务逻辑和IAP逻辑)。- a& W8 b4 f8 O( h
    " m/ f- ~6 l$ @3 b  O

    3 Q: N% B% P" R/ E' m9 G方案2:设计IAP与业务APP共存
    $ Q# r" P; Y7 H通过MCU的FLASH分区管理,让IAP和业务APP同时存在于不同的区域,具体做法:
    / H& s) F# g1 V6 ?& I2 l& }; h0 ^* N) v
  • 双区启动机制:9 t" W; N2 b* R& ~, {/ Z4 R
  • IAP程序在启动时检测用户输入或某个标志位。
  • 如果需要更新,进入IAP模式接收新APP文件。
  • 如果不需要更新,直接跳转到业务APP。
    7 l7 s8 n7 S$ k+ Q
  • 业务APP的重启机制:
      ^* k+ f" [% z3 L  v% L+ g! Y2 w& H
  • 在业务APP运行期间,监听串口信号,收到更新请求后通过软件触发复位(或设置标志位并复位)。
  • 复位后重新进入IAP程序完成更新。
    1 _, Z0 d7 d6 o# \$ ]
    [/ol]8 O" x( D% G: z
    + l1 X- C$ R! s/ V) s- Y
    优点:IAP程序简单,不会受到业务APP逻辑的影响。9 h% C2 L7 E9 [

    ; g; v4 Q9 [0 u缺点:仍然需要复位,但复位可以由业务APP通过软件触发(无须用户手动操作)。
    ) }5 f* i- r0 A, L9 D7 {  l3 A  J: j
    7 Z6 \/ D6 p; a% b4 d9 k& E
    方案3:通过双备份机制实现热更新. J0 u  j' b9 m. M
    部分高端MCU支持双备份机制,可以实现“热更新”,步骤如下:
  • IAP程序负责维护两个FLASH区域,分别存储当前运行的APP和待更新的APP;
  • 当业务APP运行时,允许IAP程序后台烧录新的APP到备份区域;
  • 烧录完成后,通过设置标志位通知系统下次启动时切换到新APP。
    , l& b2 }& y7 `  ^$ ]" n' C2 X[/ol]
    5 |* z$ q: R+ E3 R优点:支持后台更新,用户体验更好。) l/ w4 S: `- z" k$ @; }  T

    / L6 D: z& o7 _$ ?* d. [  R缺点:FLASH容量需求较大,需要支持双分区。
    0 A$ O  c2 H6 E- Y

    1fkoexeljw164012790222.jpg

    1fkoexeljw164012790222.jpg

    ( L; `% B1 j' S1 [+ [( V# [2 J

    ecc2pzkezci64012790322.gif

    ecc2pzkezci64012790322.gif

    4 ?" Y* [* H8 y2 M, ^  t点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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