嵌入式系统BootLoader设计分析

时间:2022-10-20 09:46:58

导语:嵌入式系统BootLoader设计分析一文来源于网友上传,不代表本站观点,若需要原创文章可咨询客服老师,欢迎参考。

摘要:IAP技术为嵌入式产品的程序烧写提供了一种很好的实现方式,适合各种复杂的应用工况。针对IAP,本文提出了一种基于Ethernet的嵌入式系统bootloader设计方案,重点阐述了方案中涉及到的几个关键技术点,例如中断向量表重定位、LwIP协议栈应用等。

关键词:IAP;BootLoader;中断向量表;LwIP

随着信息化、智能化、网络化的发展,嵌入式系统技术已经深入到我们生产、生活中,应用广泛。在嵌入式产品开发及应用中,程序烧写技术是必备技术之一,在有些应用场合中甚至至关重要。目前,嵌入式微控制器(MCU)程序烧写方式主要有以下三种:①ICP:通过仿真器连接MCU调试端口对MCU进行程序烧写;②ISP:通过MCU厂商预置的BootLoader程序引导烧写;③IAP:针对MCU对外通信接口(例如UART、Eth-ernet等),用户自行设计代码实现BootLoader功能,对正在应用的MCU进行程序烧写。无论是ICP还是ISP技术,都需要一些涉及嵌入式产品内部的机械性操作,若产品的电路已经被外壳封装,要利用ICP或ISP对产品进行程序更新势必极为不便,某些特定应用场合甚至无法实现。但若应用IAP技术,通过预留的外部通信端口可方便实现程序更新,甚至可以实现远程或无线更新,极大降低了维护成本。针对IAP技术,本文提出了一种基于Ethernet的嵌入式系统BootLoader设计方案。

1IAP原理

IAP是MCU通过运行用户自己编写的引导程序完成对用户FLASH指定区域的程序烧写,可实现嵌入式产品后通过预留的通信接口对固件进行升级。IAP功能涉及两段用户编写的代码:第一段为引导程序(即BootLoader),实现对用户APP程序的更新;第二段为用户APP程序,即产品真正的功能代码。这两段代码同时烧写在用户FLASH中,当MCU上电复位后,首先执行BootLoader代码,一般执行步骤如下:①检查是否需要对用户APP进行更新;②若不需要更新,则直接执行步骤④;③若需要更新,则执行更新操作;④跳转至用户APP并复位执行。

2关键技术点

现以IAP技术在STM32Fxxx系列[1]MCU应用为例,重点阐述基于Ethernet的嵌入式系统BootLoader设计过程中的几个关键技术点。

2.1MCU配置

现以CortexM3/M4内核的MCU(用户FLASH分配参考第2.1.1节)为例,讲一讲IAP技术中的中断向量表重定位,通过配置向量表偏移量寄存器VTOR来实现。正常地,MCU启动模式会选择从用户FLASH处启动(由BOOT0/BOOT1引脚实现配置),用户FLASH空间会被重映射到0x00000000处,VTOR的具体配置过程如下(见图2):①上电复位后,MCU默认从0x00000000地址处取程序中断向量表(复位向量),此时MCU取到的是Boot-Loader程序中断向量表并开始执行复位中断程序,其中将VTOR寄存器设置为0x08000000(默认值),即中断向量表被重定位于0x08000000处;②程序更新操作执行完成后,BootLoader程序从0x08010000处(用户APP程序起始地址)取中断向量表(复位向量),这里不建议修改复位中断程序中VTOR默认值,可在跳转到用户APP程序主函数后立即修改VTOR值为0x08010000。

2.2以太网实现

