嵌入式 IAP 在线升级-程序设计

flowchart TB
%%{init: { "flowchart": { "curve": "basis" } } }%%
A1(引导程序之流程)-->B1(......)-->C1(跳转至应用程序)
A2(应用程序之流程)-->B2(......)-->C2(跳转至引导程序)

引导程序流程

flowchart TB
%%{init: { "flowchart": { "curve": "basis" } } }%%
PowerReset(设备上电复位)-->IapStart(引导程序开始)-->IapCheckApp[检查应用程序<br>检查升级标识<br>检查停留标识]-->IapIsAppValid{程序有效<br>无需升级<br>无需停留}
IapIsAppValid--是-->IapJumpToApp[跳转进入应用程序]-->IapOver(引导程序结束)
IapIsAppValid--否-->IapInit[配置相关外设]-->IapCatchKeyboardInput{检测按键}
IapCatchKeyboardInput--持续一秒-->IapCatchKeyboardInput
IapCatchKeyboardInput--有回车键按下<br>或<br>升级控制区中的停留标识立起--->IapSetStayFlag[置位停留标识]-->IapIsHaveUpdateData{是否存在<br>升级数据}
IapCatchKeyboardInput--超时-->IapIsHaveUpdateData
IapIsHaveUpdateData--否--->IapIsNeedWait{是否停留}
IapIsNeedWait--否-->IapBeforeJump
IapIsNeedWait--是-->IapWait{延时计数}
IapWait--持续一分钟-->IapWait
IapWait--超时-------->IapBeforeJump
IapIsHaveUpdateData--是-->IapDoUpdate[执行升级操作]--->IapIsUpdateSucc{升级成功}
IapIsUpdateSucc--是--->IapBeforeJump[关闭外设和中断]-->IapJumpToApp
IapIsUpdateSucc--否-->IapIsAppExist{程序完好}
IapIsAppExist--是-->IapBeforeJump
IapIsAppExist--否-->IapComm[留在引导程序<br>执行交互任务]-->IapIsRecvDone{收到升级包}
IapIsRecvDone--否-->IapComm
IapIsRecvDone--是-->IapDoUpdate

应用程序流程

flowchart TB
%%{init: { "flowchart": { "curve": "basis" } } }%%
AppStart(应用程序开始)-->AppRemap[重定向中断向量表]-->AppInit[配置相关外设]-->AppTask[执行应用功能<br>执行通信任务]-->AppIsRecvDone{收到升级包}
AppIsRecvDone--否-->AppTask
AppIsRecvDone--是-->AppSetAppInvalid[设置升级标识]-->AppBeforeJump[关闭外设和中断]-->AppJumpToIap[重启进入引导程序|跳转进入引导程序]-->AppOver(应用程序结束)