干货 | 嵌入式OTA升级实现原理

我曾经一个经理,被老板骂到狗血淋头的场景,还历历在目。

原因是,产品大批量出货了,发现了一个偶发性的BUG。

这意味着,所有卖出去的产品,都得退回来,重新烧录程序。

估计当时经理在想,如果这个产品支持OTA升级就好了。

OTA升级是一种无线远程固件升级技术,作用就是为了修改程序的bug,或者升级程序功能,像手机系统更新,还有就是我们现在很多车,也支持OTA固件升级。

以前我们做单片机开发时,压力特别大,产品一定要在大批量上市前,进行系统测试,保证出去以后不能有问题。

毕竟不能像电脑或者手机上的软件那样,功能有BUG,直接远程升级就好了。

以前单片机类的产品,大多数都不支持OTA升级,程序出现问题,就得让客户退回来改。

后面随着物联网技术的发展,让传统硬件能够接入互联网,OTA升级才开始流行。

我第一次接触OTA升级,感觉很高大上,很复杂的样子,如果你去网上看理论知识,确实如此。

但是如果你有一个项目去实际应用一下,并没想象这么复杂。

下面以我们无际项目特训营的项目6来举例,如何一步步实现OTA升级?

OTA升级,说简单点,就是对我们单片机Flash里面的程序进行更新,就和我们用烧录工具去更新程序一样,只是烧录方式,变成了我们先把程序(Bin文件)先上传到服务器,然后由服务器给每个设备下发程序更新指令和数据。

一、固件升级的2种方式

1.方式1

这个方式将单片机的FLash分成了3块,分别是BootLoader、程序块A、程序块B。

BootLoader是引导程序,假设FLASH-A是应用程序(程序块A),FLASH-B是备份程序区(程序块B)。

单片机上电后,先进入启动程序bootLoader,然后根据bootLoader程序逻辑,再跳转到程序块A或者B。

程序块A和程序块B都是有效的程序,但同一时间,只能运行其中的一个,另外一块作为备份块。

假如当前程序运行的是A部分的代码,那我们固件升级的时候,就升级程序块B部分的代码,如果程序B升级OK,则由bootLoader程序,指向程序块B区的起始位置,下次程序重启,则执行程序块B。

这种方式,需要单片机Flash的容量空间足够大,应用的程序代码不能超过Flash容量的50%,因为要存储3个程序。

2.方式2

这种方式Flash空间由2部分组成,分别是BootLoader和FlASH(程序区),但需要外挂Flash芯片,用来保存新下载的程序。

有固件升级的时候,先把升级的固件下载保存到外挂的Flash中。

下载的程序验证OK后,由BootLoader将外部Flash中的固件更新到程序区,更新完跳转执行。

二、服务器和MCU的通讯机制

固件升级的服务器和单片机的通讯机制很重要,如果通讯机制设计的不够合理,会影响通讯的稳定性,我们之前也踩过很多坑。

通讯机制这块的设计,我大概分为通讯流程协议设计两部分,两者是相辅相成的,协议设计越好,通讯流程就越简单。

早期,我对接过一些第三方云平台,有些平台,我怀疑是干java设计的通讯流程和协议,在协议设计上经验不足,如果通讯流程和协议设计不好,明明可以用一条指令搞定,最后要2,3条指令,增加通讯双方的程序难度,稳定性也会受影响。

1.通讯流程:

首先,把要更新的固件上传到我们云平台,版本号要比原来的高。

另外固件一般是bin格式文件。

如何生产bin 文件?

要生产bin 文件,需要在Keil按照下图配置:

fromelf.exe --bin -o "$L@L.bin" "#L"

下图是我们项目6硬件端获取固件的流程图。

单片机定时查询服务器的固件状态,看是否有新的固件需要更新。

有新的固件,需要先获取固件的版本,判断是否比主机当前的版本号高,如果是,则更新固件。

同时,还会获取最新固件的大小(字节的个数),数据包的个数,固件的校验值等。

主机按照数据包的ID,向服务器获取固件,每获取一包数据就立即校验数据,校验通过,再获取下一包的数据。

所有固件都下载完成后,需要对下载固件进行整体校验,校验通过,则说明下载的固件有效。

