APP下载

一种基于lwIP协议栈的双网口通信方案设计

2016-11-09徐业荣包明磊

计算机应用与软件 2016年9期
关键词:规约以太网报文

徐业荣 包明磊 李 明

1(南京国电南自电网自动化有限公司 江苏 南京 211100)2(国电南京自动化股份有限公司 江苏 南京 211100)



一种基于lwIP协议栈的双网口通信方案设计

徐业荣1,2包明磊1李明1

1(南京国电南自电网自动化有限公司江苏 南京 211100)2(国电南京自动化股份有限公司江苏 南京 211100)

针对嵌入式系统低成本以太网通信的需求提出将lwIP开源协议栈移入μC/OS系统,构成一种双网口通信方案。操作系统模拟层所用内部邮箱与信号量使用专属内存块。应用层设计成连接层和规约层,连接层循环遍历所有处于稳定状态的TCP连接,规约层负责解析上层应用规约。实验结果表明,应用此方案的系统能够实现可靠的以太网通信需求。

lwIPμC/OSTCP连接应用层

0 引 言

随着嵌入式系统设备的广泛应用,当设备需要与多个网络设备交互数据时,需要设备具有多网口、多连接功能,同时能够解析应用规约。目前嵌入式系统携带以太网通信功能,可采用商用操作系统的自带协议栈或者开发协议栈。前者对系统CPU的硬件性能要求较高[1],且一般为收费授权方式,使用成本较高。后者对开发人员的技术要求较高,开发周期较长。

lwIP协议栈作为一种开源、可稳定运行的网络协议栈,可移植于多种操作系统中。使用lwIP协议栈时,若采用新建任务方式管理新建TCP连接,存在两个弊端:新建TCP连接数目容易受操作系统任务数量上限限制;TCP连接关闭时需删除对应的任务,回收任务所占用的堆栈空间时,若处理不当,容易造成系统运行致命错误。

本文中提出一种基于lwIP协议栈双网口多连接的方案设计。方案中连接层以单任务循环遍历所有的TCP连接,规约层负责解析应用规约内容。

1 方案平台设计

1.1硬件平台设计

如图1所示,方案硬件平台由四个部分组成:逻辑处理单元、外接网口单元、存储单元、时钟单元。逻辑处理单元中的CPU采用Atmel公司AT91RM9200芯片,操作系统选用抢占式的实时多任务操作系统μC/OS II系统[2],将lwIP协议栈移植入操作系统中。

外接网口单元共设计2个以太网口,其中一个(NET1)由AT91RM9200自带的以太网控制器外扩PHY芯片(LXT971)构成,另一个(NET2)由总线外扩的以太网控制器CS8900构成。当外部以太网通信帧发送至一以太网网口时,主CPU收到相应的中断信号并读取外部通信帧。

在存储单元中,平台外扩一片16位4 MB大小的FLASH(S29GL032M)存储程序,选用两片内存芯片组成32位16 MB大小的SDRAM作为内存,选用铁电存储芯片FM24CL64存放系统运行时的关键配置参数。时钟单元由RTC芯片向系统提供时钟信息。

图1 系统平台设计框图

1.2μC/OS系统下的移植与实现

为了能够与不同操作系统或者无操作系统兼容,lwIP协议栈内部不使用特定的数据结构或者功能模块,而是通过模拟层接口函数实现协议栈与不同操作系统的兼容。在将lwIP协议栈移植入μC/OS操作系统时,利用μC/OS系统中的邮箱、信号量实现操作系统模拟层的功能[3]。

图2 系统软件架构

图2显示了方案的软件架构,其中操作系统模拟层衔接μC/OS系统和lwIP协议栈。后者完成 TCP/IP参考模型[4]中的运输层、网络层功能。为每个外部网络接口建立lwIP协议栈中的虚拟网络接口struct netif,构成链路层功能。

通信帧进入外接网口单元中的一个外部网络接口,经以太网控制器对通信帧处理,完成网口中断信号发出。逻辑处理单元接到中断信号后,调用网口中断处理函数对通信帧进行处理,将通信帧以消息发送至对应的消息处理任务。后者调用虚拟网络接口的通信帧输入函数处理通信帧,使通信帧进入lwIP协议栈内部处理流程。

