Loading
新闻中心库存中心价格中心PDF中心图片中心
ICGLE 电子技术支持中心,为电气人员和相关企业提供全面的信息(IC技术\IC库存\IC图片\PDF资料等)服务
总线设计PCB设计单片机DSPARM
JAVA驱动设计C/C++汇编J2EE网络协议中间件技术嵌入式系统无线通信通信网络模拟技术接口电路显示光电传感与控制EDA/PLD
气流体控制电子产品电机及工具通信设备仪器仪表电线电缆建筑电气低压电器高压电器电源工控自动化广电设备医疗器械More..
电源设计仪器仪表技术专递电路图片电子专栏储存技术汽车电子测量测试音响技术家用电器
成功方案市场分析行业标准应用前沿芯片应用综合专区
VxWorks系统下的RTL8139驱动程序改进
来源:电子工程师   作者:蔡卫平,张怡典
字体大小:[大][中][小]

  引言

  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驱动,能有效地增强程序的鲁棒性,又不会降低效率,在交换机终端上长时间运行稳定,性能完全满足要求。

Upload by 小刘(2007-6-12)
IC
IC
推荐技术文章:
·基于VxWorks的飞机配电自动化主....
·VxWorks从Flash BOOT....
·VxWorks任务编程中常见异常分析..
·VxWorks体系下PowerPC8....
·VxWorks上WindML对多字节....
·vxWorks在线升级技术..
·基于Vxworks实时操作系统的串口....
·VxWorks网络驱动配置及分析..
·VxWorks中以太网通信报文的粘连....
·VxWorks下基于CS4281声卡....
·基于VxWorks的视频采集系统的设....
·VxWorks下UDP协议栈效率的研....
·基于MPC860T的嵌入式通信服务器....
·基于VxWorks嵌人式操作系统的C....
·VxWorks操作系统及实时多任务程....
·基于嵌入式操作系统VxWorks的图....
·利用VxWorks作Internet....
·linux下命令行下编译c程序..
·移植U-Boot到AT91RM920....
·一种改进嵌入式Linux操作系统实时....
·Linux内核初始化及启动之用户模式..
·Linux在信息家电(IA)上的应用
·嵌入式Linux的动态扩展技术研究
·基于Linux的嵌入式POS的GUI..
·Linux嵌入式系统与硬件平台的关系
·基于嵌入式Linux的打印控制系统的..
·Linux下获得CPU利用率和内存使..
·擂台战:嵌入式Linux面临图形化挑..
·面向多媒体应用的嵌入式Linux实时..
·Linux系统内存磁盘初始化技术详细..
·Linux下的网络HOOK实现以及使..
·Linux系统下搭建C/C++开发的..
·移动电话挑战嵌入式Linux
·在嵌入式Linux上实现JFFS文件..
·基于嵌入式Linux系统界面的研究
·Linux的向“心”力运动
·支持基于Linux的USB设备的三种..
·基于ARM的嵌入式Linux开发平台
·主流嵌入式Linux动态扩展技术比较..
·嵌入Linux基于MiniGUI信息..
IC
IC

©2007 版权归ICGLE所有   页面执行时间:62.500毫秒