单片机 IAP 技术方案设计
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 技术方案设计的更多相关文章
- 单片机IAP学习
1.IAP是什么--简介 IAP是In Application Programming的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可 ...
- STC单片机 IAP(EEPROM)的使用
STC89C51.52内部都自带有2K字节的EEPROM,54.55和58都自带有16K字节的EEPROM,STC单片机是利用IAP技术实现的EEPROM,内部Flash擦写次数可达100,000 次 ...
- IAP技术原理
目录 IAP技术原理 更新记录 IAP与ISP的概念及原理 ISP简介 ISP原理 IAP简介 IAP原理 IAP优势 IAP的设计 1.程序启动流程 2.中断向量表的重定位 3.IAP跳转APP函数 ...
- 单片机成长之路(avr基础篇)- 001 ISP与IAP的区别
ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...
- 基于IAP的STM32程序更新技术
引言 嵌入式系统的开发最终需要将编译好的代码下载到具体的微控制器芯片上,而不同厂家的微控制器芯片有不同的下载方式.随着技术的发展和应用需求的更新,用户程序加载趋向于在线编程的方式,越来越多的芯片公司提 ...
- 单片机ISP、IAP和ICP几种烧录方式的区别
单片机ISP.IAP和ICP几种烧录方式的区别 玩单片机的都应该听说过这几个词.一直搞不太清楚他们之间的区别.今天查了资料后总结整理如下. ISP:In System Programing,在系统编程 ...
- ISP与IAP的区别
转: ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP ...
- 基于IAP和Keil MDK的远程升级设计
写在前面:三个周之前,我突然想写一个远程升级的程序.那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知.我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题. ...
- STM32的IAP实现
STM32的IAP实现 2014年07月28日 16:31:06 Stylesen 阅读数:556 IAP,全称是“In-Application Programming”,中文解释为“在程序中编程 ...
- 关于ISP、IAP、DFU和bootloader
这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下 在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器.说“烧”写一点 ...
随机推荐
- 五、java操作swift对象存储(官网样例)
系列导航 一.swift对象存储环境搭建 二.swift添加存储策略 三.swift大对象--动态大对象 四.swift大对象--静态态大对象 五.java操作swift对象存储(官网样例) 六.ja ...
- 嵌入式软件工程师笔试面试指南-ARM体系与架构
哈喽,大家好.我终于回来了!19号刚提交完大论文,就被抓去出差了,折腾了整整一周,26号晚上,才回到学校.鸽了好久都没更新干货了.今天更新一篇关于Arm的笔试面试题目,文章内容已同步更新在github ...
- 黑池舞蹈节banner
- 8. exporter
一.已经实现的收集器 1.1 可收集的内存指标 1.2 可收集的jetty指标 二.自定义收集 2.1 summer 2.2 histogram 三.架构设计 exporter作为Prometheus ...
- MoeCTF 2023(西电CTF新生赛)WP
个人排名 签到 hello CTFer 1.题目描述: [非西电] 同学注意: 欢迎你来到MoeCTF 2023,祝你玩的开心! 请收下我们送给你的第一份礼物: https://cyberchef.o ...
- Laravel - 控制器的session ( 转载 )
设置路由 //使用session,需要开启session,//session的开始类在/app/Kernel下//protected $middlewareGroups = [// 'web' =&g ...
- 【面试题精讲】Redis如何实现分布式锁
首发博客地址 系列文章地址 Redis 可以使用分布式锁来实现多个进程或多个线程之间的并发控制,以确保在给定时间内只有一个进程或线程可以访问临界资源.以下是一种使用 Redis 实现分布式锁的常见方法 ...
- [转帖]MySQL如何进行索引重建操作?
MySQL如何进行索引重建操作? - 潇湘隐者 - 博客园 (cnblogs.com) 在MySQL数据库中,没有类似于SQL Server数据库或Oracle数据库中索引重建的语法(ALTER IN ...
- [转帖]Archery
Archery SQL 审核查询平台 文档 | FAQ | Releases 功能清单 数据库 查询 审核 执行 备份 数据字典 慢日志 会话管理 账号管理 参数管理 数据归档 My ...
- 【转帖】dl.google.com的国内镜像源
dl.google.com不能访问 1.通过https://ping.chinaz.com/解析出dl.google.com的国内代理 2.C:\Windows\System32\drivers\et ...