嵌入式 IAP 升级功能(#03)流程设计
flowchart TB %%{init: { "flowchart": { "curve": "basis" } } }%% A1(引导程序之流程)-->B1(......)-->C1(跳转至应用程序) A2(应用程序之流程)-->B2(......)-->C2(跳转至引导程序)
引导程序流程
引导程序的设计方案我知道有两种:
- 立即跳转方案
- 延时跳转方案
立即跳转方案在判断出应用程序有效之后会立即执行跳转操作,该方案适用于对启动时间要求比较高的产品。延时跳转方案则是先在引导程序中等待一段时间,在这段时间内如果没有任何请求则时间到了之后会自动跳转至应用程序,否则将停留在引导程序中。
立即跳转方案
flowchart TB %%{init: { "flowchart": { "curve": "basis" } } }%% PowerReset(设备上电复位)-->IapStart(引导程序开始)-->IapCheckApp[检查应用程序有效标识]-->IapIsAppValid{是否有效} IapIsAppValid--是-->IapJumpToApp[跳转进入应用程序]-->IapOver(引导程序结束) IapIsAppValid--否-->IapRemap[重定向中断向量表]-->IapInit[配置相关外设]-->IapIsHaveUpdateData{是否存在<br>升级数据} IapIsHaveUpdateData--否-->IapBeforeJump IapIsHaveUpdateData--是-->IapDoUpdate[执行升级操作]--->IapEraseUpdateData[擦除升级数据]-->IapIsUpdateSucc{升级成功} IapIsUpdateSucc--是--->IapSetAppValid[修改应用程序有效标识:有效]-->IapBeforeJump[关闭外设和中断]-->IapJumpToApp IapIsUpdateSucc--否-->IapIsAppErased{应用程序已损毁} IapIsAppErased--否-->IapBeforeJump IapIsAppErased--是<br>留在引导程序中-->IapComm[执行通信任务]-->IapIsRecvDone{收到升级数据} IapIsRecvDone--否-->IapComm IapIsRecvDone--是-->IapDoUpdate
延时跳转方案
flowchart TB %%{init: { "flowchart": { "curve": "basis" } } }%% PowerReset(设备上电复位)-->IapStart(引导程序开始)-->IapCheckApp[检查应用程序有效标识]-->IapIsAppValid{是否有效} IapIsAppValid--是-->IapWait{计数超时<br>(延时跳转)} IapWait--否-->IapWait IapWait--是---------->IapJumpToApp[跳转进入应用程序]-->IapOver(引导程序结束) IapIsAppValid--否-->IapRemap[重定向中断向量表]-->IapInit[配置相关外设]-->IapIsHaveUpdateData{是否存在<br>升级数据} IapIsHaveUpdateData--否-->IapBeforeJump IapIsHaveUpdateData--是-->IapDoUpdate[执行升级操作]--->IapEraseUpdateData[擦除升级数据]-->IapIsUpdateSucc{升级成功} IapIsUpdateSucc--是--->IapSetAppValid[修改应用程序有效标识:有效]-->IapBeforeJump[关闭外设和中断]-->IapJumpToApp IapIsUpdateSucc--否-->IapIsAppErased{应用程序已损毁} IapIsAppErased--否-->IapBeforeJump IapIsAppErased--是<br>留在引导程序中-->IapComm[执行通信任务]-->IapIsRecvDone{收到升级数据} IapIsRecvDone--否-->IapComm IapIsRecvDone--是-->IapDoUpdate
应用程序流程
flowchart TB %%{init: { "flowchart": { "curve": "basis" } } }%% AppStart(应用程序开始)-->AppRemap[重定向中断向量表]-->AppInit[配置相关外设]-->AppTask[执行应用功能]-->AppComm[执行通信任务]-->AppIsRecvDone{收到升级数据} AppIsRecvDone--否-->AppTask AppIsRecvDone--是-->AppSetAppInvalid[修改应用程序有效标识:无效]-->AppBeforeJump[关闭外设和中断]-->AppJumpToIap[重启进入引导程序|跳转进入引导程序]-->AppOver(应用程序结束)