方案在应用层中设计了连接层和规约层。连接层实现UDP报文的接收[5]、TCP连接的维护和TCP报文的收发,规约层完成接收报文的解析和回复报文的组帧功能。

1.3协议栈内存管理

在系统运行过程中,系统与外部的TCP连接与断开将有lwIP协议栈内部邮箱、信号量不断的新建与回收。为了避免系统长时间运行后,出现内存碎片化,方案对协议栈中邮箱、信号量的内存管理使用专属内存块的方式。

以邮箱申请为例,首先申请内存块pcQueueMemoryPool,调用OSMemCreate对pcQueueMemoryPool内存块进行初始化,返回数据块链表地址pQueueMem。如图3所示,内存块被初始化成数量为MAX_QUEUES、大小为strQueu数据块链表。每个数据块头部为struct os_mem结构体,用于存储数据块链表当前可用数据块信息。当使用sys_mbox_new申请邮箱时,先从pQueueMem中使用OSMemGet获取内存块。操作系统通过改变os_mem参数,使得可用数据块指针指向下一个数据块,可用数据块数量减1。sys_mbox_free释放邮箱时,调用OSMemPut函数将内存块放回内存池中,可用数据块指针指向当前数据块,可用数据块数量加1。信号量的申请和释放与邮箱方法类似。

图3 动态内存管理

2 应用层可靠性关键设计

方案中,应用层设计了连接层和规约层,连接层负责UDP广播报文的接收、TCP连接的维护和TCP报文的收发。规约层专注于具体规约处理,提高方案的扩展性,可用于不同的上层规约解析[6]。

2.1连接层可靠性关键技术设计

通常为了使每个TCP连接能够独立接收和发送数据,系统需为每个TCP连接申请独立的接收与发送内存区。当连接被关闭时,应对该连接的内存区进行回收。当各连接只需同步向外部上送相同信息时,每个连接的接收与发送内存区可采用代理线程设计模式[7],避免申请大量内存空间;当外部系统对系统通信数据需求差异较大,系统需为多个连接开独立的内存区用于接收和发送数据。以单次发送或者接收最多1500字节的数据为例,当TCP连接最大数目为10时,系统需约30 Kbyte的内存,内存消耗较大。本文提出一种基于单任务循环接收所有TCP连接的方法,此方法将节省内存开销。

首先,新建任务Newecho_thread()用于建立TCP连接,当任务接收到外部系统广播报文后,如果系统没有与此外部系统建立TCP连接,则调用lwIP内部函数新建TCP连接;其次,新建Tcpecho_thread()任务,循环遍历协议栈中tcp_active_pcbs链表,实现循环接收系统中所有处于稳定状态的TCP连接数据。

由于方案中是单任务接收所有TCP连接数据,将不必申请多个接收、发送数据内存区,节省了内存开销。此方案的弊端是多个TCP连接不能并行接收TCP连接数据,可以通过设置固定超时时间recv_timeout,减少每个TCP连接的阻塞时间。为了实现长连接功能,方案中采用两种策略维护活跃状态TCP连接,及时删除已失效TCP连接。

(1) 设置lwIP Keepalive功能选项

从Ver1.3.0开始,lwIP协议栈提供Keepalive保活功能[8]。在lwipopts.h文件中将Keepalive宏开关LWIP_TCP_KEEPALIVE置为1。针对每个TCP连接,可以设置允许持续空闲时间keep_idle、保活探测消息的发送频率keep_intvl、保活探测消息判断连接断开的次数keep_cnt选项。

(2) 检测TCP状态

lwIP协议栈以往版本内部函数返回值直接为指向相应数据的指针,此方法的弊端是运行过程中一旦出现错误,无法区分错误类型,不能对不同类型错误做出分类处理。lwIP 从1.4.0版本开始修改内部函数、操作系统模拟层函数的返回值与形参结构。将返回值更改为函数执行错误类型,原先的函数返回值以函数形参方式输出。

