电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

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

wt2rxk0nxol64012789922.gif

wt2rxk0nxol64012789922.gif
  H1 `- f" n7 H, K: {
点击上方蓝色字体,关注我们
! |2 T% x9 i- k. a) Q来源于粉丝提问。
2 ?) k& |" t3 w' V# Z
9 }/ \; [5 a: R/ a/ G

mzfvs0kzqow64012790022.png

mzfvs0kzqow64012790022.png
/ L+ y; T" ?  }  x1 F

* L& I( ~* b! n

0ug1jrywqiq64012790122.png

0ug1jrywqiq64012790122.png

  {3 Y. K2 r- S/ }0 I- _3 b+ w
& c7 `7 m9 Z2 @) n

' ]# n/ H9 ^" i# M: Z问题1:IAP的退出机制是通过跳转到业务APP实现的,实际上是“转移控制权”而非退出循环。1 h9 L/ h6 z& I
( B  c( K5 _# G# P( {1 {! f' ?1 a

% F5 ]2 ^' G8 r) O问题2:你对复位需求的理解是对的,要实现“不复位更新”,需要调整架构,如在业务APP中集成IAP功能,或者通过双备份机制支持热更新。
$ K+ b1 Y' N0 v% y' s" B/ x16 t) ?0 r. K+ W$ N/ ?
问题1:IAP应用的while循环是怎么退出的?# G1 [& s- b5 [
在你提供的IAP程序代码中,while(1)是一个无限循环。从代码逻辑看,IAP应用的退出并没有显式的break语句。
0 x  I7 x/ i7 i4 y
1 E+ D7 x0 n: i3 o" o它的退出依赖于以下逻辑:
8 r* z5 D. q% ]- E: Q) i
  • 当用户按下按键(代码中使用了key_get()),且满足相关条件时,会调用iap_load_app()函数。
  • iap_load_app()函数中完成了对目标APP的跳转操作。
  • 跳转通过设置MCU的向量表和程序计数器(PC寄存器)完成,实际等同于切换到业务APP的代码空间并开始执行。
  • 一旦跳转到业务APP,MCU的控制权就交给了业务APP,IAP程序实际上“停止”了,因为MCU不再执行IAP的指令。
    - c* D; N' Y# U9 T  F

    8 v' s( m/ B. @2 x$ G本质上,IAP应用的退出依赖于代码跳转(跳转到新的程序入口点),而不是常规意义的循环退出。
    * c4 \& C- b+ A8 D0 H% d7 i( {
    $ p0 C" T( X) |; Y( I+ {2 @* R* d因此,while(1)虽然没有显式退出,但程序已经通过跳转到新的APP实现了功能切换。/ G7 b* O6 h4 `2 n4 z' ^" x
    2
    # P+ W: Q% ^4 u& ~7 _问题2:业务APP运行后,如何进行代码更新?
    / n' J- S1 R' n& H+ B3 g, F7 j
    0 x* |( h7 K: `% Y你的理解大体正确:在业务APP运行期间,IAP应用已经被“替换”,无法直接从业务APP切回到IAP应用。
    0 E  k) i' b& {) @2 M2 E7 J. n4 F4 {
    8 z2 a- A* q! c# U9 }) h( O- G根据这位粉丝提供的图片资料现有流程理解:
  • IAP应用作用:2 H8 T- e( ~) M+ d7 ?
  • IAP程序运行后,可以通过串口或其他接口接收新的业务APP文件,并将其烧录到FLASH指定区域。
  • 烧录完成后,IAP应用跳转到业务APP的入口,业务APP开始运行。
    * b* m0 \- H/ O( r, a3 P
  • 问题描述:& ?6 G3 \. J- V
  • 在业务APP运行期间,业务APP接管了全部系统资源(如串口等),IAP程序不再运行,无法进行新业务APP的下载和烧录。
  • 如果需要更新APP,只能通过复位MCU重新启动IAP程序,再次进入更新模式。
    * x5 T2 Q% U1 Z  Z" a( d4 _
    [/ol]! O5 P) T7 L0 h6 A# ?+ F
    36 f" V. F0 @& k# G6 z+ r
    要实现“在业务APP运行期间,不复位,更新业务APP”的方法
    , N. H% Y5 D- W4 j这种需求可以通过设计实现,但需要对程序架构进行调整,以下是几个常见的解决方案:6 b2 t/ J% y8 t; Q3 H! m6 S3 ~

    4 K" L8 p6 s4 F; G
    7 O% {: F2 R9 P$ O+ ]/ Y$ a
    方案1:业务APP中集成IAP功能- b" Z8 d& u! C: c# Z" `, {
    在业务APP中预留IAP功能代码,例如:" u' Z* o7 m3 J6 z# t, U
  • 在业务APP运行时监听某个特殊信号(如通过串口发送特定指令);
  • 收到信号后,业务APP调用IAP功能模块完成新代码的下载和烧录;
  • 烧录完成后,直接跳转到新的业务APP。" k1 B% z- V2 @7 C! i1 S$ ?
    # j8 x; c7 L% v& M
    1 Q5 T: I6 k5 r' W7 g
    优点:业务APP运行期间即可完成更新,无需复位。6 Y! D) ^! k7 j' k" G
    $ n$ |8 Y2 r2 ~! k1 f
    缺点:增加了业务APP的复杂性(需同时管理业务逻辑和IAP逻辑)。5 r2 [; ?+ J8 h3 W) V+ U3 a$ w) i

    5 |, \/ ]/ g7 G

      X6 @  o& b! i0 b( @方案2:设计IAP与业务APP共存
    * e' u& g9 C5 ^0 W2 h7 n) H7 R" U通过MCU的FLASH分区管理,让IAP和业务APP同时存在于不同的区域,具体做法:! {% U0 m; o+ z0 V
  • 双区启动机制:
    ; F1 [7 f5 g* k0 j
  • IAP程序在启动时检测用户输入或某个标志位。
  • 如果需要更新,进入IAP模式接收新APP文件。
  • 如果不需要更新,直接跳转到业务APP。
    1 j: X: m3 C) X) C" e
  • 业务APP的重启机制:  N+ C$ z% x: b7 G0 `7 a8 q' X
  • 在业务APP运行期间,监听串口信号,收到更新请求后通过软件触发复位(或设置标志位并复位)。
  • 复位后重新进入IAP程序完成更新。
    $ h9 Y* y9 f$ S6 `0 n8 e* d, K
    [/ol]
    $ M* Y* E& k% u* `

    3 ]/ i6 A, O2 v9 z0 K优点:IAP程序简单,不会受到业务APP逻辑的影响。4 {9 T8 J) Q- H# T, F. h" @

    ! v0 @( y! l$ R, W% j缺点:仍然需要复位,但复位可以由业务APP通过软件触发(无须用户手动操作)。; B* k- B+ H( \5 l& k( j4 L

    8 I* m: T) b% W/ X8 I- y$ o
    # Y- f5 Q0 b) \
    方案3:通过双备份机制实现热更新
    : y! p2 x5 `1 g部分高端MCU支持双备份机制,可以实现“热更新”,步骤如下:
  • IAP程序负责维护两个FLASH区域,分别存储当前运行的APP和待更新的APP;
  • 当业务APP运行时,允许IAP程序后台烧录新的APP到备份区域;
  • 烧录完成后,通过设置标志位通知系统下次启动时切换到新APP。
    8 e3 z8 s7 x* b! u  n8 {[/ol]
    7 G" B' |  W  T- q; e优点:支持后台更新,用户体验更好。/ q  C- E: L. Q, u' l
    5 H7 c# `6 i; J" x
    缺点:FLASH容量需求较大,需要支持双分区。0 b) \; g# l9 W) K: l

    1fkoexeljw164012790222.jpg

    1fkoexeljw164012790222.jpg

    . N5 _9 a  @; [! B, Z7 l& A8 T

    ecc2pzkezci64012790322.gif

    ecc2pzkezci64012790322.gif

    & \+ H, U) i8 V点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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