重启设备,程序自动跳转到启动程序,更新程序区部分的固件,固件升级成功。

大致通讯流程设计好以后,我们还要设计一个通讯协议:

三、单片机程序设计

我们单片机这边,要写两个程序,一个是bootLoader程序,一个是产品应用程序(APP...)。

1.bootLoader程序

设备每次上电前,会先执行BootLoader程序,该程序会判断产品应用程序,是否需要更新,更新完后,重新跳转到新的产品应用程序执行,下面是跳转代码。

2.产品应用程序

主要是产品的功能。

四、全量升级和差分升级。

全量升级就是每次都更新整个固件,差分升级就是更新时,会和老版本固件进行数据比对,修改的部分,才会升级。

很明显,差分升级效率会高很多,特别适合那种固件大的,比如汽车上的固件,手机上的固件,但是实现起来也相对复杂一些。

文章篇幅有限,视频都要讲10几节课。

OTA升级,如果光看理论,会感觉比较复杂,其实跟着做一个项目,会发现很多理论都是纸老虎。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

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

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

相关文章

fork后如何同步最新的代码

1.查看自己的库并添加远程源库 #查看所有远程库的url git remote -v; #添加源项目url(upstream是自己定义的一个名字,可以删 git remote remove upstream) git remote add upstream 这里替换为源项目url; #查看所有远程库的url&…

哪个牌子的电容笔好用?618五款爆款电容笔评测,不踩雷!

随着信息技术不断发展,iPad慢慢成为了现代年轻人工作、娱乐和学业的必备智能工具之一。然而,市场上涌现出众多品牌的电容笔,也存在着大量低质量的电容笔产品。这些产品往往无法达到预期的书写和绘画效果,反而可能导致用户体验不佳…

AI适老化!10秒一张的AI姓氏头像,居然要卖9块9?中老年用户都说好!

看短视频的你,一定会刷到过这样的直播间: 现在大家明白了,这是一个做姓氏图像的直播间。我刚开始刷到的时候也觉得这种头像好看,高大上,也想做一个这样的图像,来当自己的微信头像。 做这样的图像需要排队刷…

电脑提示msvcr100.dll丢失?五种msvcr100.dll丢失的解决方法

在使用电脑的过程中,我们可能会遇到各种各样的问题。其中,msvcr100.dll丢失是一个常见的问题。这个DLL文件是Microsoft Visual C 2015 Redistributable的一部分,它提供了许多重要的功能,包括一些运行时间库。当此DLL文件丢失时&am…

Android Kernel源码下载方法

Android Kernel的源码是git管理的,和之前下载的Android源码管理方式不一样,所以下载方式也不一样,直接用git下载就可以了;去网上搜的下载方式五花八门,有很多问题,因为服务器经常无法访问,也一直…

拼多多商品详情API返回值全解析

关键数据指标 成长层级:根据店铺近30天交易额、店铺领航员,综合评估得出店铺所处的成长层级 店铺综合体验星级:以领航员综合分为数据基础,同时结合店铺活跃度、行业特色服务(特色服务要求根据行业特色调整),形成的店铺…

武王伐纣时杀死一位商朝大将,八百年后其子孙复仇推翻周朝

大约在公元前1046年,周武王率领大军征讨商朝,并在牧野之战中击溃商军,纣王兵败后自焚而死,至此商朝灭亡,史称“武王伐纣”。周武王进入朝歌城后,对商朝的旧臣进行了相关处理,有人“升职”了&…

河南大学大礼堂火灾事故引发安防监控对智能分析技术应用的思考

一、方案背景 2024年5月2日,在修缮施工期间的河南大学河南留学欧美预备学校旧址大礼堂发生火情。现场航拍画面显示,大礼堂经过火灾,房顶已经基本坍塌,被火烧过的建筑呈焦黑状。 公开资料显示,大礼堂属河南留学欧美预…

SM618卡件SM480模块和利时

SM618卡件❗电:183-6998-1851❗SM480模块和利时。自动化程度的提高,I/O点数大幅增 加,传统单一配线的方式已经无法满足发展的需 要SM618卡件SM480模块和利时。.对简单、可靠的配线方式的需求日益强烈. 传统接线 - 以并联方式连 接…

