引言(Opening)

想象一下,你开发的一款智能水杯、一个环境监测设备或者一台共享充电宝,已经部署到了成千上万的用户手中。突然,你发现了一个软件bug,或者需要增加一个酷炫的新功能。你不可能派人跑到每个设备面前用USB线给它烧录程序。这时,OTA(空中升级)技术给你一把 钥匙。


第一部分:核心概念解析——Bootloader, IAP, OTA

在深入流程之前,我们必须先理清这三个容易混淆的概念。

  1. Bootloader(引导加载程序)

    • 是什么:这是一段存储在微控制器(MCU)启动地址(通常是Flash起始地址)的小程序。它是设备上电后运行的第一段代码,就像是设备的“BIOS”。

    • 职责:它的核心工作是决定程序的流向。通常是:初始化基本硬件(时钟、内存) -> 检查是否有升级请求 -> 如果有,则留在Bootloader等待升级;如果没有,则跳转到用户应用程序(Application, APP)执行。

  2. IAP(在应用编程)

    • 是什么:一种允许应用程序在运行过程中对自身Flash存储器进行重新编程的技术。

    • 如何工作:MCU的内部Flash通常被划分为多个区(Bootloader区、APP区、备份区、数据区等)。IAP利用MCU自带Flash控制器(Flash Controller)的擦除/编程函数,将接收到的新固件数据写入到指定的Flash区域。

    • 关键点:IAP是实现OTA的技术手段

  3. OTA(空中升级)

    • 是什么:一个更大的概念,指通过无线网络(如Wi-Fi, 4G/5G, Bluetooth)进行远程升级的整个系统和服务端架构

    • 组成部分

      • 设备端:包含支持IAP的Bootloader和应用程序。

      • 服务器端:存储新固件包(firmware.bin)、提供下载接口、管理设备版本。

      • 通信协议:设备与服务器之间的交互规则(如HTTP, MQTT, CoAP)。

    • 关系OTA = 通信能力 + IAP能力。我们本文重点讨论的是OTA中的设备端IAP部分。


第二部分:OTA升级流程详细分解

下图清晰地展示了一次完整的OTA升级流程:

现在,我们来逐一拆解图中的每一个关键步骤。

步骤一:接收升级指令与跳转Bootloader
  1. 触发时机:设备正常运行在APP中,通过无线模块(如ESP8266、NB-IoT模组)与服务器保持通信。

  2. 指令下达:服务器通过某种通信协议(如MQTT主题 device/001/update)向设备发送升级指令。指令中通常包含新固件的版本号、大小、哈希值以及下载地址。

  3. 预处理:APP收到指令后,需要做两件至关重要的事:

    • 校验自身状态:是否在充电?电量是否充足?是否处于空闲状态?防止升级中途断电变“砖”。

    • 设置“升级标志”:这是一个非常关键的动作。在MCU的Flash(通常是一个专有的“数据区”)或备份寄存器(Backup Register)中,写入一个特定的值(如0xA5A5A5A5)。这个区域需要保证在芯片复位后数据依然保持。

  4. 执行跳转:不是直接擦写Flash,而是软件复位(Soft Reset) 单片机。复位后,PC指针回到起始地址,Bootloader开始运行。

步骤二:Bootloader的判断与升级启动
  1. Bootloader初始化:上电/复位后,Bootloader最先运行,进行最基本的硬件初始化(时钟、中断向量表)。

  2. 检查“升级标志”:Bootloader会去预定义的地址读取“升级标志”的值。

    • 如果标志有效:说明本次复位是由升级请求触发的,Bootloader将停留在原地,不会跳转到APP。并开始执行接下来的升级任务。

    • 如果标志无效或不存在:Bootloader会延时一小段时间(如100ms),等待是否有来自串口等调试接口的升级命令(用于本地调试)。如果没有,则直接跳转到APP的起始地址,正常启动应用程序。

