单片机 IAP 功能基础开发篇之APP升级(一)
引言
目的
主要介绍单片机 IAP 开发的设计思路,如何不使用下载烧录器的方式对单片机的程序进行升级,升级区域包括 bootloader 和用户程序的升级,升级方式有 UASRT 通信、CAN 通信和 OTA 升级。
本文目前介绍的是 bootloader 对用户程序区升级的开发设计思路,称其为 IAP。
术语及缩写
- BOOT:Bootloader 程序
- APP:用户程序
参考资料
简介
简单地说,bootloader就是在操作系统内核运行前运行地一段小程序。通过这段小程序,可以对硬件设备,如CPU、SDRAM、Flash、串口等进行初始化,也可以下载文件到系统板、对Flash进行擦除和编程,真正起到引导和加载内核镜像的作用,但是随着嵌入式系统的发展,bootloader已经逐渐在基本功能的基础上,进行了扩展,bootloader可以更多地增加对具体系统的板级支持,即增加一些硬件模块功能上的使用支持,以方便开发人员进行开发和调试。从这个层面上看,功能扩展后bootloader可以虚拟地看成是一个微小的系统级的代码包。
在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。
通常,BootLoader是严重地依赖于硬件而实现的。所以在这种情况下,基本都是不同的处理器架构都有不同的Bootloader。
BOOT 和 APP
BOOT 程序和 APP 程序是两个独立的工程,互不干扰,但是都是依赖于同一硬件平台进行开发的。
工作原理
单片机内部至少划分有两块存储区,一般一块被称为 BOOT 程序区,另外一块被称为 APP 程序区(有些自带EEPROM功能的可再划分为数据储存区)。单片机上电运行在BOOT区,如果有外部改写程序的条件满足,则可以对 BOOT 程序区 APP 程序区(还有数据储存区)的程序进行改写操作。如果外部改写程序的条件不满足,程序指针跳到 APP 程序区,开始执行放在 APP 程序区的程序,这样便实现了 IAP 功能。
应用场景
在使用 IAP 技术之前,需要先了解一下什么情况下需要开发 BootLoader,以免在完全没必要的情况下增加开发工作量;
产品开发完成后,后期有升级售后需求的,更新程序有两种方式,重新烧写程序升级和通过BootLoader升级;重新烧写程序仅通过开发者进行实现,不能由售后人员或客户自行升级,若设备产品安装复杂,甚至需要通过拆解才能烧写程序升级,过程繁琐,且客户通常不允许这么做;此时,为了解决这些弊端,BootLoader 功能就必须实现。
IAP开发设计
根据 IAP 功能特性,BOOT 程序是在 MCU 上电时执行的,APP 是由 BOOT 跳转后执行的,因此对于 BOOT 和 APP 的分区和流程如下。
内存分配
开发 BootLoader 前,首先需要规划 MCU 的 ROM 分区,给 BOOT 和 APP 预留足够 ROM 空间,使两个程序可以互相独立运行,就必须先进行 ROM 内存分配,为BootLoader 预留足够的空间,避免BootLoader程序编译后的固件大小超出所属空间,从而影响用户程序(APP)区,常用的内存分配图如下:
| MCU 分区 | 内容描述 | 备注 |
|---|---|---|
| Bootloader 程序区 | 中断向量表 | |
| BOOT 可执行程序 | ||
| 用户程序区(APP) | 重定向的中断向量表 | 需要软件配置 |
| APP 可执行程序 | ||
| 数据储存区 | 系统需要下电保存的数据 | 可选择划分该区域 |
流程图
内存分配完成后,需要一套完整的程序流程图以实现产品的 IAP 功能。
BOOT 流程图
APP 流程图
升级方式
在不具备 IAP 功能的 MCU 基本都是通过下载器的方式进行固件烧录的,那么具备 IAP 功能的 MCU 是通过什么方式进行固件烧录的呢?可以根据一下情况选择合适的升级方式:
- CAN 通信
CAN 总线多用于工控和汽车领域,因此如果产品的定位是属于该领域的,那么 CAN 总线是最合适的升级方式之一,且可自定义协议也可以使用标准的 UDS 通用协议
- 串口通信
串口通信应用及其广泛,和 CAN 通信相比,UASRT 通信机制简单,所以在稳定性和安全性方面稍微较差,但是可以一次发送的数据更多,因此在一定程度上对 MCU 升级的速度更快,比较适用于非工控和非汽车领域的其他领域
- OTA
空中下载技术,通俗理解为远程网络升级,和上面两种相比,OTA 升级不需要在现场通过相关工具连接 MCU 进行升级;可以在任何地方对该 MCU 的程序进行升级,前提是有网络,因此,OTA 升级需要 MCU 产品具备网络功能,实现较为复杂
- 其他
当然,除了上述升级方式外,还有其他的升级方式,上述讲到的,基本属于常用的升级方式
升级过程
由上述流程图可知,收到升级请求后,就需要将接收的固件数据烧录在 MCU 的 ROM 中,实现 BOOT 或 APP 的升级,由于升级是在 BOOT 中实现的,因此该流程图只适用于 BOOT;
但对于单片机来说,RAM 的大小远远小于 ROM 的大小,无法满足一次性接收完整的固件数据到 RAM 中再编程。
既然不能一次性读取,那么可以使用分包读取写入的形式,根据 ROM 的特性决定 RAM 分包的大小,避免编程失败,通常都是 2^n 的大小,且受 ROM 擦除的方式影响,通常升级过程的流程图如下:
程序跳转
在 MCU 升级完成或者是在一定时间内未收到升级请求,那么就需要从 BOOT 跳转至 APP,执行用户程序功能,但在执行 APP 程序前,首先需要验证 APP 程序是否有效(比如擦除后烧写失败则APP程序不完整,在 APP 执行中会出错),才能进行跳转。
验证原因:
- BOOT 和 APP 属于单独工程,若一新的 MCU 先烧录 BOOT 程序,则上电后无 APP 程序,则会引起 MCU 异常中断
- APP 程序擦除后烧写失败则导致 APP 程序不完整,跳转后也会引起 MCU 异常中断
- APP 程序存在但代码数据因为不可抗因素出现错乱,跳转后也会引起 MCU 异常中断或者用户程序功能异常等
- 其他异常情况
如何验证?
- 验证 APP 程序是否存在且完整,通常做法是在指定的 APP 程序区设置一标志位,表示 APP 程序存在(擦除时该标志也会一并擦除)
- 对 APP 程序进行校验,防止 APP 程序存在但因为不可抗因素出现代码错乱的问题
验证结束
- 在验证结束后,若验证成功,则准备跳转 APP 程序,在跳转之前需要 BOOT 关闭相关功能防止跳转时或者跳转后出错
- 跳转至 APP 后,需要进行重定向中断向量表,否则无法正常进入 APP 程序区的中断执行函数,具体原因可先了解中断向量表的含义及作用
单片机 IAP 功能基础开发篇之APP升级(一)的更多相关文章
- 开发一款APP需要多少钱
移动互联网近几年发展尤为迅速,越来越多的企业也开始将目光聚集到了移动互联网,这意味着移动互联网时代到来,而移动APP应用是竞争的一个因素.在移动互联网时代,移动APP开发已经不再是什么新鲜事了,许多的 ...
- Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/bee ...
- 【Linux开发】Linux及Arm-Linux程序开发笔记(零基础入门篇)
Linux及Arm-Linux程序开发笔记(零基础入门篇) 作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer ...
- C# Xamarin移动开发基础进修篇
一.课程介绍 英文原文:C# is the best language for mobile app development. Anything you can do in Objective-C, ...
- 微信公众平台开发:进阶篇(Web App开发入门)
本文转载至:http://blog.csdn.net/yual365/article/details/16820805 WebApp与Native App有何区别呢? Native App: 1.开 ...
- 【转载】salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载
salesforce 零基础开发入门学习(一)Salesforce功能介绍,IDE配置以及资源下载 目前国内已经有很多公司做salesforce,但是国内相关的资料确是少之又少.上个月末跳槽去了新 ...
- 云小课|DGC数据开发之基础入门篇
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:欢迎来到DGC数据 ...
- 还在花钱搞开发?猿团YTFCloud,零基础照样做专业APP
近日,猿团科技再推新品:YTFCloud.这是一套一体化的云端解决方案,用户可以通过平台提供的各类解决方案,一键创建应用,也就是说,YTFCloud实现了APP的DIY自制,用户无需懂得编程,零基础制 ...
- javamail模拟邮箱功能发送电子邮件-基础实战篇(javamail API电子邮件实例)
引言: JavaMail 是一种可选的.能用于读取.编写和发送电子消息的包 JavaMail jar包下载地址:http://java.sun.com/products/javamail/downlo ...
- iOS开发基础:最新的APP打包上架流程
之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
随机推荐
- springboot+vue实现 下载服务端返回的文件功能
开发中会遇到,通过浏览器下载服务器端返回的文件功能,本文使用springboot+vue实现该功能. 后端代码: 注:后端返回的文件名遇到中文就会乱码,一直也没得到很好的解决方案,最后就统一返回1.x ...
- python进阶(5)--函数
文档目录: 一.函数体二.实参与形参三.返回值四.举例:函数+while循环五.举例:列表/元组/字典传递六.模块与函数的导入 ------------------------------------ ...
- 海思Hi35xx uboot启动分析总结
前言 在嵌入式linux设备中,uboot的最终目的就是启动kernel.对于uboot而言,没有人把它引导起来,所以uboot首先需要把自己加载起来,然后再去引导kernel的启动,这也就可以大致的 ...
- [转帖]配置 Windows XP 正常上网(TLS HTTPS),连接到 NAS
https://zhuanlan.zhihu.com/p/208685816# 学习一下. 知乎用户8kqKq9 等 45 人赞同了该文章 Windows XP 是经典的.高效的.可靠的.性能良好的操 ...
- [转帖]awk的printf格式化输出
https://www.cnblogs.com/chanix/p/12738097.html awk的printf格式化输出20121108 Chenxincat sort_result.txt223 ...
- [转帖]细说ASCII、GB2312/GBK/GB18030、Unicode、UTF-8/UTF-16/UTF-32编码
参考: <编码标准-GB2312 GBK GB18030> <字符编码笔记:ASCII,Unicode 和 UTF-8> <字体编辑用中日韩汉字Unicode编码表> ...
- [转帖]Kafka查看topic、consumer group状态命令
https://www.cnblogs.com/AcAc-t/p/kafka_topic_consumer_group_command.html 最近工作中遇到需要使用kafka的场景,测试消费程序启 ...
- [转帖]一文快速入门 ClickHouse
https://zhuanlan.zhihu.com/p/621480049 什么是clickhouse ClickHouse是一种OLAP类型的列式数据库管理系统,这里有两个概念:OLAP.列式数据 ...
- [转帖]一文读懂 K8s 持久化存储流程
https://zhuanlan.zhihu.com/p/128552232 作者 | 孙志恒(惠志) 阿里巴巴开发工程师 导读:众所周知,K8s 的持久化存储(Persistent Storage) ...
- 【转帖】Meta 推出大型语言模型 LLaMA,比 GPT3.5 性能更高
https://finance.sina.com.cn/wm/2023-02-28/doc-imyihfvp8075151.shtml ChatGPT 的爆火使得大家对 AI 进行了深度的讨论,大厂们 ...