在本方案中,以太网通信是关键技术之一,而LwIP协议栈是以太网通信设计的最大难点,本文重点讲述一下LwIP的应用经验。2.2.1LwIP是什么LwIP[2-3]是一个轻量化的TCP/IP,是瑞典计算机科学院的AdamDunkels开发的一个小型开源TCP/IP协议栈。LwIP的设计初衷就是用少量的资源消耗实现一个完整的TCP/IP协议栈,非常适合嵌入式产品的以太网应用。2.2.2LwIP的应用LwIP是一种数据通信机制,本质上就是对数据进行处理。了解LwIP协议栈数据管理机制以及如何实现与外部的数据交互,是嵌入式开发者掌握LwIP应用的最合适切入点。(1)LwIP内存管理及数据缓冲众所周知,网络数据量是非常大的,而作为一个针对嵌入式应用的TCP/IP协议栈,LwIP的内存管理策略及数据缓冲机制显得非常重要。在LwIP中,内存分配策略有动态内存堆(HEAP)分配及动态内存池(POOL)分配,两种分配策略混合使用,提高了内存使用效率。至于如何合理使用上述两种分配策略,具体就涉及到LwIP数据包的缓冲机制。LwIP采用统一的数据结构体pbuf来描述数据包,协议栈各层之间的数据共享避免了数据包在传输过程中的层层复制以提高数据处理效率(TCP/IP分层模型:应用层、传输层、网络层、网络接口层,LwIP未遵循严格的TCP/IP分层机制)。针对种类繁多的以太网数据包,LwIP提供了4种类型的pbuf:①PBUF_RAM类型:通过内存堆分配得到,协议栈中应用的最多,要发送的数据和应用程序要传送的数据一般采用此类型。②PBUF_POOL类型:通过内存池分配得到,由于分配时间短,网卡接收数据时,LwIP一般使用这种类型的pbuf存储接收到的数据。③PBUF_ROM类型:通过内存池分配得到,分配的空间不含数据区域,数据存放于非协议栈内存的ROM空间。此类型的pbuf用于应用程序要发送的数据放置在应用程序管理的ROM区域,可降低协议栈内存空间的消耗。④PBUF_REF类型:通过内存池分配得到,与PBUF_ROM类型的pbuf类似,区别为数据存放于非协议栈内存的RAM空间。特别说明,对于一个数据包,它可能使用任意类型的pbuf进行描述,也可能使用多种不同的pbuf一起描述。(2)网卡协议栈网络数据是在网卡(即网络接口)进入协议栈网络接口层,反之亦然。网络接口层提供的不是具体协议,而是一种网络接口规范。在LwIP中,采用数据结构体netif来描述网络接口,结构体中定义了网卡IP地址、网络接口输入/输出函数声明、MAC地址、网卡名称等。由于netif是LwIP抽象出来的网络接口,用户还须自己提供网卡底层接口函数,ethernetif.c文件即为LwIP提供的底层接口驱动模板,用户编写网卡驱动时参照模板修改即可。当有数据需要交互时,LwIP调用网卡底层接口函数即可。(3)协议栈应用程序一般地,网络数据经协议栈层层处理之后,在传输层或者应用层将数据交给应用程序,区别在于,传输层给出的是二进制数据流,应用层将传输层给出的二进制数据转换成特定数据格式;反之亦然。本方案选择采用传输层协议UDP实现BootLoader功能,程序结构简单、数据传输高效。同时,针对LwIP协议栈提供的RAWAPI、NetconnAPI、SocketAPI三种编程接口,本方案也选择执行效率高的RAWAPI编程接口实现以太网UDP通信,以下是相关的应用经验。首先,RAWAPI是内核回调型API,如果LwIP收到了一个数据包,会立即调用一个注册在LwIP内核中的数据处理函数进行数据处理,这个函数称为回调函数。回调函数中有你想要的业务逻辑,可以自由处理接收到的数据,也可以发送任何数据。在本方案中,回调函数根据自定义的应用协议解析来自上位机的用户APP程序二进制代码,然后将其直接写入指定的FLASH区域。其次,利用RAWAPI提供的功能函数建立UDP连接及数据交互,主要功能函数包括udp_new、udp_bind、udp_recv、udp_connect、udp_send等。这里需着重提一下其中的3个函数:①udp_new用于创建UDP控制块udppcb,记录本地/远程端口号、本地/远程IP地址、回调函数等UDP通信相关信息;②udp_bind用于绑定本地IP和端口号,即为UDP连接绑定特定网络接口和应用/进程;③udp_connect用于绑定远程IP和端口号,以建立UDP通信的一对一连接,这样可以提高UDP通信的稳定性和效率。如果确实存在多个客户端,也可以在服务器端创建多个UDP控制块udppcb以实现与多个客户端间的通信。

3软件流程图

在本方案中,软件设计的核心是以太网数据包的收发:①首先,软件升级包帧头的接收包含升级包包长、版本号、更新时间等信息,解析之后向上位机发出应答帧。②之后,升级包的接收与处理,升级包按500字节进行分包,单包的前面增加2个字节存放包序号。判断升级包序号是否正确,若正确,则直接将数据帧内容依次写入用户FLASH指定区域(如果系统RAM空间足够大,可以先将升级数据缓存一下,确保FLASH内原有程序遭到破坏);反之,则申请重发。③最后,升级包长校验,若正确反馈升级成功,则等待复位命令,反之则申请重新操作。BootLoader软件流程图如图3和图4所示。

4IAP升级测试

本方案中,BootLoader设计需求源于基于以太网构建的工业控制局域网中的嵌入式控制产品固件升级,将安装有配套开发的固件升级上位机的计算机连接产品自身预留的以太网口或者局域网交换机公共端口,通过上位机操作即可实现嵌入式产品固件升级。经实验室/现场测试,本方案设计的BootLoader功能正常,符合产品设计需求,固件升级上位机界面如图5所示。

5结语

本文是IAP技术的一个简单应用,完成了基于以太网的嵌入式系统BootLoader设计,可实现局域网内的嵌入式产品固件升级,而真正能体现以太网+IAP技术给嵌入式产品带来巨大便捷的应用为远程在线升级或无线升级,这些技术对嵌入式系统固件更新或者现场维护具有一定的实用价值。

参考文献

[1]孟博宇.STM32自学笔记[M].北京:北京航空航天大学出版社,2011:134.

[2]刘火良,杨森.LwIP应用开发实战指南:基于STM32[M].北京:机械工业出版社,2019.

[3]AdamDunkels.DesignandImplementationoftheLwIPTCP/IPStack[J].SwedishInstitudeofComputerScience,2001,20(2).

作者:黄钰强 岳伟 单位:中车株洲电力机车有限公司