轻量级TCPIP协议栈OpenTCP的移植与应用

引 言 随着工业控制和计算机技术的发展,对数据的传输提出了更高的要求,各种总线技术的发展日新月异。其中,采用以太网技术完成数据的远程通信并连入Internet,已经成为工业和家用领域的重要发展方向,将来几乎所有上业设备和家电均需要具有Internet连接能力。目前,以MCU等构成的嵌入式系统已广泛应用于工业、家电等各个领域,嵌入式系统对网络应用的要求也越来越高,因此在嵌入式系统中实现TCP/IP协议,已经成为嵌入式系统领域的研究热点。 传统的TCP/IP协议在资源有限的嵌入式系统中实现起来很困难,必须把大量的资源花在保证数据传送的可靠性以及数据流量的控制上,因而在实时性要求比较高的嵌入式领域中,不能满足实时要求。因此,研究并改进嵌入式TCP/IP协议栈以满足嵌入式系统的高性能要求,具有重要的现实意义。 1、硬件平台和OpenTCP简介 1.1 硬件平台 该系统硬件部分由ADE7758高性能电能计量芯片、ARM处理器、2 MB NOR Flash、64 MB SDRAM和以太网接口等组成。ADE7758内部集成了6路16位△-∑ADC、高性能DSP、电压基准及温度传感器等电路,在1000:1动态范围内误差小于0.1%;提供有功、无功及视在电能,电压、电流有效值及波形采样等数据;三相三线/三相四线兼容;DSP内部对无功电能进行了补偿;提供独立的有功电能及无功电能脉冲输出,非常适合三相电能计量。被测三相电压、电流经传感器和调理电路后,送入ADE7758的A相、B相、C相电压和电流输入端;经ADE7758计算后,转换为有功功率、无功功率、视在功率、复功率等电能信息,数据通过ADE7758的SPI接口输出。MCU读出电能数据信息并处理后,送LCD显示和网络接口。硬件原理框图如图1所示。
为了通过计算机远程监控电能数据,软件部分采用了OpenTCP作为协议栈完成数据通信。OpenTCP是英国Vi-ola公司开发的用于8/16位MCU的源码开放的TCP/IP协议栈。与通用的嵌入式TCP/IP协议栈(如lwIP、uIP)相比,其代码更为精简,不需要操作系统的支持,可以根据需要进行裁剪,全部用ANSI C编写,支持Ethernet、SLIP、ARP、RARP、ICMP、TCP、UDP;应用层支持TFTP、TEL-NET、HTTP、SMTP、POP3、DNS等,对于应用层协议都提供callback接口,可方便用户的应用程序设计。 1.2 协议栈的特点 通用计算机上运行的TCP/IP协议栈过于复杂,需占用大量系统资源,而嵌入式应用系统的资源往往都非常有限。因此,需要将传统的TCP/IP协议栈加以简化。在设计中OpenTCP为提高协议栈的运行效率,在保持高性能的同时,针对嵌入式系统的要求对TCP/IP进行了部分精简和优化,使其能在各种MCU体系结构上实现,减少对资源的消耗,以满足嵌入式应用的要求。具体特点如下: ①由于嵌入式系统对网络功能的要求各有不同,OpenTCP可以根据应用的要求选择必要的协议,缩减程序代码的大小和对数据存储器的占用。 ②根据嵌入式系统应用环境的特点,一般其作为服务器端,与之通信的都是实现了完整TCP/IP的设备,通信较为可靠,不需要复杂的路由选择、IP分片、重装、TCP流量控制、拥塞控制等。因此,在OpenTCP中简化了TCP、IP等协议的实现,取消了所有的IP选项和TCP选项(包括IP的分段);TCP的流量控制窗口长度为1,即报文传输是基于停止一等待方式。避免了复杂的流量控制和分段处理,可以满足嵌人式网络应用的要求。TCP状态机也进行了一定的简化处理。 ③OpenTCP针对TCP/IP协议中对性能影响最大的部分——缓冲区的管理进行了优化,采用零拷贝技术,即在网卡驱动程序和协议之间没有数据拷贝的过程,以减少对系统资源的占用,简化缓冲区的管理,提高实时性。 TCP/IP具有层次性,每一层都有自己的数据格式。数据在各层之间传送时需要不断地进行打包和解包处理,以及数据的拷贝,会大大增加系统对存储器和运算能力的开销,降低系统的性能。在OpenTCP协议栈中,每一层都没有用于数据传输的缓冲区,协议栈之间传递的是数据指针。接收数据时,每一层将本层的数据处理完毕后,将处理过的数据指针指向上一层的数据的头部;发送数据时,也是以类似的过程来实现。 为了减小网络对系统存储器的需求,采用静态分配技术,在网络初始化时静态分配数据缓冲区,设置专门的发送和接收缓冲区,大小一般大于网络的MTU值。该值可根据网络环境调整,在本系统中采用的底层网络接口为以太网,设置接收缓冲区大小为1 500字节。当一个数据包来到时,网络设备驱动将其放在接收缓冲区里,调用TCP/IP协议栈。如果数据包里有数据,TCP/IP协议就会通知相应的应用程序。如果应用程序需要发送数据,OpenTCP的每一层协议都有自己的数据结构用于本层报文头部处理,发送缓冲区的只用来存放发送的数据。发送数据时,应用程序把数据写入缓冲区,设备驱动程序立即发送报文头部和数据到网络上。 ④OpenTCP协议栈可以作为一个任务运行在多任务的系统里,也可以采用前后台方式作为一个主程序运行在一个单任务系统里。其主循环控制都在重复地做一件事:检查是否有数据帧到达,如果一个帧到来,则立即根据帧的类型调用对应的输入处理函数。 ⑤应用程序接口决定了应用程序和TCP/IP协议栈连接的方式。最常用的TCP/IP API是BSD SOCKETAPI,通常用在Unix系统中,它需要多任务操作系统的支持。OpenTCP使用了事件驱动接口来响应特定事件。应用程序作为C函数运行在协议栈上,被调用来响应特定事件。当数据被接收或者分配一个连接时,这些函数被调用。应用程序只需提供一个回调函数,因此用户应用程序的编写和调试非常方便。 ⑥OpenTCP提供非常方便的调试手段,在每一层协议的关键部分都可以通过串口输出,使用户及时了解协议的运行情况。由于TCP/IP协议的复杂性,很难复现同一种错误,此时只需在编译程序时打开调试选项就可以实时监控协议栈的运行情况。调试完毕后,取消调试选项即可恢复协议的运行效率。 2、软件移植过程和对协议栈的改进 2.1 校验和的改进 TCP/IP协议处理过程中主要的运算量集中在3个部分:应用程序将数据拷贝到RAM;将RAM中的数据包拷贝到网络设备的发送缓冲区;计算校验和。前两部分在该协议中通过零拷贝技术改进运行效率,最后一部分是利用C语言来实现的。TCP/IP协议中多处用到了对校验和的计算,在IP层需要对20字节的报头进行校验,在TCP/UDP处理中是对12个字节组成的伪首部和数据进行校验。OpenTCP中采用的是每一个字节逐个计算校验和的算法,虽然这样可以适应8/16位等多种不同的处理器体系结构,但是却极大地影响了校验的速度和效率。为了充分发挥ARM7处理器的性能,采用了ARM汇编语言的优化算法,借鉴Linux核心代码中处理校验和的源程序,将Linux gcc中AT&T格式的算法改写为ADS1.2的标准写法,经过测试,大大提高了计算的效率。 2.2定时器的设置 TCP/IP协议中需要多种定时器来完成ARP缓存的刷新,TCP协议中也需要利用定时器实现重传等机制。OpenTCP采用的是统一的定时器处理方式,在协议初始化之前初始化一个定时器池,其中定时器的个数可以根据应用的要求来设置。当协议需要使用定时器时,首先在定时器池中申请一个定时器并设置超时时间,定时器的超时由硬件定时器中断处理函数完成。当检查到有超时的事件产生时,协议处理函数进行超时处理。S3C44B0X内部有6个定时器,这里选择定时器5作为该协议中与时间有关的事件的定时处理,定时器的周期为10 ms。 2.3网卡驱动程序设计 OpenTCP协议栈具有很好的可移植性,只需要在软件中设计几个宏定义,分别实现以太网数据的收发等功能。该协议栈已经提供了CS8900的驱动程序,由于使用的是RTL8019网卡,针对该芯片的特点编写了相应的驱动程序。将RTL8019内部的RAM分为几个 部分,分别作为接收缓冲区,ARP、ICMP、TCP和UDP协议的数据发送区。这里将各个不同协议的发送缓冲区分开,在实际应用过程中发现调试较为方便。 RTL8019AS的驱动程序设计中将协议中SEND_NETWORK_B(c)、NETWORK_CHECK_IF_RECEIVED()和NETWORK_RECEIVE_INITIALIZE(c)等几个宏定义为对应函数,就可以完成底层的驱动程序设计。 RTL8019AS的驱动程序设计主要包括3个部分:NE2000init()完成芯片的初始化,包括设置网卡MAC地址、收发缓冲区的地址和大小等;NE2000receive()和NE2000send()分别完成数据的接收和发送。 另外,OpenTCP的设置以宏定义的形式单独包含在config.h的头文件中,用户修改很方便。用户可以根据自己的要求更改MAC和IP地址、网关地址、收发缓冲区的大小、UDP/TCP连接的个数、端口的设置,以及ARP表项的大小等。 3、应用设计和小结 协议栈OpenTCP已经成功应用于小型光伏发电站电能计量系统设计中,ARM处理器运行嵌入式Web服务器,可以通过远程计算机实现对发电站电能参数的实时监控和记录,并通过TCP协议实现数据的远程采集。程序调试完成后固化在Flash中,上位机采用“VC+SQL Serv-er”编写应用程序。在100M快速以太网环境下经过测试,可以完全满足系统的要求。 OpenTCP作为一种高效的TCP/IP协议栈,利用高性能的处理器系统具有结构简单、速度快等特点,为各种需要远程控制或者实现便携式数据采集的应用场合提供了一个具有较高性价比的设计方案。
标签: 数码电器测评