步骤三:Bootloader开始升级与接收数据
  1. 建立连接:Bootloader通过设备的网络模块,按照APP之前收到的下载地址(地址信息也需要存储在Flash的某个地方)主动连接服务器(例如发起HTTP GET请求)。

  2. 接收数据:服务器将固件文件(bin文件)发送给设备。由于嵌入式设备内存(RAM)有限,无法一次性接收整个固件,必须采用分段接收、分段写入的方式。

    • 数据包格式:为了可靠传输,通常需要自定义简单的协议帧。例如:

      [包头][包序号][数据长度][数据内容][校验和]。
    • 流程控制:每收到一包数据,Bootloader需要回复一个ACK确认包,服务器再发送下一包。如果超时未收到,则请求重发该包。

步骤四:分段写入Flash与校验

这是IAP的核心操作,非常考验代码的健壮性。

  1. Flash布局:必须事先规划好。例如:

    • 0x0800 0000 - 0x0800 7FFF: Bootloader区(32KB)

    • 0x0800 8000 - 0x0807 FFFF: APP区(480KB)

    • 0x0808 0000 - 0x0808 1FFF: 数据区(8KB,存放升级标志、版本号等)

  2. 擦除APP区:在开始写入新固件之前,必须先完整擦除旧的APP区。Flash的特性是只能由1写0,但需要擦除(全部变为1)才能再次写入。擦除操作通常以扇区(Sector)或页(Page)为单位进行。

  3. 分段写入

    • 开辟一个RAM缓冲区(如1-4KB)。

    • 当接收到一包或多包数据填满缓冲区后,调用MCU的Flash编程函数,将缓冲区数据写入APP区的指定地址。

    • 更新写入地址指针。

  4. 校验

    • 局部校验:对每一包数据进行校验和(Checksum)或CRC校验,确保数据在传输过程中没有出错。

    • 全局校验:当接收完所有数据包后,对整个APP区的固件进行一次完整的校验,通常计算其SHA-256哈希值,并与服务器提供的哈希值进行比对。这是防止固件错误、确保升级完整性的最后一道保险。

步骤五:收尾工作与版本确认
  1. 清除升级标志:全局校验通过后,立即将之前设置的“升级标志”清除(如写入0xFFFFFFFF),表示升级成功完成。这一步很重要,防止下次复位后又陷入升级循环。

  2. 存储新版本号:将服务器下发的版本号信息存储到Flash的特定位置。

  3. 复位设备:执行软件复位,让整个系统重新启动。

步骤六:启动新APP与OTA结束
  1. Bootloader再次启动:本次复位后,Bootloader检查“升级标志”,发现已被清除。

  2. 跳转新APP:Bootloader顺利跳转到新的APP起始地址,新程序开始运行。

  3. 上报新版本:APP启动后,可以读取Flash中存储的版本号,并主动上报给服务器,告知升级成功。至此,一次完整的OTA升级结束。


第三部分:关键技术与注意事项

  • 中断向量表重映射:Bootloader和APP有各自的中断向量表。跳转后,必须将中断向量表地址切换到APP的向量表起始地址,否则中断无法正确响应。

  • 通信协议稳定性:尤其是在Bootloader中实现网络通信,需要考虑断线重连、包序管理、超时重传等机制,设计一个简单的应用层协议非常必要。

  • 变砖与恢复

    • 原因:升级过程中断电、固件校验失败、跳转地址错误等。

    • 对策

      • 双备份(A/B系统):保留两个APP区,一个运行,一个备用升级。新固件写入备用区,校验成功后再切换引导地址。

      • Bootloader自救:在Bootloader中预留一个通过串口升级的“后门”,即使APP区损坏,也能通过有线方式重新烧录。

  • 安全性

    • 固件加密:防止传输过程中被窃取。

    • 数字签名:验证固件来源的合法性,防止恶意固件被写入设备。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96182.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96182.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96182.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Ansible】实施 Ansible Playbook知识点