图4为连接层TCP报文接收任务Tcpecho_thread接收数据结构示意图。任务运行过程中,通过对tcp_active_pcbs链表循环遍历,使用lwIP协议栈内部函数循环接收所有处于活跃状态的TCP连接。判断函数返回值,确定当前连接的运行状态,如果发现连接异常,则进入异常处理环节。如果接收连接正常,则将报文交予规约层解析。

图4 Tcpecho_thread任务接收数据流程图

2.2规约层报文解析

在单任务接收所有TCP连接中,当规约层在处理外部通信帧时,连接层将处于阻塞状态,造成系统不能接收其他TCP连接。为了避免系统丢失其他TCP连接数据,方案中对规约层处理流程进行改进。

以电力行业继电保护设备信息接口配套标准DL/T667[9]为例,主站与从站之间一般处于非平衡传输工作模式。主站发出帧长较小,从站依主站命令类型回复自身系统运行中产生的大量有效信息数据。利用主站发出帧帧长较短特点,规约层可以以较小内存空间建立数据队列存储主站的多条通信帧和TCP连接信息。在系统运行过程中,规约解析函数依据先入先回原则对数据队列中通信帧解析并回复。规约层将待发送报文数据和TCP连接信息一并交予连接层,由连接层完成最终数据的发送。规约层处理完一帧数据后,将当前数据块标志Isused置为未用状态,开始处理下一个通信帧。

3 方案通信测试

3.1ICMP协议返回时间测试

图5 Net1网口Ping命令返回时间

图6 Net2网口Ping命令返回时间

数据大小(Bytes)最大返回时间(毫秒)Net1Net2最小返回时间(毫秒)Net1Net2平均返回时间(毫秒)Net1Net2320.8841.2480.3610.9340.4991.033640.9701.3170.3701.0870.5161.1831280.8021.5630.3831.3390.5271.442

作为TCP/IP协议的一部分,ICMP(Internet Control Messages Protocol)即因特网信报控制协议主要用于测试网络连接量。使用该协议对系统进行测试可以反映方案的响应性能。在实际操作上,使用Ping命令测试系统与后台系统的端对端连通。图5和图6分别显示了依据本方案所设计的通信系统两个网口在测试过程中,Ping命令不同大小字节数据响应返回时间。表1显示了最大、最小和平均返回时间。

Net1网口在不同数据负载下,返回时间相对稳定,Net2网口对Ping命令的响应时间,随着负载通信帧大小的增加而增加。这主要因为系统从外部接收通信帧时,需要先存储在CS8900芯片片上内存,然后通过总线传递至主CPU。当系统往外部发送通信帧时,同样需经CS8900芯片片上暂存。随着搬移数据大小的增加,搬移时间也会随之增大。作为Net1的ARM芯片内部的太网媒体访问控制器,因为与内核关联度较高,在传输速度上,基本不受字节大小影响。

3.2TCP连接稳定性测试

TCP作为一种面向连接的协议,可以从三个角度测试TCP连接的稳定性:

(1) TCP短连接测试

TCP短连接方式通常为client端向server端发起连接,server端接到请求后建立连接。双方交互数据后,则断开连接。本测试中服务器端为一台PC电脑,客户端为本方案系统。为了能够快速验证短连接建立的有效性,测试程序中省去双方交互应用层数据这一步。每当TCP连接建立成功后,PC电脑端自动断开连接并重新发起TCP连接。4小时不间断建立、断开TCP连接测试结果显示,系统能够满足TCP短连接要求,不存在系统运行一段时间后出现不能新建连接现象。这主要由于本系统lwIP协议栈邮箱、信号量的建立采用了专属内存块管理方法,每一次TCP连接的断开,该连接对应的邮箱、信号量所占用的内存块都得以及时回收。相反,如果采用从系统中直接申请内存用于建立邮箱和信号,经过半小时短连接测试,通过打开协议栈断言开关,显示sys_sem_new或者sys_mbox_new失败。

(2) TCP长连接测试

在长连接测试中,后台侧使用数字化变电站自动化系统PS6000+系统,测试时间设定为24小时,结果显示系统完全满足长连接可靠性要求。通过调整lwIP协议栈中Keepalive参数,可以实现快速识别网线断开或者后台侧崩溃现象。当网线重新插上或者后台重启后,系统又能快速实现与后台的重连。

