前言
关于 IAP 技术,做过 bootloader 的想必很熟悉(IAP全称 In Application Programming,即应用编程),和 ISP(全称 In System Programming,即系统编程)不同,ISP 一般都是通过专业的调试器或者下载器对单片机内部的 Flash 存储器进程编程(如JTAG等),而 IAP 技术是从结构上将 Flash 储存器映射分为两个或者多个分区,在一个分区中对其他分区进行编程,这个分区通常称为 bootloader。
OTA(全称 Over The Air Technology,即云端下载技术,也叫做“空中下载技术”),其基础是 IAP 技术, 可以简单理解为 IAP 的另一种实现方式,通常采用的是无线升级方式(串口、CAN 等属于“直接线控升级”),如通过蓝牙近距离无线升级、ESP8266 网络升级等
IAP 技术方案
关于 ISP 技术这里不过多介绍,有兴趣的朋友可以自己找资料看看。
在实现 IAP 技术时,针对通过 bootloader 更新 app 程序通常会有多种实现方式,可不仅仅只是 Flash 划分两个分区,然后用 bootloader 对 app 分区编程这一种方式。
划分两个分区,只有bootloader和app分区,这个是最简单也是最基本的功能;而在实际产品开发过程中,需要考虑多种因素和需求,如:升级失败了该怎么办?想恢复出厂的版本怎么办?等等一系列的问题。
开发IAP时,最基本的功能就是要有接收新程序的通信协议(用来接收固件程序,以下简称通信协议栈),下面介绍几种常见的实现方式:
bootloader 程序集成通信协议栈
以下方案是由 bootlodaer 集成通信协议栈,编程操作均在 bootloader 中实现,APP 程序中基本不涉及编程操作。
优点:在没有 APP 程序或者 APP 程序异常的时候也能更新程序
缺点:bootloader 相对复杂,且程序 Flash 占用空间大
方案一:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 首先擦除当前 APP 程序后,开始接收新的 APP 程序并直接写入 APP 分区中。
| booloader Flash | app Flash |
方案二:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 不会擦除当前 APP 程序,而是将接收到的新 APP 程序写入划分好的空白 Flash 中,等全部接收完成并校验成功时,才开始擦除当前 APP 程序,并将接收完成的新 APP 程序写入。
| booloader Flash | app Flash | 空白Flash |
方案三:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 不会擦除当前 APP 程序(APP1),而是将接收到的新 APP 程序写入已擦除的 APP2 中,等全部接收完成并校验成功时,将 APP1 程序有效标志清除,设置 APP2 程序有效标志,bootloader 根据有效标志选择需要进入的 APP 程序 (同理:APP2下次更新程序时,先擦除 APP1 的无效程序,然后将接收的程序写入 APP1,接收完成并互转有效标志)。
| booloader Flash | app1 Flash | app2 Flash |
App 程序集成通信协议栈
以下方案是由 app 集成通信协议栈,编程操作在 bootloader 程序中和 APP 程序中基本都涉及;且以下方案至少需要划分三块区域。
优点:bootloader 程序 Flash 占用空间小。
缺点:在没有 APP 程序的情况下无法实现更新,且 Flash 容量需求大;由于 APP 程序迭代快,可能容易出现 bug,无法对程序进行更新。
方案四:更新程序时,app 开始接收新的 APP 程序并直接写入划分好的空白 Flash 中,等全部接收完成并校验成功时,通过复位或者跳转的方式进入 bootloader 中,由 bootloader 开始擦除当前 APP 程序(可能有朋友要问,为啥不能在 app 程序中实现呢?请问你能踩着左右脚上天吗!),并将接收完成的新 APP 程序写入(此方案 APP 和 bootloader 均涉及编程操作)。
| booloader Flash | app Flash | 空白Flash |
方案五:更新程序时,app 开始接收新的 APP 程序并直接写入已擦除的 APP2 中,等全部接收完成并校验成功时,将 APP1 程序有效标志清除,设置 APP2 程序有效标志,复位后,bootloader 根据有效标志选择需要进入的 APP 程序 (同理:APP2下次更新程序时,先擦除 APP1 的无效程序,然后将接收的程序写入 APP1,接收完成并互转有效标志)(此方案只有 APP 涉及编程操作)
| booloader Flash | app1 Flash | app2 Flash |
总结
其中:
方案三和方案五由于程序运行地址不同,因此需要对 APP 分别进行编译链接,可应用性大打折扣。
OTA 升级由于采用的无线升级方式,因此相对于“直接线控升级”来说断连的可能性较高,出错的情况也较高,不适合 MCU 每次接收完一帧数据后立马写入。