1.清单概念与静态清单文件是什么?答:Ansible 清单是被管理主机的列表,用于明确Ansible的管理范围,分为静态清单和动态清单。静态清单是通过手动编辑的文本文件来定义被管主机,文件格式可以是INI格式或YAML格式。在INI格…

【Linux】vim工具篇

目录一、vim的多模式1.1 命令模式1.1.1 光标移动1.1.2 复制及撤销1.1.3 剪切及删除1.1.4 替换1.1.5 批量化注释/去注释1.2 底行模式二、vim的配置个人主页<—请点击 Linux专栏<—请点击 一、vim的多模式 vim是一款功能强大的文本编辑器&#xff0c;它编辑代码主要围绕命…

Spark 核心原理:RDD, DataFrame, DataSet 的深度解析

Apache Spark 是一个强大的分布式计算系统&#xff0c;以其内存计算、速度快、易用性强等特点&#xff0c;在大数据处理领域占据重要地位。理解 Spark 的核心原理&#xff0c;特别是其三种核心抽象——RDD, DataFrame, DataSet——对于高效地使用 Spark 至关重要。本文将深入解…

Docker 命令行的使用

1.Docker 命令列表[roothost1 ~]# docker Usage: docker [OPTIONS] COMMANDA self-sufficient runtime for containersCommon Commands:run Create and run a new container from an imageexec Execute a command in a running containerps List cont…

Redis Stream:轻量级消息队列深度解析

&#x1f4e8; Redis Stream&#xff1a;轻量级消息队列深度解析 文章目录&#x1f4e8; Redis Stream&#xff1a;轻量级消息队列深度解析&#x1f9e0; 一、Stream 数据结构解析&#x1f4a1; Stream 核心概念&#x1f4cb; Stream 底层结构⚡ 二、消息生产与消费&#x1f68…

Android studio的adb和终端的adb互相抢占端口

在Android Studio调试时&#xff0c;有时候也需要借助终端的adb命令&#xff0c;他们互相抢占端 口&#xff0c;导致调试麻烦解决如下&#xff1a;① 终端adb的版本是&#xff1a;1.0.39路径是:/usr/lib/android-sdk/platform-tools/adb② Android Studio使用的adb来源于Androi…

GEO服务商推荐:移山科技以划时代高精尖技术引领AI搜索优化新纪元

引言&#xff1a;AI搜索生态重塑与GEO优化战略地位跃升AI技术对信息检索范式的颠覆GEO优化在企业增长中的核心作用第一章&#xff1a;AI搜索新纪元的企业营销挑战与机遇生成式AI成为用户主要信息入口的行业趋势企业在AI搜索中的“答案主权”争夺战GEO优化服务商的核心能力模型&…

Android SystemServer 系列专题【AttentionManagerService】

AttentionManagerService是framework中用来实现屏幕感知的一个系统级服务&#xff0c;他继承于systemserver。我们可以通过dumpsys attention来获取他的一些信息。如下针对屏幕感知的功能的引入来针对这个服务进行一个介绍。1、屏幕感知Settings UI实现屏幕感知的功能在A14上面…

nginx 反向代理使用变量的坑

nginx采用反向代理的时候使用变量的坑 正常情况&#xff1a; location ~ ^/prod-api(?<rest>/.*)?$ {# 假设 $mes_backend 形如: http://127.0.0.1:16889proxy_pass $mes_backend$rest$is_args$args;proxy_http_version 1.1;proxy_set_header Host $host;…

Origin绘制径向条形图|科研论文图表教程

数据排列格式截图&#xff0c;请查看每张图↘右下角水印 目录 数据排列格式截图&#xff0c;请查看每张图↘右下角水印 本 期 导 读 No.1 理解图形 1 定义 2 特点 3 适用场景 No.2 画图教程 1 导入数据&#xff0c;绘制图形 2 设置绘图细节 本 期 导 读 径…

MySQL InnoDB 的 MVCC 机制

