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
/ L+ y; T" ? } x1 F
* L& I( ~* b! n
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; G7 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 jIAP程序在启动时检测用户输入或某个标志位。如果需要更新,进入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
. N5 _9 a @; [! B, Z7 l& A8 T
ecc2pzkezci64012790322.gif
& \+ H, U) i8 V点击阅读原文,更精彩~ |