一种新的程序在线升级的实现(学习)

news2024/12/23 9:13:40

介绍一种新的程序在线升级方法,以及程序在线升级在嵌入式系统中的应用和实现。设计将从系统原理和实现介绍该程序在线升级方法。利用串口作为通讯方式,自定义通讯协议。

上位机将升级文件传给下位机,下位机将数据解析后存储在内部Flash中。解析成功后下位机通过Bootloader重新装置程序实现程序升级。

随着电子技术、计算机技术和通信技术的迅猛发展,嵌入式系统已经广泛应用于工业、军事、通信、消费电子等领域,但是面对新技术的不断涌现和对系统功能、性能以及规模要求的不断提高,开发者必须能够针对客户的需求和软件中存在的Bugs及时对软件进行升级或维护,以延迟设备使用周期,改善设备性能,增强设备适应性。

传统的嵌入式软件升级通常由维护人员到达设备工作现场,并拆卸设备烧写FLASH。当设备数目庞大且分布范围广时,传统的软件升级方法则显得束手无策。设计出了一种使用在线升级程序实现高效的数据下载方法。

系统原理

在这里插入图片描述
系统由上位机软件、串口和MCU终端组成。
上位机软件与MCU终端通过串口进行通信。

与传统的程序升级不同,本设计介绍的程序在线升级方法是嵌入在应用程序中,**在程序运行的过程中可以实现程序在线升级,并且当程序在线升级失败时还可以对程序进行恢复。**而传统的程序在线升级是在BOOTLOADER代码中实现程序升级。

程序升级结构

其中电平转化芯片是TTL转232。上位机软件通过电平转化芯片与MCU连接,用户需要进行程序升级时,先通过上位机软件对要升级的二进制代码文件进行解析,检测该升级代码是否符合MCU的二进制代码。然后读取MCU标志区中的升级标志位,若标志为真,则支持程序升级,否则不支持升级。然后上位机软件将升级代码的二进制解析后下载到MCU临时区中。

利用串口进行程序升级节省了很多外部资源,在数据传输的过程中只需要一个电平转芯片就可以实现,因为PC的串口信号电平与MCU的串口信号电平不匹配,所以需要TTL转232转化芯片实现。

MCU升级工作流程

由于程序在线升级代码是嵌入在应用程序中,所以支持升级程序的代码文件应包含程序升级功能的代码。

通信采用主从方式进行传送和接收,上位机软件作为主机发送命令,MCU作为从机队命令进行响应和回复。

在串口驱动层接收到数据后,将接收到的数据传递给协议层,协议层队数据进行解析后将数据放入缓冲区,待应用层队数据进行各种处理。

应用层将接收到的数据进行处理,并对各种命令按照一定的要求进行回复,应用层将要发送的数据传递给协议层,经协议层进行协议的处理后,协议层将处理后的数据传递给驱动层,并由驱动层队数据进行发送。

上位机软件工作流程

在通信的过程中,上位机作为主机进行命令发送并对命令的回复进行解析。数据的任何传输源自于一个读取或写入文件的连接请求。

将来自于应用层的数据传递给协议层,协议层对数据进行协议上的处理,并传递给物理层发送数据。

由于串口通信无法保证数据传输的可靠性,所以应用中在应用层添加了超时、重传机制来保证数据传输的可靠性。在每一帧数据中又采用CRC校验来保证数据没有出错。

在程序升级之前,上位机软件会对升级文件进行检查,以防误程序升级文件有误。程序升级文件传输完成后,下位机会对接收到的升级文件进行CRC校验,并传输至上位机,上位机通过该校验码判断程序升级文件中是否又数据出错。在上位机软件运行的过程中,上位机软件会打印与程序有关的信息来监控程序升级。

软件实现

因为升级的代码文件是通过串口下载到MCU的内部FLASH中的,所以串口的工作显得尤为重要。
为节省CPU的资源,串口程序的接收和发送都采用中断的方式进行。这样能够保证CPU能够及时的接收串口数据。
当有中断产生时,CPU根据ISQ的中断入口地址跳转到对应的中断服务程序。
当有数据来到后,物理层将接收到的数据存储到缓冲区中。

