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
5 ?* w3 d5 ~, ~ {3 S
! j& |, z& r1 O3 \! z) N7 d' Y
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 `# [# gIAP程序运行后,可以通过串口或其他接口接收新的业务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
( L; `% B1 j' S1 [+ [( V# [2 J
ecc2pzkezci64012790322.gif
4 ?" Y* [* H8 y2 M, ^ t点击阅读原文,更精彩~ |