HTTP模式下STM32程序远程升级设计

针对嵌入式终端设备架设分散、数量庞大以及应用程序更新迭代速度快带来的程序升级困难局面,运用STM32微控制器的在应用中编程(IAP)原理,设计了通过以太网远程升级程序的方案。

HTTP协议和LwIP协议的使用,不仅让整个方案具备高安全性、可靠性。易用性,还有效降低了硬件资源的消耗。该方案稳定、可靠、操作简单,可以广泛应用于网络环境下的IAP升级,具有较高的推广价值。

引言

目前STM32设备程序升级的通用解决方案是使用在应用中编程(IAP)原理进行设计,通过串口、USB、4G无线模块等通信方式将待升级程序文件传输至设备端,然后直接写入用户程序存储区来实现。

在实际使用场景中,串口、USB的方式不支持远程操作,而4G无线模块通信稳定性较差,硬件成本较高。

针对上述问题,本文以某信号处理项目健康管理单元模块为背景,开展使用以太网通信方式实现程序远程升级方法的研究,使用轻量化的通信协议以减少对内存资源的占用,并提供精简、安全的网页操作界面供用户使用。

LwIP协议

LwIP是一个小型开源的TCP/IP协议栈,有无操作系统的支持都可以运行,其实现的重点是在保持TCP协议主要功能的基础上最大程序地减少对设备内存的占用,以便在硬件资源紧张的嵌入式系统中使用。
其源代码全部使用C语言实现,开发人员可以方便地实现跨处理器、跨操作系统的移植。

数据流向

基于LwIP内核自身的内存管理策略和网络数据包管理策略,网卡数据传入LwIP内核的流程大致如下:当网口接收到网络数据产生一个中断后就会释放一个信号量,通知网卡接收数据区处理这些收到的数据,再将这些数据封装成消息投递到tcpip_mbox邮箱中,LwIP内核线程得到这个消息后就对其进行解析,根据消息中数据包的类型进行处理,同时调用ethernet_input函数决定是否递交到IP层。
如果是ARP包,内核就不会递交给IP层,仅仅只更新ARP缓存表;如果是IP数据包,则递交给IP层去处理。
在这里插入图片描述
这样的数据流向使内核处理数据包的效率得到较大提升,且各层之间保持相对独立,某一层并不需要指定下一层如何实现,仅需知道该层通过层间接口所提供的服务即可。用户程序与内核是完全独立的,通过操作系统进程间通信机制进行数据交互。

HTTP服务器

HTTP是用于从万维网服务器传输超文本到本地浏览器的传输协议,它是基于TCP/IP通信的,使用“客服端-服务器”模型运作,是一个应用层协议,可以用来传输服务器的各种资源,如文本、图片、音频等,本设计用它来传输应用程序的二进制文件。

资源管理

统一资源标识符(URI)是一个通用的概念,由2个子集组成,分别是统一资源定位符(URL)和统一资源名称(URN)。
URL是互联网上用来标识某一处资源的绝对地址,即通过资源的位置来标识资源,使用它就能找到资源。
其通用格式如下:😕/:@:/ ;?#
在这里插入图片描述
URL不一定包含所有的组件内容,常用的URL组件如表1所示。
本方案中升级网页的地址http://192.168.0.12就是一个最简单的URL,地址中的数字同时也是设备的IP地址,改变IP地址即可切换到局域网内不同终端设备的升级网页,有效提升程序升级效率。

HTTP报文

HTTP报文是在http应用程序之间发送的数据块,它包裹着请求数据交换的信息。
HTTP报文分请求报文和响应报文,其结构基本相同,分为:

  1. 起始行,它描述请求或响应的基本信息
  2. 头部,它使用关键词-数值的形式详细地说明报文
  3. 实体,即实际传输的数据,可以使纯文本,图片,视频等二进制数据。

一个完整的HTTP报文如图所示,需要特别注意的是,头部和实体之间有一个空行。
在这里插入图片描述

请求行
请求报文的起始行称为请求行,它简要描述了客户端想要如何操作服务器的资源。
请求行的构成:

  1. 请求方法:GET/POST,表示对资源的操作。
  2. 请求目标,通常是一个URI,标记了请求方法要操作的资源。
  3. 版本,表示报文使用的HTTP协议版本。
    在这里插入图片描述

状态行
响应报文的起始行又称为状态行,主要用来标识服务器响应的状态。
状态行的构成:
4. 版本,表示报文使用的HTTP协议版本。
5. 状态码,一个3位数,用代码的形式表示处理结果,比如200是成功,500是服务器错误。
6. 原因,作为数字状态码补充,是更详细的解释文字,帮助人理解原因。

在这里插入图片描述

总体架构

