IAP:物联网终端软件升级技术
摘要:IAP是利用自己的程序代码实现升级程序(新的APP)从外部接口(可以是串口、I2C、SPI、网口等等)写入到flash中,再通过flash读写操作,将新的APP覆盖原有APP程序,在重新从新的APP入口位置启动我们的应用程序,同时也负责IAP代码的修改和迭代。
现在升级已经成为IoT领域边缘升级的基本技术,广泛被现在流行的OTA技术就是其中之一。因为物联网终端会和互联网技术相关,软件迭代速度会比传统制造业高很多,这样就对非现场升级提出了要求,在行业内形成以OTA为主流的升级方式及升级标准。
物联网终端多使用的经济型的MCU,这个类的MCU一般有三种程序写入方式:
ISP:In System Programing
- 在系统编程(使用芯片提供的引导程序(Bootload)加上外设接口进行烧录)
IAP:In applicating Programing
- 在应用编程(软件自身实现在线电擦除和编程的方法,不使用任何工具。程序通常分成两块,分别为引导程序和应用程序)
ICP:In Circuit Programing
- 在电路编程(使用JTAG/SWD接口进行烧录,如J-Link烧录器和J-Flash软件配合使用)
ICP、ISP都是用在厂家在调试过程烧录程序和成片烧录程序的芯片编程方法,在制成后一般利用IAP的方式更加自由的对自己的芯片就行升级。
IAP
若由ROM执行程序,如支持IAP的单芯片能够运用自修改代码进行程序升级,也能对负责IAP功能的代码进行修改或删除从而失去IAP功能。IAP不需要芯片厂家给出特殊的支持,只需要提供FLASH操作、通信接口操作、中断矢量偏移操作和复位操作就可以了。
IAP的原理与实现
IAP是利用自己的程序代码实现升级程序(新的APP)从外部接口(可以是串口、I2C、SPI、网口等等)写入到flash中,再通过flash读写操作,将新的APP覆盖原有APP程序,在重新从新的APP入口位置启动我们的应用程序,同时也负责IAP代码的修改和迭代。
在这里,首先在我们的代码空间,一部分的是我们用于升级的程序IAP,另一部分是我们的应用程序APP,例如如下图进行分配:IAP通过ISP或是ICP方式进行烧录,APP初版通过三种方式进行烧写,在需要升级时通过IAP进行升级。

我们先来看看 Cortex正常的程序运行流程,如下图所示:内部闪存(FLASH)地址起始于 0x08000000,一般情况下,程序文件就从此地址开始写入。
此外芯片是基于Cortex-M内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动,而这张“中断向量表”的起始地址是 0x08000004。
当中断来临,芯片的内部硬件机制亦会自动将 PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
芯片复位后,先从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,如图标号①所示;在复位中断服务程序执行完之后,会跳转到我们的main 函数,如图标号②所示;而我们的 main 函数一般都是一个死循环,在 main 函数执行过程中,如果收到中断请求(发生重中断),此时芯片强制将 PC 指针指回中断向量表处,如图标号③所示;然后,根据中断源进入相应的中断服务程序,如图标号④所示;在执行完中断服务程序以后,程序再次返回 main 函数执行,如图标号⑤所示

当基于IAP设计的程序启动流程如下图:芯片复位后, 还是从 0X08000004 地址取出复位中断向量的地址,并跳转到复位中断服务程序,在运行完复位中断服务程序之后跳转到 IAP 的 main 函数,如下图标号①所示,在执行完 IAP 以后(即将新的 APP 代码写入预先定义的 FLASH,灰底部分。
新程序的复位中断向量起始地址为 0X08000004+N+M),跳转至新写入程序的复位向量表,取出新程序的复位中断向量的地址,并跳转执行新程序的复位中断服务程序,随后跳转至新程序的 main 函数,如下图标号②和③所示,同样 main 函数为一个死循环,并且注意到此时芯片的 FLASH,在不同位置上,共有两个中断向量表。
main 函数执行过程中,如果 CPU 得到一个中断请求, PC 指针仍强制跳转到地址0X08000004 中断向量表处,而不是新程序的中断向量表,如下图标号④所示;程序再根据我们设置的中断向量表偏移量,跳转到对应中断源新的中断服务程序中,如图标号⑤所示;在执行完中断服务程序后,程序返回 main 函数继续运行,如图标号⑥所示。这样就完成程序设计和跳转的动作。

LiteOS的OTA方案
LiteOS是利用华为云实现物联网终端的升级的工作,底层的原理与上面介绍的移植,不过因为是物联网,所以程序是通过Wi-Fi、4G、NB等无线通讯技术下载到芯片实现软件的升级,具体可以在博客检索相关关键词获取,有很多对应的解释。大致原理如下图:分为SOTA和FOTA两种技术,即固件和软件都可以分别进行升级操作,然后将程序编译好的bin文件,通过华为云IoT平台进行打包发送到物联网终端进行升级操作。

