1、前言

关于 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 网络升级等。


2、IAP 技术方案

关于 ISP 技术这里不过多介绍,有兴趣的朋友可以自己找资料看看。

在实现 IAP 技术时,针对通过 bootloader 更新 app 程序通常会有多种实现方式,可不仅仅只是 Flash 划分两个分区,然后用 bootloader 对 app 分区编程这一种方式。

划分两个分区,只有bootloader和app分区,这个是最简单也是最基本的功能;而在实际产品开发过程中,需要考虑多种因素和需求,如:升级失败了该怎么办?想恢复出厂的版本怎么办?等等一系列的问题。

开发IAP时,最基本的功能就是要有接收新程序的通信协议(用来接收固件程序,以下简称通信协议栈),下面介绍几种常见的实现方式:

2.1、bootloader 程序集成通信协议栈

以下方案是由 bootlodaer 集成通信协议栈,编程操作均在 bootloader 中实现,APP 程序中基本不涉及编程操作。

优点:在没有 APP 程序或者 APP 程序异常的时候也能更新程序

缺点:bootloader 相对复杂,且程序 Flash 占用空间大

方案一:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 首先擦除当前 APP 程序后,开始接收新的 APP 程序并直接写入 APP 分区中。

Flash 分区:    |     booloader Flash     |     app Flash     |

方案二:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 不会擦除当前 APP 程序,而是将接收到的新 APP 程序写入划分好的空白 Flash 中,等全部接收完成并校验成功时,才开始擦除当前 APP 程序,并将接收完成的新 APP 程序写入。

Flash 分区:    |     booloader Flash     |     app Flash     |     空白Flash     |

方案三:更新程序时,发送升级指令给到 MCU ,MCU 通过复位或者跳转的方式进入 bootloader 中,bootloader 不会擦除当前 APP 程序(APP1),而是将接收到的新 APP 程序写入已擦除的 APP2 中,等全部接收完成并校验成功时,将 APP1 程序有效标志清除,设置 APP2 程序有效标志,bootloader 根据有效标志选择需要进入的 APP 程序 (同理:APP2下次更新程序时,先擦除 APP1 的无效程序,然后将接收的程序写入 APP1,接收完成并互转有效标志)。

Flash 分区:    |     booloader Flash     |     app1 Flash     |     app2 Flash     |

2.2、App 程序集成通信协议栈

以下方案是由 app 集成通信协议栈,编程操作在 bootloader 程序中和 APP 程序中基本都涉及;且以下方案至少需要划分三块区域。

优点:bootloader 程序 Flash 占用空间小

缺点:在没有 APP 程序的情况下无法实现更新,且 Flash 容量需求大;由于 APP 程序迭代快,可能容易出现 bug,无法对程序进行更新

方案四:更新程序时,app 开始接收新的 APP 程序并直接写入划分好的空白 Flash 中,等全部接收完成并校验成功时,通过复位或者跳转的方式进入 bootloader 中,由 bootloader 开始擦除当前 APP 程序(可能有朋友要问,为啥不能在 app 程序中实现呢?请问你能踩着左右脚上天吗!),并将接收完成的新 APP 程序写入(此方案 APP 和 bootloader 均涉及编程操作)。

Flash 分区:    |     booloader Flash     |     app Flash     |     空白Flash     |

方案五:更新程序时,app 开始接收新的 APP 程序并直接写入已擦除的 APP2 中,等全部接收完成并校验成功时,将 APP1 程序有效标志清除,设置 APP2 程序有效标志,复位后,bootloader 根据有效标志选择需要进入的 APP 程序 (同理:APP2下次更新程序时,先擦除 APP1 的无效程序,然后将接收的程序写入 APP1,接收完成并互转有效标志)(此方案 只有 APP 涉及编程操作)。

Flash 分区:    |     booloader Flash     |     app1 Flash     |     app2 Flash     |


2.3、总结

需求及特点

方案一

方案二

方案三

方案四

方案五

适用Flash容量小

×

×

×

×

Boo loader 空间占用小

×

×

×

无APP 程序可更新

×

×

APP 协议栈异常时可更新

×

×

不更新程序即可版本回退

×

×

×

一直更新失败也能正常运行

×

通信协议栈更新

×

×

×

OTA 升级

×

① 如果是接收程序时出现问题,即使失败也不受影响,但如果擦除程序后写入有问题,则可能无法正常运行

其中:

方案三和方案五由于程序运行地址不同,因此需要对 APP 分别进行编译链接,可应用性大打折扣。