系统主要由远程电脑主机、嵌入式终端设备组成,2者通过网线接入到同一局域网。
当终端设备需要进行程序升级时,在电脑主机端通过网页登录HTTP服务器,输入用户名和密码进入到程序升级网页,然后选择目标程序文件并点击升级按钮,即可对设备程序进行升级。

在嵌入式设备端,系统引导程序加载完毕后,首先检查是否需要对设备程序进行升级,若检查到标志位,则通过以太网接口接收目标程序文件,校验成功后烧写到用户应用程序分区中,接着复位系统,便可运行升级后的用户应用程序;若为检测到标志位,则直接运行用户原来的应用程序。

在这里插入图片描述
相比采用串口、USB、无线模块等实现的在线升级功能,本方案对于设备维护人员来说,无需进行复杂的接线操作,免去上位机繁琐的安装及设置过程,只要电脑主机和设备端位于同一局域网即可。

LwIP支持的通信协议较为完整,支持多种编程接口,开源免费,其流畅运行只需要40kB的存储空间和几十kB的运行内存,消耗的硬件资源较少。

升级代码由跳转检测代码和用户程序烧写代码2部分组成,当检测代码识别到升级标志位后,系统则等待网络中传来的程序文件。程序文件传送完毕且校验无误后,随机跳转到用户程序区烧写代码,完成终端设备的程序升级工作。

跳转代码

为了区别IAP模式与正常运行的用户程序,系统在初始化完外围器件后需要读取一个状态标志位来确定是否进行用户程序升级。
使用内部存储区的某个特定区域来存放升级标志位,当程序读取到该标志位后便进入IAP模式,否则直接运行用户应用程序。

当跳转程序检查栈顶地址合法后便设置用户代码区第二个字位程序开始地址,接着初始化应用程序堆栈指针,最后跳转到应用程序,等待接收升级文件。

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

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

相关文章

0基础学习VR全景平台篇,第51篇:高级功能-自定义菜单

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,高级功能-自定义菜单! 功能位置示意 一、本功能将用在哪里? 自定义菜单,是显示在VR漫游作品底部和顶部各种可点击的图标按钮。…

Nginx(7)Nginx实现服务器端集群搭建

Nginx集群搭建 Nginx与Tomcat部署Nginx实现动静分离Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedKeepalived配置文件keepalived之vrrp_script Nginx制作下载站点Nginx的用户认证模块 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解,我们…

如何通过用户场景分析挖掘需求痛点?4大角度

在我们日常需求分析过程中,往往忽视对用户场景的深入分析和挖掘,造成伪需求和需求缺失等问题。 而真正的用户需求,只有在对应的应用场景下才会真正呈现出来。因此我们需要重视对用户场景分析,深入挖掘用户需求痛点。而在对用户场景…

解决 An attempt was made to call a method that does not exist. 问题详解

哈喽大家好,我是阿Q。今天在开发代码的过程中,由于手抖,不知道引入了什么包依赖,导致项目启动一直报错,特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 有想赚点外块|技术交流…

windows环境下安装zookeeper

安装 下载地址:Apache Downloads 注意:zookeeper的安装路径不要有中文,建议也不要有空格 文件路径如下: 生成并修改zoo.cfg文件 复制zookeeper的conf目录下的zoo_simple.cfg文件,并重命名为zoo.cfg 修改zoo.cfg文件…

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙 下一代防火墙 (NGFW)、虚拟化 NGFW 和云原生防火墙 请访问原文链接:https://sysin.org/blog/fortios-7/,查看最新版。原创作品,转载请保留出处。 作者主页&…

【K8S系列】深入解析K8S存储

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一…

Debian 12 静态IP / 固定IP的设置

环境:Debian 12 amd64-lxde 局域网:PT925E电信光猫 手机APP 网络管家 一般用动态IP就可以了,但如果软件环境比较小众,问题就随之而来。起始问题:路由器无法解析设备名和IP,网络管家也不让设置固定IP&…

REDIS缓存穿透 击穿 雪崩

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者…

vscode高亮插件——highlight-words(高亮代码、高亮变量、突出显示)

文章目录 官方教程高亮文字使用方法配置 演示变量高亮(Highlight Toggle Current)选择高亮(Highlight Selection with Options)删除高亮(Highlight Remove)侧边栏(Highlight Toggle Sidebar&…

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者:小 琛 欢迎转载,请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子:实现一个json文件管理窗口 需求场景 因工作需要,开发一个文件管理窗口,要让使用者可…

Buildroot 取消默认QT桌面-迅为RK3588开发板

本小节将讲解如何取消掉默认的 qt 桌面。 首先对开发板进行上电,开发板正常启动后,使用命令“cd /etc/init.d”进入到/etc/init.d 目录 下,然后使用以下命令对开机自启动脚本 rcS 进行查看,如下图所示: vi rcS 从上…