【日志记录】——主MCU 通过私有协议更新从MCU程序固件

一:需求分析

        在一些系统较为复杂的嵌入式设备中,往往不止一片MCU或者处理模块,通常为一片主MCU负责应用逻辑处理和对外网络通信,其他从MCU负责实时采集处理高频数据,在设备运营过程中,往往伴随新需求或者bug的出现,这时往往需要对设备进行升级维护,此时远程升级显得至关重要,工程人员无需亲赴现场,通过平台推送实现OTG升级,此时主MCU由于对外有网络通信,可以自定义升级协议直接对程序进行升级,然而作为外设MCU往往是只能和主MCU通信,无法直接对外通信升级,所以本文主要讲的是设备从MCU如何通过主MCU实现远程升级。

二:设备附属MCU如何通过主MCU 实现远程程序更新

       【 实现思路】:网页上传MCU执行文件(bin文件)给到服务器——>

                          设备主MCU上电向服务器查询是否有最新程序推送——>

                          如果有新程序推送主MCU 拷贝到自己指定的flash区域——>

                          主MCU通过私有协议升级从MCU——>

                         从MCU通过启动引导程序实现程序更新

三:主从升级私有协议原理

1.【基本过程】

主MCU将程序分成多包传给从MCU,一个周期传一包,周期时间为30ms,每秒传33包,每包250个字节,速度为8.25k/s,例如:程序包大小为19k,大概3秒完成,

2.传输第一步,确认开始传输,这个过程是主MCU 发起的,主MCU 接收到完整的从MCU 升级程序后,开始向从MCU 发送程序更新请求,从MCU接收到程序更新请求后关闭所有处理任务,向主MCU发送回复,确认开始程序更新。

3.传输第二部,程序升级包信息传输,主MCU 根据升级程序计算好传输总包数和程序校验结果,一并联通程序大小全部发送给从MCU,从MCU程序更新后通过这些信息校验程序升级是否出错,从MCU接收到后向主MCU确认回复。

4.传输第三部,程序升级包传输,程序升级包包括两部分主要内容,第一个是当前传输的包序列号,这个序列号同样起传输错误校验作用,当传输出现错误或者出现丢包现象,从MCU会发送错误断点续传,另一个就是程序内容,如果从MCU 有足够大RAM,通常不会把接收到的程序直接写进flash里面,而是保存在RAM中等待传输结束后校验成功一次写入flash 等待重启实现程序更新,避免程序传输出错后反复擦除flash影响寿命。

5.传输第四步,主MCU 程序传输完成后,发送等待确认程序更新完成,从MCU 接收到该条指令后会接收到的程序大小,总包数,程序校验进行核对,核对无误后从MCU向主MCU 确认升级完成,主从MCU复位程序升级标志位;如果校验核对出错,从MCU发起重传请求,重复一遍上面的传输过程。

6.第五步,从MCU程序接收完成后,主动重启,boot将程序引导到最新程序地址处,到此,从MCU程序固件更新完成。

四:程序实现方式

        主从升级程序实现思路大概有两种,一种是同步协议方式,另一种是异步协议方式

下面来分析一下两种实现方式的区别与优缺点:

同步协议方式:主从通信发送与请求始终遵循一应一答,程序升级包在发送过程中需要对每包数据进行应答一次,由于两片MCU 在处理接收数据时都不是完全实时性的,这就会造成两片MCU之间出现相互等待的现象,有可能出现任务阻塞的现象,对效率有一定影响,当然也有其优点在程序稳定性方面稍微略胜一筹。

异步协议方式:主MCU在程序传输过程中,从MCU不需要对每包程序进行应答,而是默默校验每包程序,当传输校验出错时或者出现丢包现象,包序号不连续,从MCU 会发出出错申请,告诉主MCU 当前传输位置,并继续传输,这种方式一定程序上降低了耦合性,减少了程序阻塞,提高了程序效率,但是实际在应用过程中,错误纠正处理机制往往相比同步协议方式更为复杂,另外还需要对两片MCU数据传输和处理速度做好匹配,毕竟是异步方式,当速度没有匹配在合适范围,就会出现通信错位的情况,虽然有纠错机制,但是最好不要有明显错位现象。

纯文本内容可能比较枯燥,如果对你有帮助欢迎点赞收藏。

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

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

相关文章

动态内容推荐系统PHP代码

这个系统旨在根据用户行为和偏好,动态地向用户推荐内容。这样的系统可以应用于新闻网站、社交媒体平台、电子商务网站等多种场景,以提升用户体验和参与度。 ### 功能概述 系统将基于用户的浏览历史、点击行为和时间花费等数据来评估用户的兴趣点&#…

BUUCTF-Real-[ThinkPHP]2-Rce1

任意代码执行漏洞 ThinkPHP 2.x版本中,使用preg_replace的/e模式匹配路由: $res preg_replace((\w).$depr.([^.$depr.\/])e, $var[\\\1\]"\\2";, implode($depr,$paths)); 导致用户的输入参数被插入双引号中执行,造成任意代码执行…

Open CASCADE学习|拓扑变换

