当前位置:首页 > 单片机 > 单片机
[导读]引言RTL8139是台湾Realtek半导体公司生产的一种快速以太网控制器,提供符合PCI2.2标准的接口,兼容IEEE802.3u 100BASE-T规范,支持IEEE-802.3x全双工流量控制,支持10Mbit.s-1/100Mbit.s-1全双工、半双工自适应,

引言

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所示为某交换机终端设备的部分硬件框图。 


 
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()中添加如下代码:

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

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

4 结束语

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