OTA 升级由于采用的无线升级方式,因此相对于“直接线控升级”来说断连的可能性较高,出错的情况也较高,不适合 MCU 每次接收完一帧数据后立马写入。

单片机 IAP 技术方案设计的更多相关文章

  1. 单片机IAP学习

    1.IAP是什么--简介 IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可 ...

  2. STC单片机 IAP(EEPROM)的使用

    STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...

  3. IAP技术原理

    目录 IAP技术原理 更新记录 IAP与ISP的概念及原理 ISP简介 ISP原理 IAP简介 IAP原理 IAP优势 IAP的设计 1.程序启动流程 2.中断向量表的重定位 3.IAP跳转APP函数 ...

  4. 单片机成长之路(avr基础篇)- 001 ISP与IAP的区别

    ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...

  5. 基于IAP的STM32程序更新技术

    引言 嵌入式系统的开发最终需要将编译好的代码下载到具体的微控制器芯片上,而不同厂家的微控制器芯片有不同的下载方式.随着技术的发展和应用需求的更新,用户程序加载趋向于在线编程的方式,越来越多的芯片公司提 ...

  6. 单片机ISP、IAP和ICP几种烧录方式的区别

    单片机ISP.IAP和ICP几种烧录方式的区别 玩单片机的都应该听说过这几个词.一直搞不太清楚他们之间的区别.今天查了资料后总结整理如下. ISP:In System Programing,在系统编程 ...

  7. ISP与IAP的区别

    转: ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP ...

  8. 基于IAP和Keil MDK的远程升级设计

    写在前面:三个周之前,我突然想写一个远程升级的程序.那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知.我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题. ...

  9. STM32的IAP实现

    STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556   IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...

  10. 关于ISP、IAP、DFU和bootloader

    这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下   在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器.说“烧”写一点 ...

随机推荐

  1. 版本升级 | v3.0.0卷起来了!多种特殊情况解析轻松拿捏!

    在过往发行版的基础上,结合社区用户提供的大量反馈及研发小伙伴的积极探索,项目组对OpenSCA的解析引擎做了全方位的优化,v3.0.0版本正式发布啦~ 感谢所有用户的支持和信任~是很多人的一小步聚在一 ...

  2. 三、docker容器的常用命令

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  3. 【TouchGFX】Callback

    回调函数模板定义 单参数回调函数模板 实现回调函数接口: 实现合法性检查接口: 实现执行接口: 按键触发回调实现 定义回调数据结构对象 使用回调数据结构构造函数 执行接口实现 整个切换机制的管理主体对 ...

  4. 0xGame 2023【WEEK4】Crypto WP

    Danger Leak 查看代码 from random import * from secret import flag from Crypto.Util.number import * m = b ...

  5. ONVIF网络摄像头(IPC)客户端开发—ONVIF介绍

    ​ 1.前言: 网上已经有很多关于ONVIF开发的资料,这里概括介绍一下ONVIF协议以及介绍一下我自己在开发ONVIF网络摄像头的一些流程和经验,做个开发记录和经验总结,以备将来查看,也可供他人参考 ...

  6. [转帖]linux设置page cache大小,Linux Page Cache调优在Kafka中的应用

    本文首发于 vivo互联网技术 微信公众号 链接: 作者:Yang Yijun 本文主要描述Linux Page Cache优化的背景.Page Cache的基本概念.列举之前针对Kafka的 IO ...

  7. Chrony 的学习与使用

    Chrony 的学习与使用 背景 之前捯饬 ntp 发现很麻烦, 经常容易弄错了. 昨天处理文件精确时间时 想到了时间同步. 发现只有自己总结的ntpdate 但是还没有 chronyd相关的总结 本 ...

  8. [转帖]Jmeter中线程组和setUP线程组、tearDown线程组的区别

    JMETER: setUP线程组:在测试任务ThreadGroup 运行前先被运行.通常用在运行测试任务前,做初始化工作.例如建立数据库连接初始分化工作.用户登录 tearDown线程组:在测试任务线 ...

  9. [转帖]kafka搭建kraft集群模式

    kafka2.8之后不适用zookeeper进行leader选举,使用自己的controller进行选举 1.准备工作 准备三台服务器 192.168.3.110 192.168.3.111 192. ...

  10. [转帖] 常见的Socket网络异常场景分析

    https://www.cnblogs.com/codelogs/p/16001770.html 原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 在目前微服务的 ...