目录 平移变换 旋转变换 组合变换 通用变换 平移变换 TopoDS_Shape out;gp_Trsf theTransformation;gp_Vec theVectorOfTranslation(0., 0.125 / 2, 0.);theTransformation.SetTranslation(theVectorOfTranslation);BRepBuilderAPI_Transform myBRepTransformation(out, th…

go 中的范型

泛型是随着Go 1.18版本发布的。它基本上意味着参数化的类型,也就是说,它允许程序员在写代码时,类型可以稍后指定,因为类型在当时并不相关。换句话说,在编写一些代码时,你不提供数值的类型。这些类型的值会在…

Leetcode刷题笔记题解(C++):36. 有效的数独

思路一:暴力破解,两个二维数组记录行、列对应的数字出现的次数,比如rows[i][index]表示的数字index在i行出现的次数,三维数组记录每个块中对应数字出现的次数,比如boxes[i/3][j/3][index]表示的数字index在[i/3][j/3]个…

校园墙表白墙系统uniapp微信小程序

配置文件 (自动编号、配置参数名称、配置参数值); 前端开发:vue 语言:javapythonnodejsphp均支持 运行软件:idea/eclipse/vscode/pycharm/wamp均支持 框架支持:Ssm/django/flask/thinkphp/springboot/springcloud均支持 数据库 mysql 数据库工具&#x…

定时器 Timer(超详细模拟实现)

目录 一、定时器 1.定时器概述 2.Java标准库提供的定时器类 3.定时器代码样例 二、实现 1.实现思路 2.代码实现 2.1纯享版 2.2注释版 3.代码解析(超详细) 3.1描述类MyTimerTask ①构造:MyTimerTask(Runnable runnable, long delay&#xff…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器, 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件,当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

vue3 封装WebSocket(直接复制)

创建文件WebSocket.js 只有基本的功能 import { ref } from vue; import store from "/store";export default function useWebSocket(url) {const messagesData ref([]);// 创建WebSocket连接和相关方法const socket new WebSocket(url);socket.onopen () >…

《计算机网络简易速速上手小册》第6章:网络性能优化(2024 最新版)

文章目录 6.1 带宽管理与 QoS - 让你的网络不再拥堵6.1.1 基础知识6.1.2 重点案例:提高远程办公的视频会议质量实现步骤环境准备Python 脚本示例注意事项 6.1.3 拓展案例1:智能家居系统的网络优化实现思路Python 脚本示例 6.1.4 拓展案例2:提…

计算机网络_1.5 计算机网络的性能指标

1.5 计算机网络的性能指标 一、总览二、常用的八个计算机网络性能指标1、速率(1)数据量(2)速率(3)数据量与速率中K、M、G、T的数值辨析(4)【练习1】计算发送数据块的所需时间 2、带宽…

Unity引擎学习笔记之【角色动画器操作】

角色动画Character Animation 一、使用方法 1. 添加一个静态的角色模型,并确保这个角色模型绑定了Avatar 2. 创建一个动画器控制器 Animator Controller 3. 将动画器控制器拖动添加到Player的Animator控制器上 4. 双击即可打开控制器 5. 将带有动画的预设&#xf…

docker下nacos(1.2.0)的持久化

一、创建数据库 运行以下代码自动创建数据库和表 CREATE DATABASE IF NOT EXISTS nacos_config /*!40100 DEFAULT CHARACTER SET utf8 */; USE nacos_config;SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for config_…

[Python] 如何在控制台进行输入输出

可莉今天带你来学习Python基础中在控制台的输入输出~ 接下来跟着可莉来学习吧~ 可莉将这篇博客收录在了:《Python》 可莉推荐的博主主页:Keven ’ s blog 目录 通过控制台输出 格式化输出 通过控制台输入 总结 通过控制台输出 我们通过print函数可以…

[VulnHub靶机渗透] WestWild 1.1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

leetcode正则表达式匹配问题(困难)

1.题目描述 2.解题思路,这道题自己没做出来,看了官方的题解,感觉对自己来说确实是比较难想的。使用了动态规划的解决方案,这种方案看题解都不一定能看明白,不过有个评论画图讲解的非常明白。其实仔细看题解的话&#…

从一个小故事讲解观察者模式~

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 什么是观察者模式? 观察者模式在我们的日常生活中极其常见。 先来看看观察者模式的定义: 观察者模式定义了对象之间…

面试八股文(3)

文章目录 1.HashSet如何检查重复2.comparable和Comparator区别3.ConcurrentHashMap和Hashtable区别4.线程和进程5.并发与并行的区别6.为什么使用多线程7.使用多线程可能带来问题8.线程的生命周期和状态9.什么是上下文切换10.线程死锁11.产生死锁四个条件12.如何避免死锁 1.Hash…

使用API有效率地管理Dynadot域名,使用API进将其他平台的域名转移至dynadot

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

C++设计模式-里氏替换原则

里氏替换原则定义了继承规范。(封装、继承、多态) 定义1:类型S对象o1,类型T对象o2,o1换成o2时程序意图不变,那么S是T的子类。 定义2:使用子类不破坏父类的意图。 注意:如果子类不…