在VxWorks系统下改善RTL8139驱动实现提高其稳定性和效率

引言

RTL8139是台湾Real     te   k半导体公司生产的一种快速     以太网   控制器,提供符合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所示为某     交换机   终端设备的部分硬件框图。

 在VxWorks系统下改善RTL8139驱动实现提高其稳定性和效率_设计制作_RF/无线

CPU采用Motorola公司的PowerPC系列处理器之一的MPC8241,该芯片除嵌入32位PowerPC处理器内核外,还集成了MPC107桥,提供PCI接口与RTL8139连接,桥上有内存控制器,挂16MB S     DRAM   和4 MBFlash。CPU     时钟   是166MHz,SD     RAM   时钟是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的接收F     IF   O和发送FIFO都只有2Kb,加之RTL8139对收发数据包采取完全拷贝方式,在数据包突发期间,CPU占用率过高,来不及处理过多的数据包,从而造成丢包。在Rtl8139End.c中,驱动的数据包缓冲和协议栈的内存池是完全分开的,数据包接收和发送都有1次拷贝过程,而高性能以太网控制器一般只在发送时需要拷贝1次,这样每收发一个包,CPU需要多拷贝1次,这是导致RTL8139性能不高的重要原因,但这种包处理方式是由硬件决定的,驱动程序不能改变。事实上,在突发包很多的情况下,以太网控制器丢包是允许的,但突发时间过后,应恢复正常的收发包流程。但在前文介绍的硬件平台上运行Rtl8139End.c,在PC机上用Sniffer以连续方式给RTL8139发数据包,     测试   时间为数十秒,停止发包后,在PC机上用     pi   ng命令测试RTL8139能否正常回包,结果不能ping通,表明RTL8139的收发包流程因突发包太多而中断,且不能恢复。

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

 在VxWorks系统下改善RTL8139驱动实现提高其稳定性和效率_设计制作_RF/无线

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个     定时器       Ti   merO~  TI mer3),可以使用其中的  TI merO来产生硬件定时中断。在中断服务程序中,以Rtl8139HandleSendInt函数指针作为入口参数调用netJobAdd(),这样就可以定时执行Rtl8139HandleSendInt(),及时释放被占用的发送描述符。这需要在Rtl8139Start()中添加如下代码:

 在VxWorks系统下改善RTL8139驱动实现提高其稳定性和效率_设计制作_RF/无线

其中:(pDrvCtrl-》TxRingFree《0)表示没有空闲发送描述符。

修改后的驱动再用前文介绍的方法测试,Sniffer发包停止后,RTL8139能恢复。改用Smartbit测试,以半双工、10 Mbit/s线速给RTL8139发包,发包停止后,RTL8139仍能恢复。用Smartbit以1 200pps匀速率给RTL8139发包,包长240字节。测试结果为:RTL8139不丢包,CPU占用率45%。

4 、结束语

采用本文介绍的方法改进RTL8139驱动,能有效地增强程序的鲁棒性,又不会降低效率,在交换机终端上长时间运行稳定,性能完全满足要求。

责任编辑:gt

72
164
0
87

相关资讯

  1. 1、凯文费奇:《奇异博士2》已在伦敦片场进入拍摄最后一周3384
  2. 2、《我儿是奇葩》开启沟通新模式引爆后星星时代1656
  3. 3、饰演反派成名,被妻女抛弃,54岁不幸去世,死因令人心酸!1767
  4. 4、《燃烧》很幼稚,好吧!2517
  5. 5、《皓衣行》底气十足,与《山河令》正面较量,真的能更红么?3916
  6. 6、《侍神令》预告来袭,大家都关注周迅造型,而我却被陈伟霆迷住了3586
  7. 7、华表奖众女星精修无修对比,关晓彤这是又长胖了?1598
  8. 8、博纳影业公布2014年第一季度财报净利润增长64%3633
  9. 9、导演协会2013年度表彰大会冯小刚领衔葛优助阵4974
  10. 10、矢口史靖歌舞片《与我跳舞》追加室毅、三浦贵大、chay等出演4446
全部评论(0)
我也有话说
0
收藏
点赞
顶部