基于FreeRTOS系统和LwIP协议栈的网络通讯

2016-12-21 09:28王亚丁徐俊臣李冠宇邱文博
电子技术与软件工程 2016年20期
关键词:网络通讯移植

王亚丁+徐俊臣++李冠宇++邱文博++胡轶群++杨子原

摘 要 嵌入式设备常采用实时操作系统和网络协议栈的组合来实现网络通讯功能,本文基于FreeRTOS操作系统和LwIP协议栈为一款转发模块实现网络通讯功能。FreeRTOS和LwIP开源免费,移植简单,功能完善,配置灵活。本文介绍了FreeRTOS和LwIP的移植过程和配置方法,并给出了DHCP服务器和TCP协议的软件设计流程,验证了基于FreeRTOs和LwIP协议栈实现网络通讯的可行性。

【关键词】FreeRTOS LwIP 网络通讯 移植 TCP

当前主流的嵌入式网络设备所使用的操作系统有Linux、UCOSII、FreeRTOS、RTX等。Linux的网络协议栈完备,但内核移植裁剪较为复杂,开发难度较大;UCOSII参考资料多,但系统商用需付费;RTX(Keil开发)简单好用,自带RL_TCPnet协议栈,但是协议栈不开源,不便于调试和研究。本文基于FreeRTOS实时操作系统,采用第三方LwIP网络协议栈,实现网络通讯功能,为嵌入式网络设备提供了一种新的设计思路。

FreeRTOS具备良好的实时性、多任务功能,可移植裁剪,可灵活配置调度策略,RAM占用小,对系统资源要求低。最重要的是FreeRTOS完全开源免费,而且移植方法简单,在当前小型嵌入式操作系统市场使用率很高。LwIP是由瑞典计算机学院开发的一个开源的轻量级TCP/IP协议栈。LwIP的特点是在有无操作系统环境下都可以运行,提供完备的API接口,RAM消耗低。本文基于市面上的网络转发模块,进行FreeRTOS操作系统和LwIP协议栈的移植,并在移植好的工程上测试DHCP服务器、TCP通讯功能等,验证这种可靠实用的网络通讯解决方案。

1 硬件平台

本文采用的设备是一种能够将RS232串口数据转成网络数据的转发模块,模块的单片机采用ARM架构的STM32F429芯片,STM32F429基于Cortex-M4架构,具有浮点运算单元,2MB容量的FLASH,256KB的RAM,系统时钟频率能达到180MHz,外设丰富,最主要的是它具有以太网MAC接口,通过外接PHY芯片可以实现网络通讯功能。该模块的PHY芯片采用的是LAN8720,LAN8720是低功耗的10/100M以太网PHY芯片,支持通过RMII接口与以太网MAC层通信,内置10/100M全双工传输模块,支持HP Auto-MDIX自动翻转功能。转发模块网络部分硬件连接图如图1所示。

2 移植FreeRTOS操作系统

首先从官网下载FreeRTOS -8.2.3版本源码;然后在已有的工程模板(keil软件)上创建 FreeRTOS相关文件夹,添加源码文件到相应目录,添加后的工程目录如图2所示,红框内的文件就是添加的FreeRTOS源码,Source目录下主要是任务调度、消息队列、定时器等操作系统基本功能的实现,Ports目录下是操作系统与处理器平台架构相关的接口文件,Port.c是支持Cortex-M4架构的,Heap_4.c是一种动态内存使用方法。

FreeRTOSConfig.h是操作系统的配置文件,配置选项至关重要,决定了系统的功能和性能。移植后主要的配置功能有:使能抢占式调度器;系统主频 180MHz;系统时钟节拍 1KHz,即 1ms;系统最大优先级号;定义堆大小,用于动态内存申请,任务栈;定义系统可以使用信号量。除此之外,移植中需要注意的地方是要加入三个宏定义,将STM32F429原本的SVC_Handler,PendSV_Handler,SysTick_Handler中断函数定义为FreeRTOS内部定义的三个函数,因为FreeRTOS对这三个系统中断有特殊的处理过程。至此,FreeRTOS移植基本完成,可以在后续软件工程中使用创建线程,创建信号量、消息队列等API函数来实现任务间的调度和通信了。

3 移植LwIP协议栈

