单片机 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 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
随机推荐
- Springcloud和Dubbo的区别。Eureka和Ribbon和Hystrix和zuul
netty 是什么? "netty 是一个基于nio的客户.服务器端编程框架,netty提供异步的,事件驱动的网络应用程序框架和工具,可以快速开发高可用的客户端和服务器.netty是基于ni ...
- vue 引入echars 亲测版
网上找了很多例子,其中有修改main.js的配置的,反正我没搞成功,最后实验成功的步骤如下 1.首先创建一个Vue CLI 的工程 . 注:具体步骤查看以前的博客 https://www.cnblog ...
- vue学习笔记 十六、params方式带参数的页面跳转
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 小白学标准库之 http
1. 前言 标准库是工具,是手段,是拿来用的.一味的学标准库就忽视了语言的内核,关键.语言层面的特性,内存管理,垃圾回收.数据结构,设计模式.这些是程序的内核,要熟练,乃至精通它们,而不是精通标准库. ...
- JVM 垃圾回收算法与垃圾回收器
本文为博主原创,未经允许不得转载: 如何确定垃圾? 引用计数法: 在 Java 中,引用和对象是有关联的.如果要操作对象则必须用引用进行.因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以 ...
- WPF|分享一个登录界面设计
分享一个登录界面,先看效果图: 准备 文中使用到了一些图标: 我们可以从 iconfont免费下载: 代码简单说明 请随手创建一个WPF项目(.NET Framework..NET 5\6\7皆可), ...
- 【BUS】LIN Bus
概述 随着汽车内电子设备的增多,市场上对于成本低于 CAN 的总线的需求日益强烈,不同的车厂相继开发各自的串行通信(UART/SCI)协议,以在低速和对性能要求不高的场合取代CAN.由于不同车厂定义的 ...
- MySQL高可用搭建方案之(MMM)
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 注意:这篇转载文章,非原创 首发博客地址 原文地址 前言 MySQL的高可用 ...
- [转帖]nginx配置文件中对于if条件语句的写法(附nginx跨域文件配置)
前言 在nginx配置文件中,可以使用if语句,但是对于else语句其实是不支持的,并且and条件和or条件也是不支持的 实现 else条件的写法 新建一个开关变量flag,初始值为0,如果为1说明进 ...
- 部分MySQL的SQL信息整理
模块补丁信息查看 select su as 补丁模块, count(1) as 数量 from gsppatchlog where TO_DAYS( NOW( ) ) - TO_DAYS(deploy ...