(3) TCP瞬时多条报文测试

为了检验系统瞬时接收多条报文功能,利用以太网测试工具瞬时发送多条TCP命令。结果显示系统能够缓冲多条TCP命令,命令存储数目的大小与系统设定的TCP数据队列区大小相关。

4 结 语

本文介绍了一种基于μC/OS-II系统的lwIP协议栈双网口多连接的设计方案。在介绍了软件系统的架构基础上,本文还介绍了邮箱、信号量的内存管理方法、单任务循环接收所有TCP连接的方法以及规约层的响应机制。实验结果表明,该方案稳定性高,可以使用较小的系统时间和内存空间实现嵌入式系统与外部的多连接通信。该方案已经应用于电力系统二次侧保护设备的对外通信模块中,满足了装置对低成本以太网通信的需求。

[1] 李劲君,张爱民,张杭.一种应用于数字化变电站的嵌入式TCP/IP协议栈[J]. 电力系统自动化,2010,34(10):97-100.

[2] Jean J Labrosse. 嵌入式实时操作系统μC/OS-II[M].邵贝贝,译.北京:北京航空航天大学出版社,2007.

[3] 马涛,白瑞林,石坚.Cortex-A8平台的μC/OS-II及 lwIP协议栈的移植与实现[J]. 计算机应用与软件,2014,31(1):242-245.

[4] W Richard Stevens. TCP/IP详解[M].范建华,译.北京:机械工业出版社,2000.

[5] 徐鑫,曹奇英.基于LwIP协议栈的UDP协议分析与优化[J]. 计算机应用与软件,2011,28(3):246-249.

[6] 周绍文. 一种基于uIP协议栈的多应用层协议支持方案的设计[J].电力系统保护与控制,2010,38(9):109-112.

[7] 蒋俊,钟伟胜. μC/OS-II和LWIP的并发服务器与代理线程设计模式[J].单片机与嵌入式系统应用,2014,14(12):42-44.

[8] 胡俐蕊,王则林,胡传志.基于LwIP的μC/OS-II网络应用程序设计方法[J].计算机应用与软件,2010,27(4):271-273.

[9] 谭文恕,刘静泉,叶锋,等.远动设备及系统第5部分传输规约 第103篇 继电保护设备信息接口配套标准[S].DL/T.北京:中国电力出版社,1999.

DESIGN OF AN LWIP-BASED DUAL NETWORK INTERFACE COMMUNICATION SCHEME

Xu Yerong1,2Bao Minglei1Li Ming1

1(Nanjing SAC Power Grid Automation Co., Ltd, Nanjing 211100,Jiangsu,China)2(GuodianNanjingAutomationCo.,Ltd,Nanjing211100,Jiangsu,China)

Aiming at the requirement of low cost Ethernet communication of embedded system, we propose to move the open source protocol stack lwIP into μC/OS system to construct a dual network interface communication scheme. The inner mailbox and semaphore of operating system emulation layer is designed to use the exclusive memory block. The application layer is designed as the connecting layer and the protocol layer. The connecting layer loops through all the stable TCP connections. The protocol layer is responsible for parsing the upper application protocol. Experimental results show that the application of this scheme can achieve reliable Ethernet communication needs.

lwIPμC/OSTCP connectionApplication layer

2015-06-26。徐业荣,工程师,主研领域:继电保护装置研究与开发。包明磊,高工。李明,工程师。

TP368.2

A

10.3969/j.issn.1000-386x.2016.09.030

猜你喜欢

规约以太网报文
基于J1939 协议多包报文的时序研究及应用
基于1500以太网养猪场的智能饲喂控制系统的设计与实现
CTCS-2级报文数据管理需求分析和实现
浅析反驳类报文要点
电力系统通信规约库抽象设计与实现
一种在复杂环境中支持容错的高性能规约框架
一种改进的LLL模糊度规约算法
基于XML的电力二次设备异构规约建模与转换*
谈实时以太网EtherCAT技术在变电站自动化中的应用
ATS与列车通信报文分析