首先从官网下载LwIP-1.4.1源码,然后在软件工程中添加LwIP相关目录,工程结构如图3所示。LwIP_src目录下是LwIP源码,实现基本的LwIP协议功能。LwIP_port目录下的文件主要实现了LwIP协议栈与系统的接口,ethernetif.c文件实现LwIP协议和以太网驱动的接口,sys_arch.c文件(位于arch目录下)实现LwIP协议和操作系统的接口。

ethernetif.c主要功能是初始化 MAC 相关工作环境、初始化 DMA 描述符链表。实现LwIP最底层的发送和接收一帧数据的函数。

sys_arch.c文件包含了LwIP要用到的必要的基于FreeRTOS机制的函数,主要有创建线程函数sys_thread_new,创建信号量函数sys_sem_new,创建邮箱函数sys_mbox_new等。这些函数需要对FreeRTOS的API做简单的封装,如sys_thread_new函数的本质是调用xTaskCreate来实现创建线程。

APP目录属于应用层的文件。netconf.c文件实现LwIP协议栈的初始化并开启DHCP服务器,tcp_echoclient.c 文件实现指定的通讯协议任务。

stm32f429_eth.c,stm32f429_phy.c由ST公司官方提供,属于以太网标准库,用于实现ETH外设的配置,包括GPIO 初始化,RMII、 SMI 接口初始化,MAC 控制器工作环境配置,PHY 状态获取等。

4 网络通讯测试

测试DHCP服务器软件流程如图4所示,首先硬件初始化,初始化系统时钟、GPIO引脚、以太网ETH模块、串口等;然后创建FreeRTOS任务,指定任务优先级,栈大小;启动FreeRTOS调度,至此以后系统开始轮询调度任务。

在DHCP任务中首先执行LwIP_Init函数初始化 LwIP 协议栈,设置ip地址、子网掩码、网关;添加以太网设备;设置以太网设备为默认网卡;启动网卡;设置链路回调函数,用于获取链路状态。然后以250ms的周期查询DHCP的状态,当 DHCP 状态为DHCP_START 时,启动 DHCP 功能, LwIP 会向 DHCP 服务器申请分配 IP 请求。当 DHCP 状态为 DHCP_WAIT_ADDRESS 时,先判断IP 地址是否为 0,如果不为 0 说明已经有 IP 地址, 将停止DHCP 功能;如果IP 地址总是为 0,就需要判断超时时间,并响应超时错误。

使用网线把网络模块和电脑连入同一个路由器,保证路由器可以提供 DHCP 服务器功能。打开串口调试助手,为系统上电,可以看到在使能 DHCP 功能后,能够动态获取 的IP 地址,用电脑ping这个地址可以ping通,说明基于FreeRTOS和LwIP协议的DHCP功能调试成功。

TCP是一种可靠的、面向连接的通信协议,建立连接时需要通过“三次握手”建立连接。本文基于LwIP的socket编程接口实现TCP协议网络通讯,电脑作为客户端,网络模块作为服务器,TCP软件流程如图4所示,初始化软件流程与DHCP相同,区别是是创建的任务是TCP任务:创建socket套接字;调用bind函数绑定套接字的地址和端口号;调用listen函数监听客户端的连接请求;调用accept函数,确立连接;通过recv、send函数接收发送数据,与客户端通讯。在网络调试助手中确定客户端和服务器的IP和端口号,输入一行内容,可回显服务器的响应,即将输入内容打印出来,证明TCP通讯正常。

5 结语

在嵌入式操作系统和网络协议栈百花齐放的今天,选择一种简单实用的网络通讯方式能够很大的提高产品的可靠性和质量。本文基于开源免费,移植简单的FreeRTOS和LwIP协议栈,为嵌入式设备提供一种新的实现网络通讯功能的设计流程,具有一定的参考价值。

参考文献

[1]李少杰,马晓辉.基于FreeRTOS和LwIP的SNTP设计[J].单片机与嵌入式系统应用,2013(09).

[2]谢鹏程.基于STM32和FreeRTOS的独立式运动控制器设计与研究[D].广州:华南理工大学,2012(05).

[3]余晓光.基于实时操作系统FreeRTOS的Lwip协议的移植研究[D].昆明:昆明理工大学,2013(04).

作者单位

国家海洋技术中心 天津市 300112

猜你喜欢
网络通讯移植
“移植”瘦人粪便能减肥?
数控设备的数据传输技术浅探
基于现代网络通讯工具的中医诊断学教学实践与探索
计算机远程网络通讯技术