附录:
华为LiteOS官方表述升级参考链接:https://support.huaweicloud.com/usermanual-iothub/iot_01_0027.html
本文分享自华为云社区《物联网终端软件升级技术---IAP(因芯片类型较多,本文仅针对STM32的Cortex-M系列)》,原文作者:o0龙龙0o 。
IAP:物联网终端软件升级技术的更多相关文章
- EPON ONU软件升级的若干优化方案
1 说明 目前EPON ONU软件升级主要有IP方式(如SNMP/TR069)和TFTP+OAM两种.前者需占用大量IP地址,且配置ONU的IP地址需要手工操作,给业务开通和系统维护带来较大不便:后者 ...
- 【swupdate文档 三】SWUpdate: 嵌入式系统的软件升级
SWUpdate: 嵌入式系统的软件升级 概述 本项目被认为有助于从存储媒体或网络更新嵌入式系统.但是,它应该主要作为一个框架来考虑,在这个框架中可以方便地向应用程序添加更多的协议或安装程序(在SWU ...
- 以软件定义物联网芯片,以技术融合推动LPWAN2.0泛在物联
作为数字化产业重要的基础设施之一,物联网迎来了黄金发展期.物联网通信技术通过数据的采集.分析.输出,从浅层次的互联工具和产品深化,到成为重塑生产组织方式的基础设施和关键要素,正深刻地改变着传统产业形态 ...
- TODO:软件升级的那些事
TODO:软件升级的那些事 软件升级,指软件从低版本向高版本的更新.由于高版本常常修复低版本的部分BUG,所以经历了软件升级,一般都会比原版本的性能更好,得到优化的效果,用户也能有更好的体验. 最近常 ...
- JLink软件升级到4.92之后,Jlink不能用了
JLink软件升级到4.92之后,Jlink不能用了 情景描述: Jlink软件升级到4.9 ...
- MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级
MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级 国内第一款量体定制管理系统 结合富友软件10年服装行业经验和多家大型量身定制企业管理经验,推出的 ...
- NSIS:制作软件升级安装包
原文 NSIS:制作软件升级安装包 相信不是每个人写的软件都只发布一次就可以了,肯定要有修改和维护的情况发生.在这种情况下,您可能就需要一个软件的升级安装包了. 现在,我们就来一步步把这个安装包做 ...
- 某MDU产品OMCI软件升级加速方案
说明 本文基于某GPON MDU产品的当前情况,提出OMCI升级的加速方案. 因时间仓促和水平限制,文中难免存在错漏和不足之处,敬请指正. 一 问题提出 根据G.988标准相关描述,软件升级过程可分 ...
- STM32+IAP方案 实现网络升级应用固件
关注了这个概念有些日子了,这段时间总算有机会实战==网络升级应用固件,这里记录下遇到的问题,及解决方案. 原理与网上流传的串口作为传输手段 一致:不同之处,无非我这里使用了网络设备传输.==(lwip ...
- C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载
<C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...
随机推荐
- [ABC205F] Grid and Tokens 题解
Grid and Tokens 题目大意 给定 \(n\) 个点和一个 \(H\times W\) 的网格,每个点可以放置在 \((A_i,B_i)\) 到 \((C_i,D_i)\) 的矩形中或不放 ...
- command_execution
前置知识 可以通过ping的TTL来判断系统的版本 判断了是Linux之后就使用Linux的连接命令来进行操作 这里直接全局搜索flag相关的文件 linux全局查询文件_linux全局查找某个文件- ...
- 手撕Vue-Router-知识储备
前言 本文是手写Vue-Router的第一篇,主要是对Vue-Router的知识储备,为后面的手写做准备. 那么 VueRouter 怎么实现呢?要想实现 VueRouter,首先要知道 VueRou ...
- 手把手教Electron+vue,打包vue项目,打包成桌面程序。
1.现如今前端框架数不胜数,尤其是angular.vue吸引一大批前端开发者,在这个高新技术快速崛起的时代,自然少不了各种框架的结合使用.接下来是介绍electron+vue的结合使用. 2.Elec ...
- Java 21中的两个值得关注的Bug修复
在Java 21中,除了推出很多新特性之外,一些Bug修复,也需要注意一下.因为这些改变可能在升级的时候,造成影响. Double.toString()和Float.toString()的精度问题修复 ...
- 【scikit-learn基础】--『数据加载』之真实数据集
上一篇介绍了scikit-learn中的几个玩具数据集,本篇介绍scikit-learn提供的一些真实的数据集.玩具数据集:scikit-learn 基础(01)--『数据加载』之玩具数据集 1. 获 ...
- springboot的缓存和redis缓存,入门级别教程
一.springboot(如果没有配置)默认使用的是jvm缓存 1.Spring框架支持向应用程序透明地添加缓存.抽象的核心是将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明地应 ...
- [GDOIpj222A] 点指兵兵
第一题 点指兵兵 提交文件: bing.cpp 输入文件: bing.in 输出文件: bing.out 时间空间限制: 1 秒, 256 MB 你一定有过在两个物品之间犹豫不决的时候,想要借助一些方 ...
- 文心一言 VS 讯飞星火 VS chatgpt (155)-- 算法导论12.3 2题
二.用go语言,假设通过反复向一棵树中插人互不相同的关键字来构造一棵二叉搜索树.证明:在这棵树中查找关键字所检查过的结点数目等于先前插入这个关键字所检查的结点数目加 1. 文心一言: 为了证明这个结论 ...
- zookeeper JavaApi 修改节点
*修改数据 * 1.修改数据 * 2.根据版本修改 * * * */ @Test public void testSet() throws Exception{ Stat stat = new Sta ...