新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > VxWorks系统下的RTL8139驱动程序改进

VxWorks系统下的RTL8139驱动程序改进

——
作者:蔡卫平,张怡典 (九江职业技术学院 江西省九江市 332007) 时间:2007-01-26 来源:《电子工程师》 收藏

0 引言

rtl8139是台湾realtek半导体公司生产的一种快速以太网控制器,提供符合pci2.2标准的接口,兼容ieee802.3u 100base-t规范,支持ieee-802.3x全双工流量控制,支持10mbit.s-1/100mbit.s-1全双工、半双工自适应,价格便宜,性能稳定,是pc机、电信终端产品中应用最多的以太网控制器之一。rtl8139在各种操作系统下的驱动都能从realtek公司网页下载,其中包括vxworks系统下的驱动,而且提供c源代码。但是在嵌入式系统下,针对不同的硬件平台,往往需要修改该驱动程序以提高其稳定性和效率。基于mpc8241 cpu的硬件平台,本文提出rtl8139在vxworks系统下驱动程序的改进措施。

1 硬件平台简介

图1所示为某交换机终端设备的部分硬件框图。

本文引用地址:https://www.eepw.com.cn/article/21292.htm

cpu采用motorola公司的powerpc系列处理器之一的mpc8241,该芯片除嵌入32位powerpc处理器内核外,还集成了mpc107桥,提供pci接口与rtl8139连接,桥上有内存控制器,挂16mb sdram和4 mbflash。cpu时钟是166mhz,sdram时钟是66mhz,pci时钟是33mhz,rtl8139工作在10mbit/s,半双工方式,通过集线器(hub)连入internet,其作用是转发由话音信号打成的数据包,要求1200pps(每秒数据包),且cpu占用率不高于50%。

vxworks支持end(增加型网络驱动)格式的以太网控制器驱动,提供mux层作为网络协议和以太网控制器驱动间的接口,mux规定了驱动的接口函数,rtl8139驱动程序rtl8139end.c是完全按照end格式编写的代码,提供了所有mux层规定的接口函数,只要写好rtl8139 pci配制空间寄存器,在sysrtl8139end.c中传入pci空间首地址、中断向量号和中断优先级参数,按照end格式驱动装载程序,装载成功后rtl8139就能顺利运行。

2 驱动程序中需要解决的问题

如果数据包的收发速率是均匀的,rtl8139完全可以达到前文提出的要求,但是internet上经常有突发的数据包,而rtl8139的接收fifo和发送fifo都只有2kb,加之rtl8139对收发数据包采取完全拷贝方式,在数据包突发期间,cpu占用率过高,来不及处理过多的数据包,从而造成丢包。在rtl8139end.c中,驱动的数据包缓冲和协议栈的内存池是完全分开的,数据包接收和发送都有1次拷贝过程,而高性能以太网控制器一般只在发送时需要拷贝1次,这样每收发一个包,cpu需要多拷贝1次,这是导致rtl8139性能不高的重要原因,但这种包处理方式是由硬件决定的,驱动程序不能改变。事实上,在突发包很多的情况下,以太网控制器丢包是允许的,但突发时间过后,应恢复正常的收发包流程。但在前文介绍的硬件平台上运行rtl8139end.c,在pc机上用sniffer以连续方式给rtl8139发数据包,测试时间为数十秒,停止发包后,在pc机上用ping命令测试rtl8139能否正常回包,结果不能ping通,表明rtl8139的收发包流程因突发包太多而中断,且不能恢复。

分析rtl8139end.c程序,其发送数据包流程如图2所示。

rtl8139有4个发送描述符,有各自的发送状态寄存器tsd0~tsd3和发送起始地址寄存器tsad0~tsad3,每个发送描述符可发送1个数据包。在函数rtl8139send()中申请1个发送数据包缓冲区,将协议栈传下来的数据包拷贝进该缓冲区,然后将该缓冲区的首地址写入发送起始地址寄存器,最后填写发送状态寄存器,并将其own位置0,表示将该缓冲区交给rtl8139的发送dma管理,启动发送操作。发送完成后rtl8139产生中断,进人中断服务程序rtl8139int(),调用rtl8139handlesendint(),在该函数中读取发送状态寄存器。如果own位为1,则表示发送dma操作完成,释放相应的发送缓冲;否则表示发送dma操作未完成,该发送缓冲仍由rtl8139硬件所有,下次进入发送中断再重新查看own位。如此循环往复,直到own位变为1,才能释放相应的发送缓冲,其占用的发送描述符变为可用。

以上过程可归结为两点:

a)在rtl8139send()中申请1个数据包缓冲区,占用1个发送描述符;

b)在rtl8139int()中释放相应的数据包缓冲区和发送描述符。

从以上分析可以看出,只要发包的这两个环节不出问题,发包流程就不会中断,另外,在rtl8139handlesendint()中,不是仅仅释放1个包缓冲和描述符,而是将所有启动过发包操作、发送状态寄存器的own位变为1的描述符和相应包缓冲都释放掉。这样可增强程序的稳定性,在有突发包的情况下,cpu可能来不及响应中断,即造成中断丢失,但只要还有1个描述符可用,发包完成后能进中断,就可以把以前占用的缓冲和描述符全部释放掉。如果突发包太多,cpu连续4个发包中断未响应,发送描述符全被占用,下次进入rtl8139send()将无发送描述符可用,也就不会再有发包中断,rtl8139handlesendint()不会被调用,发送描述符无法释放,发包流程就此中断,不能恢复,这就是上述rtl8139不能ping通的原因。

3 解决办法

根据以上分析,只有将被占用的发送描述符和发送缓冲释放,发包流程才能恢复,这只要调用一次rtl8139handlesendint()就能实现。mpc8241片内集成有4个定时器(timero~timer3),可以使用其中的timero来产生硬件定时中断。在中断服务程序中,以rtl8139handlesendint函数指针作为入口参数调用netjobadd(),这样就可以定时执行rtl8139handlesendint(),及时释放被占用的发送描述符。这需要在rtl8139start()中添加如下代码:

电机保护器相关文章:电机保护器原理


关键词:

评论


相关推荐

技术专区

关闭