发明内容
本发明所要解决的技术问题是提供一种故障录波系统中可以实现高速数据传输的以太网通信方法。
为解决上述技术问题,本发明提供一种故障录波系统中基于DSP的以太网通信方法,将网络控制器与以太网连接,DSP与网络控制器相通信,将采样数据存储于2片FLASH(HY27UF082G2A),其特征在于:所述网络控制器为AX88796,所述DSP上设置有TCP/IP协议栈,用于实现DSP系统与网络上主机的通信,所述TCP/IP协议栈包括1wIP,通信过程包括以下步骤:
1)在接收报文中断服务程序后,以太网驱动程序将接收报文存储在Pbufs链缓冲中,同时存储报文的各个链缓冲指针被依次存入一自定义的接收报文循环队列,而不直接传入协议栈,当报文收取完毕,中断服务程序即退出;
2)将循环队列中的报文送入1wIP协议栈进行分用;
3)应用层数据的输入:将经过协议栈分用的报文传送到上层由规约处理的模块并接收;
4)应用层数据的输出:将用户报文写入协议栈传输层的缓冲区;
5)将写入协议栈传输层的缓冲区的报文封装成网络报文;
6)将网络报文写入以太网控制器,再由以太网控制器将数据帧转换成差分信号送入网络。
在所述步骤1)中,所述以太网控制器的中断服务程序由DSPTMS 320VC5509A在控制器中断使能的条件下执行,实现读取控制器接收到的报文数据、处理接收缓冲区溢出及处理接收数据包错误。
在所述步骤2)中,在报文分用的过程中,协议栈立即发送一个回应报文,为了避免此时被以太网控制器中断打断发送流程,暂时禁用控制器中断。
在所述步骤3)和4)中,协议栈的应用层软件接口为raw API,主控系统使用TCP进行数据通信,应用层数据输入和输出过程包括应用层的初始化,应用层的初始化包括以下步骤,
d)设置主控系统为TCP服务器;
e)设置网络通信回调函数,即调用1wIP的tcp_accept配置函数;
f)在3个TCP端口上进行监听,等待后台处理机的TCP连接请求,所述3个监听端口分别为实时数据通道、录波文件通道和配置通道。
上述过程中,所述连接请求回调函数包括如下内容:
(1)初始化与该TCP通道对应的PORTINFO端口信息结构体中各成员变量值;
(2)设置该TCP连接的多个回调函数,包括收到新的用户数据,数据被接收端收到,连接发生异常。
在所述步骤4)中,应用层数据的输出包括以下步骤:
a)数据被写入1wIP的TCP发送缓冲区,封装进多个TCP报文段;
b)1wIP发送TCP缓冲区中的报文段到网络中。
将用户数据写入发送缓冲区是通过调用1wIP的tcp_write()函数实现,将数据封装进多个TCP报文段中,等待后续的发送。
最终的数据输出是通过调用tcp_output()函数实现。
网络控制芯片选用ASIX公司的AX88796(简称88796),它是适用于嵌入式系统的10/100Mbps自适应以太网控制器。它内部集成有物理层收发器和8K×16bit的SRAM,同时支持多种8位和16位本地CPU总线接口,包括MCS-51系列、80186系列以及MC68K系列,内部MAC寄存器与NE2000兼容,支持全双工和半双工通信模式。综合88796在网络通信速度、内部缓冲区容量、本地接口类型和寄存器操作等方面的配置,这款以太网控制器比之市面流行的RTL8019AS或CS8900A等更有优势,尤其是它的百兆网络数据速率能够满足DSP系统传输数据的速度需求。
TCP/IP协议是实现以太网通信的基础,只有符合该协议的报文(Packet)数据才能被网络上的主机正确接收到。TCP/IP协议栈即是实现该协议的软件模块,它可以运行在多种类型的CPU上,包括5509A DSP系统。移植工作就是针对DSP的特点,对TCP/IP协议栈进行必要的设置和改造,使得它能运行在DSP上,实现DSP系统与网络上主机通信的功能。
1wIP实现了绝大多数协议功能,是一套适用于嵌入式系统的免费开源的TCP/IP协议栈。它采用模块化的设计理念,对应于TCP/IP协议的每一层分别实现了ARP、IP、ICMP、UDP和TCP等协议,具有很好的扩展性。同时,它还具有如下特性:
1)支持多网络接口下的IP转发。
2)支持多个TCP连接和参数化的TCP最大报文段长度(MSS)。
3)支持TCP的流量控制,RTT往返时间估算,滑动窗口,超时重发,快速恢复和快速重发机制。
4)提供基于事件驱动的API函数,用于提高应用程序性能。
5)灵活的配置选项使得其对存储器容量要求仍然很小。
1wIP的协议实现规范完整,具有不俗的网络性能。LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。LwIP TCP/IP实现的重点是在保持TCP协议主要功能的基础上减少对RAM的占用,一般它只需要几十K的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端嵌入式系统中使用。
本发明所达到的有益效果:
本发明的故障录波系统中基于DSP的以太网通信方法,网络控制器选用AX88796,并对DSP上设置的TCP/IP协议栈进行设置和改造,从而实现故障录波系统的数据信息传送至以太网,同时以太网上的数据信息传送至用户端,从而实现故障录波系统的数据信息通过以太网进行高速通信。
具体实施方式
下面结合附图对本发明作进一步的说明。
图1为本发明中DSP系统中的网络数据输入流程图。本发明中网络数据的输入过程为:
网络数据的输入通常是由以太网控制器的接收报文中断发起的,DSP接收到该中断后即从以太网控制器中读取所有新的报文数据。接收到的报文必须经过TCP/IP协议栈分用(Demultiplexing),逐步解析才能传送到用户应用层。
DSP主控系统中将网络数据的输入分为两个阶段:以太网驱动程序收取接收报文阶段和接收报文被协议栈分用阶段。
在接收报文中断服务程序中,以太网驱动程序将接收报文存储在Pbufs链缓冲中,同时存储报文的各个链缓冲指针被依次存入一自定义的接收报文循环队列,而不直接传入协议栈,当报文收取完毕,中断服务程序即退出.
循环队列中的报文将在DSP系统的主程序中被送入1wIP协议栈进行分用。此时,主程序是一个无限循环,循环队列将周期性地得到处理,只要主程序的结构设计得当,则接收报文总是能够被及时处理并回应的。
需要注意的一点是,由于在报文分用的过程中,协议栈可能需要立即发送一个回应报文,为了避免此时被以太网控制器中断打断发送流程,接收报文被分用时,控制器中断需要被暂时禁用。
图2为本发明中网络数据的输出过程示意图;图3为本发明中以太网控制器的底层数据输入流程图;本发明中,网络数据的输出过程为:
主控系统的网络数据输出需要实现两部分:应用层数据输出和底层数据输出。
应用层数据输出即主控系统的网络应用软件调用1wIP的相关函数将用户数据写入TCP或UDP缓冲区的过程,随后缓冲区的数据将由协议栈自动封装成以太网数据帧,并发送到网络中去。根据主控系统的需求,本发明编写相应的用户数据输出函数,实现数据送入传输层缓冲区的功能。
底层数据输出即以太网控制器的底层输出程序将协议栈封装好的以太网数据帧交由控制器进行发送。它属于以太网控制器的驱动程序部分,由协议栈的网络层执行该操作。
以太网控制器的主要功能是收发网络报文,DSP主控系统对控制器的操作是由它的驱动程序完成的,包括控制器的初始化、数据输入和输出等底层函数。
图5为本发明中中断服务程序的流程图。以太网控制器的中断服务程序是服务于控制器发生的异步事件的,它由DSP在控制器中断使能的条件下执行,主要实现读取控制器接收到的报文数据、处理接收缓冲区溢出、处理接收数据包错误等功能。系统可以通过访问以太网控制器的ISR寄存器来查询是什么事件触发了中断。
由于接收到的报文必须经过TCP/IP协议栈的分用,逐步解析才能传送到用户应用层,因此多个报文通过协议栈的过程将花费更大的系统开销,体现在时间上即这一操作的耗时将相当可观。另外,某些报文在被协议栈分用时将会引起协议栈立即发送一个回应报文,这需要调用网络数据的输出例程,从而不仅进一步增大处理接收报文的时间开销,而且在输出过程中,DMA操作完成中断将不能被DSP及时响应,因为此时DSP还处在以太网控制器的中断服务程序中,全局中断使能位是关闭的,总之,在中断服务程序中即让接收报文通过协议栈进行分用是不明智的,不仅会导致中断例程的处理时间太长,使得其他中断得不到及时响应,还会和系统的DMA传输完成中断相冲突,造成通信失败。因此,系统的中断服务程序仅将接收报文的Pbuf链缓冲指针依次存入循环队列,而不直接传入协议栈。接收报文将在系统的主程序中得到进一步处理,此时,程序处在非中断服务程序中,可以正常执行网络输出例程。
主控系统在DSP上移植了1wIP的ARP、RARP、ICMP、IP、UDP、TCP协议模块以及附属的缓冲管理、状态显示、协议栈调试等模块,这些协议已经足以组建网络连接通道,能够满足主控系统的通信需求.移植结果在主控系统与PC主机之间进行验证,两者通过直连双绞线互联.经过试验,主控系统的ARP协议实现正常,查询主机可以发现其ARP表中已存在主控系统的IP地址记录;ICMP协议实现正常,ping程序通过,主控系统响应迅速,每个ICMP报文的响应时间都在1ms以内;UDP端口通信正常,主控系统使用UDP连接向主机发送10MByte字节有效数据,总共耗时0.967486秒,平均通信速度达到10.336MByte/s.同时,当主机发送UDP报文到主控系统未开启的UDP端口时,主控系统能够正常回应端口不可达的ICMP回应报文;TCP通信正常,DSP上的1wIP协议栈能够及时响应主机的TCP连接请求,主控系统主动发送的TCP数据可以被正常封装到各个TCP报文段中,并进入TCP发送队列,随后通过调用以太网控制器驱动被发送到网络上.TCP定位于可靠的有连接的字节流服务,通信中任一环节出错,都能导致TCP通信的中断或连接的丢失.主控系统能够实现通过TCP连接通道持续上传大批量数据到主机,TCP通信最大平均速度达到9.375MByte/s,峰值速度达到9.875MByte/s,可以满足主控系统对上传速度的要求.
通常TCP/IP协议的应用层软件接口是socket API,1wIP为协议栈提供了2种应用软件接口:底层的raw API和更高层的sequential API。Sequential API是类BSD socket的应用层软件接口,它的执行是基于传统socket的打开-读取-写入-关闭的机制,具有简单易用的特点。然而,这种类型的API要求协议栈代码和应用软件分属于不同的线程,即它必须在具有操作系统的系统上运行,因此,主控系统不能采用这种软件接口。
底层的raw API是基于事件驱动的,它通过由事件去主动执行回调函数(callback function)来实现协议栈与应用层的软件接口,协议栈代码和应用软件属于同一个线程。因此,raw API使得应用程序与协议栈结合更紧密,从而使得它比sequential API运行速度更快,占用内存更少,更适合小型嵌入式系统1。然而,由于raw API比sequential API抽象化层次低,因此应用程序的开发难度将加大。根据主控系统的实际配置,我们选用raw API作为协议栈的应用层软件接口。
DSP主控系统,使用TCP进行数据通信,应用层数据输入和输出过程包括应用层的初始化,应用层的初始化包括设置主控系统为TCP服务器,在3个TCP端口上进行监听,等待后台处理机的TCP连接请求。3个监听端口分别对应实时数据通道、录波文件通道和配置通道。每个通道的初始化过程都是相同的。图6为应用层的TCP初始化流程图。
在1wIP中,每个TCP连接都需要一个TCP_PCB数据结构体来维护它的所有运行状态,在连接断开时,该结构体才可以被释放。由于系统使用raw API,应用层软件接口是基于事件驱动的,因此,在TCP服务端口监听之前需要设置连接到来时的回调函数,这一步仅需调用1wIP的tcp_accept配置函数即可。在后面的应用层软件中仍会遇到类似的需要设置回调函数的场合。
每个TCP_PCB上都会绑定多个回调函数,例如,上一节中的请求连接的回调函数。1wIP中的回调函数是由用户定义,并在初始化时注册到TCP_PCB结构体中的。当TCP报文段经过协议栈的分用,被传递到TCP传输层,则协议栈会根据该报文对应的端口号及其特定的属性而调用预先注册过的回调函数,该函数将针对属性执行相应的操作。通常,每个回调函数是用来专门响应一个事件的发生,进而执行用户层的程序,因此,它已经属于网络应用软件范畴。
例如,当有主机连接主控系统监听的TCP服务端口后,协议栈的TCP层会收到TCP连接请求,并主动调用上一节设置的连接请求回调函数,该函数将为即将建立的TCP连接作好准备,随后协议栈即回应发起请求的主机并建立真正的TCP连接。主控系统中定义的连接请求回调函数包括如下内容:
(1)初始化与该TCP通道对应的PORTINFO结构体中各成员变量值;
(2)设置该TCP连接的多个回调函数,包括收到新的用户数据,数据被接收端收到,连接发生异常等。
建立TCP连接后,TCP数据通道也就建立了。一旦该连接有任何事件发生,协议栈将自动调用预先注册的回调函数予以响应。例如,若远端发送用户数据到主控系统,协议栈会调用用户定义的“收到新的用户数据”回调函数,在该函数中完成用户数据的接收。
由应用层对事件的处理方式来看,在宏观上,主机系统在3个TCP端口上同时监听连接请求,并能同时处理这3个端口的双工网络通信;而在微观上,每个接收的TCP报文段是被串行处理的,只是因为它们对应的服务端口号不同而被协议栈区分为从属于不同的TCP连接,随后再交由与该连接对应的回调函数来处理。因此,在主控系统不使用操作系统的情况下,多端口的TCP连接是可行的。
应用层数据的输入过程为:
图7为本发明中应用层数据输入的处理流程图。远端主机通过TCP通道发送用户数据到主控系统后,经过协议栈的分用,存储用户数据的缓冲区指针被作为参数,传递给“收到新的用户数据”回调函数。
按照1wIP的实现机制,若缓冲区指针为空,则表明远端发送了关闭TCP连接的请求,主控系统也将执行相应的TCP关闭流程。否则,系统调用tcp_recved()函数通知协议栈已成功接收该用户数据,并将数据送到上层由规约处理模块接收它们。
调用tcp_recved()函数是必须的,它的作用是扩大该TCP连接的接收缓冲区,即将TCP滑动窗口右边沿向右移动,使得远端能发送更多的数据过来。该函数缺失的后果是,滑动窗口被关闭,远端将误以为主控系统接收缓冲区满而不再发送新的数据。
规约处理模块是比应用层更高一层的数据处理单元,它将依照通信规约对接收数据进行解释,并最终完成相应的控制功能。
应用层数据的输出过程为:
图8应用层数据输出流程图。在实现应用层数据的输出之前,需要先配置对应该TCP通道的PORTINFO结构体中的DATASEND成员,在其中填写输出数据的缓冲区指针,发送数据长度等,然后将它作为参数传递给应用层输出函数。应用层输出函数完成实际的数据输出功能,它的流程如图4.19所示。其中,len_left是待发送的数据长度,tcp_sndbuf是当前TCP发送缓冲区的可用大小。
应用层数据的输出分两个阶段:
(1)数据被写入1wIP的TCP发送缓冲区,封装进多个TCP报文段;
(2)1wIP发送TCP缓冲区中的报文段到网络中。
在用户数据写入之前,TCP当前发送缓冲区的可用大小是不确定的。通常,缓冲区中会包含所有未被远端主机确认的已发送的报文段,这会导致缓冲区可用大小变小。因此,需要先确定它的可用大小,然后决定能把多少数据写入其中。
将用户数据写入发送缓冲区是通过调用1wIP的tcp_write()函数实现的,它将数据封装进多个TCP报文段中,等待后续的发送。
最终的数据输出是通过调用tcp_output()函数实现的.它尽可能地将发送缓冲区中的报文段发送出去,发送量由接收窗口和拥塞窗口决定,即在某些情况下,发送缓冲区中仍然会滞留一部分尚未被发送的报文段,有可能是对方缓冲区已满,或是当前网络拥堵,协议栈将根据特定的算法自动减少发送报文的数量.
在进行写入缓冲区和发送报文段的操作时,以太网控制器的中断是暂时禁用的。该操作是用来保证在协议栈代码运行期间,接收报文中断不会被DSP响应。由于系统使用了DMA方式传输网络数据到以太网控制器,因此,在发送报文段的大部分时间里,DMA总是在工作中。此时,若DSP响应接收报文中断,则当前的网络数据传输将被打断,DMA操作会失败。同时,禁用以太网控制器的中断也是为了保护协议栈临界区的执行,它是有必要的。禁用中断的缺点是,它将导致接收报文的积累。延迟其被DSP读取的时间。然而,考虑到主控系统在绝大多数情况下是数据发送者,接收数据量很小,同时,以太网控制器中的循环缓冲区也能够暂存足够多的接收报文,因此,禁用中断对系统稳定性的影响不大。
网络通信的效率与多种因素有关,为了提高网络通信速度,本文作了如下的工作:
(1)调整DSP访问网络控制器的时序,使得DSP对其进行读写操作的周期逼近它能接受的最小值。由于在网络通信期间,DSP会非常频繁地访问以太网控制器,因此,适当减小访问周期即可获取更高的数据流量。由控制器的技术文档可知,它的最短访问周期是160ns,则在DSP的EMIF控制寄存器中可以相应设置存储器访问时序,以刚好满足该时序要求为宜。
(2)使用汇编语言重写通信过程中频繁调用的关键函数。网络通信过程中被频繁调用的函数通常包括以太网控制器驱动中的底层数据读写函数和传输层中的校验和计算函数,它们都需要对报文中的每一个字节进行访问,时间耗费巨大。通常,汇编语言实现的函数效率更高,因此,本文分别完成了这两类函数的汇编语言实现。试验表明,在完成某一次数据发送任务的测试中,若这两类函数仍使用原有的C语言实现,则执行一次该任务将分别在底层数据发送函数和校验和计算函数上花费29643和13936个时钟周期;若用它们的汇编语言实现代替,则同样的任务,这两个函数分别仅花费了19855和836个时钟周期,时间被大大节省下来了。
(3)在底层网络数据输出时使用DMA操作完成数据传输。使用DMA操作明显地增大了网络数据吞吐量,试验证明,当不使用DMA操作完成网络数据输出时,TCP平均通信速率在40~50Mbps之间,一旦换用DMA传输方式,则TCP的平均通信速率能达到72~76Mbps,速度有了大幅度地提升。DMA能大大提高网络通信效率的原因在于它是与DSP并行操作的,此时,对以太网控制器的访问完全由DMA控制器来完成,DSP可以有更多的时间去执行协议栈代码,因而数据处理速度也相应提高了。
(4)调整最大报文长度(MSS)和协议栈发送缓冲区大小.前文已提到,MSS设为1460可以最大化每个报文的负载数据,因此,同样多的数据,封装后得到的报文数目就少了,协议栈处理报文的开销也相应地减小.发送缓冲区是协议栈内部的参数,应用层将待发送的用户数据送入TCP缓冲区中时,协议栈都会检查发送缓冲区是否足够容纳这些数据,若不能,则只能将一小部分刚好能存满缓冲区的用户数据写入其中,其余的则需要应用程序在下次继续尝试写入.显而易见,若发送缓冲区过小,则每次应用程序只能写一小部分数据到缓冲区,发送大批量的数据将造成时间都耗费在等待缓冲区中数据被发送和不断尝试写入的过程中,网络通信效率会很低.因此,将发送缓冲区设置得足够大,可以明显提高通信速度.试验表明,若主控系统循环发送21K数据到主机端,则当发送缓冲区大小仅为8760时,TCP平均通信速率在30Mbps~40Mbps;而当其被设为29200时,由于应用程序能一次把所有数据都写入发送缓冲区中,TCP平均通信速率达到了72Mbps.
(5)优化1wIP中的部分代码。在系统调试阶段,本文使用DSP的profiler工具发现1wIP的缓冲管理模块中有一个断言语句极其严重地影响了协议栈的性能,该断言调用了名为sanity()的函数,其花费DSP的指令周期数几倍于通信所需。由1wIP的最新版本可知,该函数可以被人为屏蔽,不会对协议栈有本质的影响。
(6)设置DSP软件的编译器优化选项,使用软件的Release版本。编译器将自动对软件的变量和函数进行优化,能在一定程度上提升通信的效率。
通过嵌入式TCP/IP协议栈的移植,以太网通信的通道已经完好地建立。此时,主控系统与后台处理机之间的网络通信性能还将和以下几个方面有关:
(1)TCP拥塞窗口。TCP具有流量控制功能,当网络拥堵发生时,协议栈将自动降低TCP传输速率,同时它将根据拥塞避免等算法动态调整发送数据量,避免加重网络负担。因此,网络阻塞时的通信速率下降是不可避免的。
(2)后台处理机的接收窗口,即它的接收缓冲区。主控系统发送的TCP数据都会存入后台处理机的接收缓冲区,同时,主控系统端将会确认接收端的缓冲区不会被过多的数据填满而溢出,即它将根据接收缓冲区大小调整发送数据量。若接收缓冲中的数据不能被应用层及时接收并处理,则接收端将向发送端通报一个越来越小的接收窗口,直至窗口关闭,不允许主控系统继续发送。因此,后台处理机必须开辟足够大的接收缓冲区,以使得主控系统可以满负荷地执行数据发送任务。
(3)后台处理机端的延迟的ACK确认。由于后台处理机基本上都处于接收数据的角色,因此,它可以延迟ACK确认报文的发送,从而使得一次大批量数据的传输仅需要少量的ACK确认报文返回给主控系统,网络负担相应地减少了,网络带宽可以被更充分地利用起来。
对于10KHZ采样率,16bit AD转换,96路模拟量,256路开入量的录波系统数据传输速度要求为:(96×16+256)*10000=17,920,000bps=17.92Mbps
实测速度达72Mbps,完全满足录波系统数据传输速度要求。