针对嵌入式终端设备架设分散、数量庞大以及应用程序更新迭代速度快带来的程序升级困难局面,运用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报文分请求报文和响应报文,其结构基本相同,分为:
- 起始行,它描述请求或响应的基本信息
- 头部,它使用关键词-数值的形式详细地说明报文
- 实体,即实际传输的数据,可以使纯文本,图片,视频等二进制数据。
一个完整的HTTP报文如图所示,需要特别注意的是,头部和实体之间有一个空行。
请求行
请求报文的起始行称为请求行,它简要描述了客户端想要如何操作服务器的资源。
请求行的构成:
- 请求方法:GET/POST,表示对资源的操作。
- 请求目标,通常是一个URI,标记了请求方法要操作的资源。
- 版本,表示报文使用的HTTP协议版本。
状态行
响应报文的起始行又称为状态行,主要用来标识服务器响应的状态。
状态行的构成:
4. 版本,表示报文使用的HTTP协议版本。
5. 状态码,一个3位数,用代码的形式表示处理结果,比如200是成功,500是服务器错误。
6. 原因,作为数字状态码补充,是更详细的解释文字,帮助人理解原因。
总体架构
系统主要由远程电脑主机、嵌入式终端设备组成,2者通过网线接入到同一局域网。
当终端设备需要进行程序升级时,在电脑主机端通过网页登录HTTP服务器,输入用户名和密码进入到程序升级网页,然后选择目标程序文件并点击升级按钮,即可对设备程序进行升级。
在嵌入式设备端,系统引导程序加载完毕后,首先检查是否需要对设备程序进行升级,若检查到标志位,则通过以太网接口接收目标程序文件,校验成功后烧写到用户应用程序分区中,接着复位系统,便可运行升级后的用户应用程序;若为检测到标志位,则直接运行用户原来的应用程序。
相比采用串口、USB、无线模块等实现的在线升级功能,本方案对于设备维护人员来说,无需进行复杂的接线操作,免去上位机繁琐的安装及设置过程,只要电脑主机和设备端位于同一局域网即可。
LwIP支持的通信协议较为完整,支持多种编程接口,开源免费,其流畅运行只需要40kB的存储空间和几十kB的运行内存,消耗的硬件资源较少。
升级代码由跳转检测代码和用户程序烧写代码2部分组成,当检测代码识别到升级标志位后,系统则等待网络中传来的程序文件。程序文件传送完毕且校验无误后,随机跳转到用户程序区烧写代码,完成终端设备的程序升级工作。
跳转代码
为了区别IAP模式与正常运行的用户程序,系统在初始化完外围器件后需要读取一个状态标志位来确定是否进行用户程序升级。
使用内部存储区的某个特定区域来存放升级标志位,当程序读取到该标志位后便进入IAP模式,否则直接运行用户应用程序。
当跳转程序检查栈顶地址合法后便设置用户代码区第二个字位程序开始地址,接着初始化应用程序堆栈指针,最后跳转到应用程序,等待接收升级文件。