当前位置: 首页 > news >正文

【日志记录】——主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.lryc.cn/news/293389.html

相关文章:

  • 【0253】深入分析Query Execution(一)
  • 编译opencv4.6问题汇总,第三方软件包见我发的资源
  • Matplotlib炫酷气泡图:代码实战与参数解析【第55篇—python:Matplotlib炫酷气泡图】
  • Android学习之路(29) Gradle初探
  • python-自动化篇-运维-语音识别
  • ElasticSearch-ElasticSearch实战-仿京东商城搜索(高亮)
  • 解释 Python 中的描述符(Descriptor)是什么?如何在 Python 中实现一个简单的 ORM(对象关系映射)?
  • IP数据云识别真实IP与虚假流量案例
  • signalR+websocket:实现消息实时通讯——技能提升
  • 机器学习入门-----sklearn
  • 双非本科准备秋招(15.3)—— 力扣二叉树
  • 20240203在WIN10下使用GTX1080配置stable-diffusion-webui.git不支持float16精度出错的处理
  • 京东微前端框架MicroApp简介
  • SpringBoot 使用定时任务(SpringTask)
  • 国标GB/T 28181详解:设备视音频文件检索消息流程
  • openssl自签名CA根证书、服务端和客户端证书生成并模拟单向/双向证书验证
  • NIO Selector简介
  • 2023-12蓝桥杯STEMA考试 C++ 中高级试卷解析
  • 设计模式——2_1 命令(Command)
  • HP数组面试题
  • 机器学习5-线性回归之损失函数
  • vulhub中Adminer ElasticSearch 和 ClickHouse 错误页面SSRF漏洞复现(CVE-2021-21311)
  • 浅谈Zookeeper及windows下详细安装步骤
  • vite, vue3, vue-router, vuex, ES6学习日记
  • 25考研|660/880/1000/1800全年带刷计划
  • Mybatis基础教程及使用细节
  • 10 分钟在K8s 中部署轻量级日志系统 Loki
  • 图像处理python基础
  • 基于WordPress开发微信小程序2:决定开发一个wordpress主题
  • [Python] 什么是网格搜索以及scikit-learn中GridSearch类的介绍和使用案例?