前言 多版本并发控制&#xff08;MVCC&#xff09;是 MySQL InnoDB 存储引擎实现高性能事务的核心机制。它通过创建数据快照&#xff0c;使得读写操作可以无锁并发&#xff0c;极大地提升了数据库的并发性能。本文将深入探讨 MVCC 的工作原理、实现细节以及它与事务隔离级别的紧…

景区负氧离子气象站:引领绿色旅游,畅吸清新每一刻

在绿色旅游成为消费主流的今天&#xff0c;游客对 “清新空气” 的需求不再是模糊的期待&#xff0c;而是可感知、可选择的具体体验。景区负氧离子气象站的出现&#xff0c;正以科技之力重塑绿色旅游格局&#xff0c;让 “畅吸清新每一刻” 从口号变为触手可及的现实&#xff0…

Pytorch笔记一之 cpu模型保存、加载与推理

Pytorch笔记一之 cpu模型保存、加载与推理 1.保存模型 首先&#xff0c;在加载模型之前&#xff0c;我们需要了解如何保存模型。PyTorch 提供了两种保存模型的方法&#xff1a;保存整个模型和仅保存模型的状态字典&#xff08;state dict&#xff09;。推荐使用第二种方式&…

当AI在代码车间组装模块:初级开发者的创意反成「核心算法」

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录当AI在…

技术视界 | 跨域机器人通信与智能系统:打破壁垒的开源探索

8 月 16 日&#xff0c;在 OpenLoong 社区举办的第九期线下分享会上&#xff0c;国家地方共建人形机器人创新中心的软件开发负责人 Amadeus 博士带来了一场主题为“跨域机器人通信与智能系统&#xff1a;打破行业壁垒的创新方案”的演讲。深入探讨了当前机器人领域的一个关键痛…

Android入门到实战(八):从发现页到详情页——跳转、传值与RecyclerView多类型布局

一. 引言在上一篇文章里&#xff0c;我们从零开始实现了 App 的 发现页面&#xff0c;通过网络请求获取数据&#xff0c;并使用 RecyclerView 展示了剧集列表。但光有发现页还不够&#xff0c;用户在点击一部剧时&#xff0c;自然希望进入到一个更详细的页面&#xff0c;去查看…

【工具】41K star!网页一键变桌面应用

项目中遇到了一个需要将现有的 web 页面打包成一个 桌面应用 的需求。 最一开始想到的是 Electron&#xff0c;但是它还需要一些开发工作并且打包后的应用体积比较大&#xff0c;调研后发现了开源工具 Pake。 它能让你用最轻量的方式&#xff0c;把任何网页一键打包成跨平台桌…

浪潮CD1000-移动云电脑-RK3528芯片-2+32G-安卓9-2种开启ADB ROOT刷机教程方法

浪潮CD1000-移动云电脑-RK3528芯片-232G-安卓9-2种开启ADB ROOT刷机教程方法 往期文章&#xff1a; 浪潮CD1000-移动云电脑-RK3528芯片-232G-安卓9-开启ADB ROOT破解教程 地址1&#xff1a;浪潮CD1000-移动云电脑-RK3528芯片-232G-开启ADB ROOT破解教程-CSDN博客 中国移动浪潮…

Day23_【机器学习—聚类算法—K-Means聚类 及评估指标SSE、SC、CH】

一、聚类算法概念属于无监督学习算法&#xff0c;即有特征无标签&#xff0c;根据样本之间的相似性&#xff0c;将样本划分到不同的类别中。所谓相似性可以理解为欧氏距离、曼哈顿距离、切比雪夫距离... 。分类按颗粒度分为&#xff1a;粗聚类、细聚类。按实现方法分为&#xf…

android seekbar显示刻度

SeekBar简介 SeekBar是Android中的一个可交互UI组件&#xff0c;允许用户通过拖动滑块在特定范围内选择数值。继承自ProgressBar&#xff0c;但增加了用户手动调节功能&#xff0c;常用于音量控制、亮度调节等场景。 核心属性 android:maxHeight // 背景高度 android:progres…