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驱动,能有效地增强程序的鲁棒性,又不会降低效率,在交换机终端上长时间运行稳定,性能完全满足要求。
责任编辑:gt
关于嵌入式技术就介绍完了,您有什么想法可以联系小编。