FLASH擦除
可以通过分页机制来实现对寻址空间的扩展和FLASH页面的使用和管理。所以FLASH的擦除操作可以进行整体擦除,也可以擦除某一地址开始的一个扇区,即擦除FLASH不能擦除某一字节或一次擦除小于512字节。

  1. 设置时钟分频,设置块号和页号
  2. 定位要擦除的扇区
  3. 写扇区擦除命令
  4. 等待命令执行完成

FLASH编程

  1. 设置时钟分频,设置块号和页号
  2. 向指定的地址写若干字数据
  3. 等待上一条命令执行完成
  4. 如果未写完数据,则递增源地址和目标地址,重复2和3步骤

看门狗程序

  1. 上位机将代码文件传输至MCU后,设置相应升级标志,表明升级程序已经成功下载至下位机。
  2. 为了让MCU运行升级后的程序,则需要让MCU重新启动,此时设置的方法是禁止看门狗模块,当看门狗运行时间到,没有清除看门狗标志,则MCU会重新启动运行升级程序。

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

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

相关文章

用矩阵处理3D变换

Rotation 也可以把三个旋转矩阵合并为一个综合旋转矩阵: 平移和旋转结合 有时我们想要将平移和旋转结合起来,这样我们就可以在一次操作中同时进行两者,但是我们不能用3x3矩阵来做3D平移,只能用4x4矩阵来做,如下所定义&#xff1a…

尚硅谷Docker实战教程-笔记07【Docker常规安装简介】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【理念简介、官网介绍、平台入门图解、平台架构图解】尚硅谷Docker实战教程-笔…

嵌入式基础知识-总线带宽

带宽,最容易想到的是上网用的网络带宽,在嵌入式软件开发中,也会用到带宽,这个带宽的含义就不一样了,区别是什么?本篇就来介绍一下,并通过一些例子来进行带宽的计算。 先来简单看下不同领域的带…

交叉熵和softmax

交叉熵cross-entropy loss 最大化似然函数,最小化负的似然对数函数 最终的交叉熵损失函数,最小化该loss: nn.BCELoss def criterion(yhat, y):out -1 * torch.mean(y*torch.log(yhat) (1-y) * torch.log(1-yhat))return outsoftmax

51单片机一氧化碳烟雾报警器mq2MQ7ADC0832采集

实践制作DIY- GC0152--- 一氧化碳烟雾报警器 基于51单片机设计------- 一氧化碳烟雾报警器 二、功能介绍: STC89C52单片机lcd1602adc0832mq2烟雾传感器mq7烟雾传感器蜂鸣器2个按键设定烟雾报警阈值 2个按键设定一氧化碳报警阈值 1.通过ADC0832采集MQ2烟雾输出的电…

嵌入式系统中STM32时钟系统详解

1. STM32的时钟源主要有: 内部时钟 外部时钟 锁相环倍频输出时钟 1.1 详细介绍 HSI(内部高速时钟) 它是RC振荡器,频率可以达到8MHZ,可作为系统时钟和PLL锁相环的输入 HSE(外部高速时钟) 接入晶振范围是4-16MHZ&a…

数据结构--线性表(顺序表、单链表、双链表、循环链表、静态链表)

前言 学习所记录,如果能对你有帮助,那就泰裤辣。 目录 1.线性表概念 定义 基本操作 2.顺序表 定义 顺序表的实现--静态分配 动态分配 顺序表的特点 顺序表的插入和删除 顺序表的查找 按位查找 按值查找 3.单链表 定义 单链表的初始化 不带…

112.(cesium篇)cesium地球自转+文字上下滚动

地图之家总目录(订阅之前必须详细了解该博客) 地图之家:cesium+leaflet+echart+地图数据+地图工具等相关内容的介绍 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 112.(cesium篇)cesium地球自转+文字上下滚动 下面献上完整代码…

Kubernetes(k8s)集群搭建,完整无坑,不需要科学上网~

文章目录 写在前面一、准备三个centos7虚拟机1、创建Vagrantfile2、启动三台虚拟机3、配置centos7支持ssh登录(所有机器)4、修改 linux 的 yum 源(所有机器)5、更新并安装依赖(所有机器)6、安装docker&…

