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

server/2024/9/24 19:43:31/

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

原因是,产品大批量出货了,发现了一个偶发性的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.ppmy.cn/server/35394.html

相关文章

R语言Rstudio突然无法启动?如何解决

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

语音识别--加载音频

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

git merge 命令合并指定分支到当前分支

git merge 是一个用于合并两个分支的 Git 命令。当你在不同的分支上工作时&#xff0c;可能会有一些不同的更改。使用 git merge 可以将这些更改合并到一起。以下是一些常见的 git merge 用法示例&#xff1a; 1. 合并当前分支与另一个分支的更改 git merge <branch-name&…

从论文中看AI绘画

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 主要看是看Diffusion Models,CLIP,ControlNet,IP-Adapter这种经典论文,尝试总结论文写作的一些方式以及图像生成模型的一些内在思想. 对于其中的数学原理和代码不过深究. DDPM 使用扩散模型得到高质量图像,证明了这…

矩池云jupyter运行opengait代码 未完成版

文章目录 前言——矩池云的使用技巧1.切换源 一、下载数据集二、下载模型三、环境配置1.查看python、torch、torchvision版本2.查看一些包版本是否过高3.下载包 四、开始训练1.设置环境变量2.遇到的问题&#xff08;1&#xff09;torch.cuda.is_available()返回false&#xff0…

贪吃蛇项目(小白保姆级教程)

游戏介绍 游戏背景&#xff1a; 贪吃蛇游戏是经典的游戏项目之一&#xff0c;也是很简单的小游戏 实现背景&#xff1a; 这里我们是基于32位的Win32_API进行实现的 需要的知识点&#xff1a; C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32_API等 适合人群&a…

等保测评考试培训题

等保2.0培训考试题目 一、网络安全法第几条&#xff0c;规定国家实行网络安全等级保护制度。 A、第五条 B、第十条 C、第十三条 D、第二十一条 二、等级保护有几个安全保护级别&#xff1f; A、3个 B、4个 C、5个 D、6个 三、什么样的系统可以作为定级对象&#…

秋招后端开发面试题 - JVM垃圾回收器

目录 JVM垃圾回收器前言面试题常见的垃圾回收器有哪些&#xff1f;CMS 收集器&#xff1f;G1 收集器有了 CMS&#xff0c;为什么还要引入 G1&#xff1f;垃圾收集器应该如何选择&#xff1f; JVM垃圾回收器 前言 已经找到工作了&#xff0c;分享秋招时的笔记。祝大家都能顺利…