范亚南,高军科,韩文斌,魏亚伟
(中国航空工业集团公司洛阳电光设备研究所,河南洛阳 471009)
以太网通信具有抗干扰性、实时性和高速率等特点。面向复杂应用环境设计的TCP/IP通信协议,具有自动纠错功能,通信质量稳定,不易受外部环境干扰,已应用于生产生活中的各个领域[1-3]。但是目前嵌入式系统的TCP/IP服务器,一般只能被单个TCP客户端连接,未能充分体现TCP/IP协议的功能,不能满足多个网络节点同时连接、分布式通信架构的现代化网络通信需求[4]。
本文提出了一种以高性能微处理器Cortex-M4芯片STM32F407VET6和以太网收发器LAN8742A为核心的网络通信电路。通过FreeRTOS实现多线程任务管理与调度,并根据TCP客户端连接情况,进行网络处理线程和数据内存空间的动态管理,最大可实现4个客户端的同时连接与数据通信。基于该TCP Server的嵌入式系统,能够快速集成到网络系统中,实现分布式系统构建。
如图1所示,嵌入式TCP服务器由STM32F407VET6微处理器、以太网收发器LAN8472A、含网络变压器的RJ45连接器以及系统电源、时钟分发等电路组成,并可通过RJ45连接器连接多个TCP客户端。其中STM32F407VET6处理器内部移植了FreeRTOS嵌入式操作系统和Lwip网络协议栈,可实现多个外部TCP客户端的同时连接。当接收到客户端的数据指令后,TCP Server通过Lwip完成用户IP识别和数据缓存,并在任务处理线程中完成对用户指令的响应执行和数据回传。
图1 嵌入式TCP Server总体框图
基于FreeRTOS的多连接TCP Server采用高性能且低功耗的STM32F407VET6处理器作为主控芯片。该芯片以ARM Cortex-M4为内核,具有32位浮点运算单元(FPU)和自适应实时加速器,可以从闪存0等待状态执行,具备内存保护单元和数字信号处理DSP功能。STM32F407VET6时钟频率配置为168 MHz时,其运算能力高达210 DMIPS。除此之外,在接口方面集成了Ethernet、 USART、 FSMC、CAN等接口,能够满足各类嵌入式系统设计需求。
以太网电路由STM32内部集成的MAC(媒体接入控制层)和低功耗高速网络收发器LAN8742A(PHY物理层)、TVS二极管USBLC6以及RJ45连接器HR911105A组成。其中TVS二极管具有瞬态电压抑制作用,主要防止网线热插拔过程中的电压浪涌冲击。此外,HR911105A内部集成网络变压器,可以隔离网线上连接的不同设备间电平不一致的影响,保护PHY不因外部网络电压不同而通信异常甚至烧坏电路。
LAN8742A通过RMII接口与STM32连接。STM32为网络通信设计了直接内存访问(DMA)功能,当STM32内部MAC接收到来自PHY传递的数据包后,将其通过FIFO传递到DMA,最终由DMA将以太网数据包直接传递给总线。同理,STM32对外发送的数据,通过总线传递到DMA,进而由DMA发送到PHY芯片LAN8742A,最终通过HR911105A连接器到达客户端。
STM32F407VET6内部MAC和LAN8742A收发器均符合IEEE 802.3—2002标准的以太网协议,且支持10/100 MB/s的网速自动检测适配功能,二者之间通过RMII接口连接。图2为网络通信电路原理图,RMII接口的主要引脚定义如表1所示。
表1 RMII接口主要信号说明表
图2 LAN8742A网络收发器电路原理图
系统软件使用STM32CubeMX界面化工具(以下简称CubeMX)和MDK-ARM集成开发环境(以下简称MDK)进行程序设计。CubeMX是一种用于STM32系列MCU生成驱动配置和初始化代码的图形化工具,使用CubeMX在进行管脚、时钟、寄存器等硬件资源配置时,可自动进行管脚重映射和时钟倍频计算,并对各硬件资源生成底层驱动代码,可显著提高系统软硬件开发的工作效率。CubeMX支持一些常用的中间件,如RTOS、USB、 LwIP、 图像和文件等。此外,CubeMX还支持MDK、IAR等工具链,便于不同IDE的新建工程或中途修改工程配置。MDK开发环境包含代码编辑、编译、调试、下载等功能,支持C语言、汇编语言编程,对STM32微处理器有良好的支持。使用CubeMX选择MDK工具链配置并生成工程后,可以直接由MDK打开,其工程目录如图3所示。
图3 MDK打开CubeMX生成的代码工程目录
FreeRTOS操作系统是一个轻量级的嵌入式系统,用C语言开发,系统中的任务没有数量的限制,并且支持优先级调度算法,每个任务被赋予一定的优先级,处理器会优先执行处于就绪态的优先级最高的任务;系统还支持轮换调度算法,允许不同的任务使用相同的优先级,同一优先级的任务可以共享处理器的使用时间[5-6]。
本文使用CubeMx添加FreeRTOS系统,主要需要配置的参数包括抢占式调度器、系统主频、系统时钟、最大优先级号、堆大小等,最终会集中体现在FreeRTOSConfig.h文件中的相关宏定义。此外,FreeRTOS执行需要在SysTick_Handler中断函数中调用osSystickHandler(),其内部修改了SVC_Handler和PendSV_Handler系统中断,为实时操作系统构建运行节拍。FreeRTOS主要包括list.c (内核调度链表)、queue.c(队列)、croutine.c(共享堆栈任务)和task.c(任务)等文件。本文使用独立堆栈任务(task.c)建立多个任务线程,各任务线程之间支持抢占式调度。
LwIP的资源开销低、轻量化,是专为资源有限的嵌入式设备设计的,它以少量的资源消耗实现了较完整的TCP/IP协议栈,减少了对RAM的占用。此外LwIP既可以移植在RTOS里运行,也可无系统运行。LwIP具有内存管理策略和数据包管理策略,数据处理效率很高。通过宏编译可对LwIP代码和内核进行裁剪,从而进一步减少对资源的占用[7-8]。
LwIP保留了TCP/IP协议的主要功能,支持UDP、TCP、IPv4、 ARP等协议,并提供了3种编程接口:Raw API、Netconn API和Socket API。 本文采用Socket API进行编程,具有可读性好,利于开发维护等优点。Socket API执行效率略低于另2种接口,需要在RTOS中构建多任务执行,其工作模式如图4所示。
图4 基于RTOS多任务执行的Socket通信
本文使用CubeMX添加LwIP协议栈,其流程如图5所示。CubeMX配置时需要注意ETH引脚、MAC地址、硬件校验、DHCP关闭、RTOS使能等。关于TCP Server最大连接客户端数量的设置最终会在opt.h中的MEMP_NUM_NETBUF和MEMP_ NUM_NETCONN体现,本文设置为4。
图5 LwIP移植流程图
基于STM32的嵌入式TCP服务器在工业领域具有一定的研究基础和应用,但其目前仅实现了面向单个客户端TCP-Echo模式(点对点通信),未能充分发挥TCP通信能力,不能满足分布式网络化通信的应用需求[9-10]。
针对以上问题,本文结合工业网络化通信需求,基于FreeRTOS和Lwip,开发了一种可同时连接4个客户端的TCP Server系统软件。软件流程如图6所示,在完成网口和串口等硬件初始化后,通过osThreate创建3个任务(TCP服务、系统业务、任务监控),然后执行osKerne1Start开启任务调度,使各个任务以10 ms周期循环执行。
任务1基于socket实现TCP Server任务:创建socket;调用bind()绑定IP和Port;调用listen()监听客户端的连接请求;调用accept()建立新连接,并调用
图6 系统软件流程图和TCP Server任务流程图
sys_thread_new()为新连接的客户端动态创建子线程并为客户端开辟内存空间pvPortMalloc();动态子线程个数取决于所连接的客户端数量(最大4个),当检测到有客户端断开连接后则调用vTaskDelete()销毁线程并释放相应内存vPortFree();在子任务中通过recv()、send()接收并发送数据,解析的指令传送到任务2中由业务线程进行执行。
任务2作为业务线程,按照客户端指令循环执行嵌入式系统功能性任务。任务3作为任务监控线程,主要完成各线程状态监控和系统状态监控,并通过串口上报系统运行信息。
图7为对嵌入式TCP Server的网络测试实验图。其中TCP Server的IP为192.168.1.31,端口:2000,PC机作为客户端,其物理网卡地址为192.168.1.50。在PC机的Windows控制台中使用“ping 192.168.1.31 -t”命令测试网络是否连通。通过Windows控制台输出可以看到,PC机发送的32 bit的数据均成功返回,耗时均小于1 ms,整个过程的数据收发正确,丢包率为0%。
图7 TCP Server通信测试实验图
对于多客户端连接测试,可采用多个物理PC机同时打开网络调试助手作为客户端连接到TCP Server。本文通过在一个物理PC机上创建多个虚拟机的方式,利用多个虚拟机的多个虚拟网卡进行多客户端连接测试。图8所示为IP 92.168.1.51的虚拟机中的客户端与TCP Server的数据通信测试图。
图8 TCP Server与客户端数据通信测试图
本文设计的TCP Server 作为云台控制单元已应用于一款分布式网络架构的挂轨型巡检机器人,该系统的网络交联关系如图9所示。其中TCP Server云台控制单元可同时连接并响应来自系统的主控模块、行走升降模块、远程监控后台,以及调试计算机的控制指令,并在其内部的系统业务线程(任务2)中完成三轴云台方位、左臂俯仰、右臂俯仰的角度控制[11]。
图9 嵌入式TCP Server的多连接应用案例示意图
本文针对目前工业设备分布式网络通信需求,设计了一种基于STM32,可最大支持4个客户端同时连接访问的嵌入式TCP Server模块。目前,该TCP Server模块已作为云台控制单元集成于一款分布式架构的光电检测机器人中,完成三轴云台控制功能。经测试,该TCP Server具有工作稳定、响应实时的特点,在嵌入式控制系统中应用该TCP Server的软硬件方案,可有效提升系统的通信能力、拓展性和可维护性。