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

news/2024/10/20 0:35:26/

一:需求分析

        在一些系统较为复杂的嵌入式设备中,往往不止一片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.ppmy.cn/news/1342340.html

相关文章

ElementUI Form:InputNumber 计数器

ElementUI安装与使用指南 InputNumber 计数器 点击下载learnelementuispringboot项目源码 效果图 el-radio.vue &#xff08;InputNumber 计数器&#xff09;页面效果图 项目里el-input-number.vue代码 <script> export default {name: el_input_number,data() {re…

数据库指定某个列的某个值优先排序

有时候接到这么一个需求&#xff0c;就是指定某个商品某个品牌优先展示&#xff0c;那么数据库SQL该怎么实现呢&#xff1f; 比如商品表&#xff08;goods&#xff09;&#xff0c;有个品牌字段&#xff08;brand&#xff09;&#xff0c;公司要求优先展示【华为】品牌的商品&…

[C语言]结构体初识

结构体定义 结构体是一些值的集合,被成为成员变量,结构的每个成员可以是不同类型的变量 声明: 定义了一个结构体比如以张蓝图,不占据内存,当你创建了一个结构体变量时,才占空间. #include<stdio.h>//struct 为结构体关键字, student 自定义结构体名称 struct student …

node 版本管理器 --- Volta

前言 在我们的日常开发中经常会遇到这种情况:手上有好几个项目,每个项目的需求不同,然而不同项目必须依赖不同版的 NodeJS 运行环境。 基于这种情况,我们一般会使用 nvm 来安装和切换NodeJs。 最近发现了一个更好用的 node 版本管理器 — Volta ,相比于 nvm , Volta 更…

【nginx实战】通过nginx实现http 长连接(即keep alive)

文章目录 一. http的长连接历史1. HTTP短连接模型2. HTTP长连接模型 二. nginx作为代理时实现HTTP长连接1. nginx与client的长连接1.1. keepalive_timeout指令1.2. keepalive_requests指令* 场景分析 2. 保持和server的长连接2.1. location设置* 场景分析 2.2. upstream设置* 场…

FPGA项目(16)——基于FPGA的音乐演奏电路

1.设计要求 能在实验箱上&#xff0c;循环播放一段音乐。&#xff08;需要源码的直接看最后一节&#xff09; 2.设计原理 组成乐曲的每个音符的发音频率值及其持续的时间是乐曲能连续演奏所需要的两个基本要素&#xff0c;问题是如何来获取这两个要素所对应的数值以及通过纯硬件…

部署私有知识库项目FastGPT

FastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景。 项目文档: [快速了解 FastGpt | FastGptFastGPT 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即…

volatile的作用

volatile是用来修饰成员变量的&#xff0c;它的作用有两个&#xff1a;保证变量的修改在多线程之间的可见性、禁止指令重排。 volatile的内存可见性保证 在java内存模型中&#xff0c;变量都是保存在主内存中的&#xff0c;主内存是一块儿公共的内存区域&#xff0c;所有的线程…