单片机 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 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
随机推荐
- 【调试】kdump原理及其使用方法
kdump机制 简介 Kdump是在系统崩溃.死锁或死机时用来转储内存运行参数的一个工具和服务,是一种新的crash dump捕获机制,用来捕获kernel crash(内核崩溃)的时候产生的cras ...
- 《3D编程模式》写书-第6次记录
大家好,这段时间我完成了对初稿的第二轮修改,已经把稿子提交给编辑了 这里是所有的的写书记录: <3D编程模式>写书记录 本轮修改主要进行了下面的修改: 修改UML描述 增加依赖关系 角色之 ...
- Ribbon默认负载均衡规则替换为NacosRule
近期博主在参与一个 Spring Cloud 搭建,版本为 Hoxton.SR12,服务注册发现组件为 Nacos 的老项目时,发现项目负载均衡组件 Ribbon 的负载均衡规则在某些场景下不够完美, ...
- cs 保研经验贴 | 数学试题 · 自动化所特供版
据(2022 年我所看的)往年经验,自动化所比较重视数学. 感觉,按照自动化所的数学题库复习,就足以应付大多数夏令营的笔试面试了. 目录 高等数学 线性代数 概率论 机器学习 复变函数 其他 同站相关 ...
- Spring Cloud 系列:Seata 中TCC模式具体实现
概述 https://seata.io/zh-cn/docs/dev/mode/tcc-mode https://seata.io/zh-cn/docs/user/mode/tcc TCC模式与AT模 ...
- 问题--VSCODE终端中文乱码问题
1.问题 问题如下,终端出现中文乱码问题 根本原因是VSCODE是UFT-8编码,而终端显示的中文则是GBK编码 网上很多都是改VSCODE为GBK编码,但改终端为UFT-8也挺方便 2.解决方法 1 ...
- 【BAT】递归替换文件后缀
@echo off set /p src_suffix=please input origin suffix: set /p des_suffix=please input target suffix ...
- Go-稀疏数组
package main import "fmt" // 稀疏数组 // 1. 二维数组 // 2. 存在大量相同相同数据和少量不同数据 // 思维: 将大量相同数据转化为: (数 ...
- [转帖]Linux系统NVME盘分区和挂载
https://www.jianshu.com/p/04327f1b97cb 查看系统里面识别到的硬盘和分区的信息 $ sudo fdisk -l Disk /dev/nvme1n1: 1.8 TiB ...
- [转帖]Windows磁盘性能压测(1)-DiskSpd
http://www.manongjc.com/detail/59-xrydhtisrajqsxn.html 本文章向大家介绍Windows磁盘性能压测(1)-DiskSpd,主要内容包括其使用实例. ...