SPI硬件实现-GD32

SPI硬件实现-GD32 #include "w25qxx_spi.h"void w25qxx_init(void){// 使能外设时钟w25qxx_rcu_init();// IO口进行配置,使之复用为SPI0, PA4\PA5\PA6\PA7,NSS\SCK\MISO\MOSIw25qxx_io_init();// SPI0初始化w25qxx_spi_init();spi_enable(SPI0); }// 使能外设时钟…

HTTP/HTTPS 简介||HTTP 消息结构

HTTP/HTTPS 简介 HTTP 协议是 Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网( WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。 HTTP 是一个基于 TCP/IP 通信协议来传递数据&a…

〖动态规划60题〗泰波纳契数列模型

文章目录 1.第N个泰波那契数(简单)解题流程1. 状态表示2. 状态转移方程3. 初始化dp表4. 填表顺序5. 返回值 代码编写 2.三步问题解题流程1. 状态表示2. 状态转移方程3. 初始化dp表4. 填表顺序5. 返回值 代码编写 3.使用最小花费爬楼梯解题流程1. 状态表示…

Redis高可用——主从复制

redis的主从复制 一、Redis 主从复制1.主从复制的作用:2.主从复制流程: 二、搭建Redis 主从复制1.安装 Redis①.环境准备②.修改内核参数③.安装redis④.创建redis工作目录⑤.环境变量⑥.定义systemd服务管理脚本 2.修改 Redis 配置文件(Mast…

阅读源码技巧

目录 搭建 Demo方法论之关注调用栈方法论之死盯日志方法论之查看被调用的地方探索答案作业是的,正如标题描述的这样,我试图通过这篇文章,教会你如何阅读源码。 事情大概是这样的,前段时间,我收到了一个读者发来的类似于这样的示例代码: 他说他知道这三个案例的回滚情况是…

详解TCP

目录 1.TCP概论 1.1.什么是TCP 1.2.TCP连接的建立过程 1.3.TCP的传输过程 1.4.TCP连接的释放过程 2.JAVA中的TCP 3.TCP带来的一些性能问题 1.TCP概论 1.1.什么是TCP 为了保证所有设备能相互通信,从而建立了一张互联互通的计算机网络,在这张大网…

使用java.lang.Record类删除样板代码

样板是一个源自钢铁制造业的术语,其中形成模具以铸造类似的物体。在编程世界中,样板代码是代码的一部分,项目里面使用的地方很多,但是通常创建完成之后就很少或者就不会更改了。在Java中,不可变的数据载体类用于与数据…

SpringBoot第13讲:SpringBoot接口如何参数校验国际化

SpringBoot第13讲:SpringBoot接口 - 如何参数校验国际化 本文是SpringBoot第13讲,上文我们学习了如何对SpringBoot接口进行参数校验,但是如果需要有国际化的信息(比如返回校验结果有中英文),应该如何优雅处…

【C++】vector介绍及使用

🚀 作者简介:一名在后端领域学习,并渴望能够学有所成的追梦人。 🚁 个人主页:不 良 🔥 系列专栏:🛸C 🛹Linux 📕 学习格言:博观而约取&#xff0…

【智能座舱系列| 域控制器】——座舱域控制器

传统多芯片架构 原来的座舱里面的控制器基本上是分开的,导航主机是一家,液晶仪表是一家,同时还有一个AVM全景一家,还有TBOX等,这里线束连接就非常复杂,而且不同供应商直接的协调调试也非常复杂。 上图是IMX6 的多芯片方案,液晶仪表、中控导航、后排娱乐都使用了IMX6最小…

axure可视化大屏模板200例 •axure模板 大屏可视化 •axure数据可视化原型 •axure可视化组件 •axure

可视化axure原型可视化大屏模板200例,带动画效果,可直接复用 axure可视化大屏模板200例 axure可视化大屏模板200例数据可视化原型可视化组件下载—无极低码 axure模板 大屏可视化axure数据可视化原型axure可视化组件axure原型演示axure绘制界面原型图…