N9048B PXE EMI 测试接收机,1 Hz 至 44 GHz

​ _EMI_ N9048B EMI 测试接收机 1 Hz 至 44 GHz Keysight N9048B PXE 是一款符合标准的 EMI 测试接收机,配有射频预选器和 LNA 设计。其实时扫描(RTS)功能有助于您缩短总体测试时间,轻松执行无间隙的信号捕获和分析。 特点 …

pyqt 分组框控件QGroupBox

pyqt 分组框控件QGroupBox 分组框控件QGroupBox介绍效果代码 分组框控件QGroupBox介绍 QGroupBox提供了一个框架,用于将其他控件(如按钮、滑块、标签等)组合在一起。 QGroupBox 通常包含一个标题栏和一个内容区域。标题栏显示文本标签&#…

财务世界中数据叙事对于企业决策的影响力

数据叙事是财务规划与分析中一项能够改变企业管理规则、体现数据差异化的技能。它使得财务专业人士能够在企业高层的决策桌上获得一席之地。财务团队可以利用这项出色且无与伦比的技能将数据转化为可操作的业务建议。在当今这个数字化时代,任何值得分享的见解都可以…

ctfshow web78 获取flag(用老版的火狐浏览器)

题&#xff1a; 第一种&#xff1a;利用input伪协议 ,获取到flag ?filephp://input POST data <?php system(tac ls) ?> 第二种&#xff1a;利用flter协议,获取到flag https://21d9e58a-c0fd-47ea-a9c4-d875100f2fdb.challenge.ctf.show/?filephp://filter/readcon…

Leetcode—1652. 拆炸弹【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—1652. 拆炸弹 实现代码 class Solution { public:vector<int> decrypt(vector<int>& code, int k) {int codeSize code.size();vector<int> ans(codeSize, 0);if(k 0) {return ans;}if(k > 0)…

323_C++_QT_QProcess执行cmd解压、压缩、删除tar.gz等等其他压缩包文件到指定目录,不需要外部库,QT自带API的就行

// decompressPath : 解压到此目录 // fileName : 解压的tar.gz文件名executeCommand(decompressPath , QString::fromStdString(fileName));// 开始解压 void executeCommand

完美质量的追求:6Sigma咨询的实践指南

在竞争激烈的商业环境中&#xff0c;6Sigma这一术语正在逐渐崭露头角&#xff0c;成为众多企业追求卓越质量的重要工具。6Sigma不仅仅是一个数字或标准&#xff0c;它代表着一种对完美质量的追求与承诺&#xff0c;是企业在市场中立足的基石。 面对产品质量的不稳定与客户需求…

linux部署java服务流程案例

linux部署java服务流程案例 一 检查java环境启动jar包命令 一 检查java环境 java启动jar包命令 java -jar zdbs_hd_33333.jar

AI图书推荐:AI在语言学习教育领域的应用和挑战

这本书《AI在语言学习教育领域的应用和挑战》&#xff08;AI in Language Teaching, Learning, and Assessment&#xff09;由Fang Pan编辑&#xff0c;出版于IGI Global&#xff0c;主要探讨了人工智能&#xff08;AI&#xff09;在语言教育领域的应用、挑战以及潜在的益处。 …

偏微分方程算法之椭圆型方程差分格式编程示例

目录 一、示例1-五点菱形格式 1.1 C代码 1.2 计算结果 二、示例2-九点紧差分格式 2.1 C代码 2.2 计算结果 三、示例3-二阶混合边值 3.1 C代码 3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍&#xff0c;并给出相应格式的理论推导过程。为加深对…

243 基于matlab的模糊C均值算法(FCM)及其改进算法将空间邻域项引入FCM的目标函数(FCM_S)

基于matlab的模糊C均值算法&#xff08;FCM&#xff09;及其改进算法将空间邻域项引入FCM的目标函数(FCM_S),广义的模糊C均值(GFCM)算法&#xff0c;基于核的改进的模糊c均值聚类算法&#xff08;KFCM&#xff09;,基于核的广义模糊c均值聚类算法KGFCM的图像分割方法。程序已调…