VxWorks下LAN91C111网卡驱动程序的开发与分析
2011-09-06穆欣侃李国祯
穆欣侃,李国祯
(1.沈阳理工大学信息科学与工程学院,辽宁 沈阳110159;2.旭硝子特种玻璃(大连)有限公司,辽宁 大连116600)
VxWorks是一套具有微内核、高性能、可移植的嵌入式实时操作系统,在航天、航空、通信等诸多 领 域 得 到 了 广 泛 应 用[1-2]。LAN91C111 是SMSC公司生产的专门用于嵌入式产品的10/100M快速以太网控制器,该器件具有CRC校验、可编程、小尺寸、低功耗CMOS设计、同步或异步工作方式等特点,是设计嵌入式以太网网络接口的良好选择[3-4]。由于VxWorks操作系统自身不支持该网卡设备,并且SMSC也没有为该操作系统提供相应的驱动程序,因工程项目需要,完成了VxWorks下的LAN91C111网卡驱动程序的开发。
Tornado是VxWorks操作系统提供的一套集成开发环境,可完成该系统下各种程序的开发与设计。本文基于该开发平台,以LAN91C111 ISA网卡为例,具体介绍了END网络驱动原理与机构及LAN91C111网卡驱动流程,分析了该网卡测试中遇到的网络阻塞问题并给出了解决方法。
1 VxWorks网络驱动程序结构
网络数据链路层通过网络接口驱动程序,负责在两个相邻节点间的线路上无差错地进行数据发送和接收。网卡驱动程序在整个VxWorks网络接口中的位置如图1所示。
图1 VxWorks网络接口结构
整个网络接口呈层次结构,用户程序通过Socket接口调用TCP/IP协议层系列软件,网卡驱动程序则为协议层软件提供对网卡的访问。Vx-Works系统支持两种形式的网络驱动:一种是标准的BSD驱动,支持通用的BSD4.4网络、APl结构等,和大多数BSD网络驱动类似,将网络协议层与硬件驱动紧密联系在一起;另一种是END网络驱动,是 VxWorks独有的,简称增强型网络模型。END驱动是一个使用MUX功能与网络协议进行通信的数据链路层驱动,隔离了网络协议与硬件驱动。MUX层管理着网络协议接口和底层END驱动程序之间的通信,上层网络协议通过MUX层调用函数muxBind()和指定的一个或多个END驱动程序进行绑定,绑定后上层网络协议通过MUX层将数据包传输给底层END驱动程序;相反,底层驱动程序也通过MUX层将数据包传输给上层协议,而数据传输的细节问题都交给MUX层的APl函数来处理。工作于END的网卡同时支持任务级调试和系统级调试,这种层次结构也使网卡驱动程序的实现和移植更加方便[2]。
2 LAN91C111网卡驱动程序的结构及流程
标准的END驱动程序一般分为两大部分:BSP部分和驱动主体。BSP部分主要完成设备的查找和初始化;驱动的主体比较复杂,主要工作可归结为三点:1)实现一个与BSP部分的接口函数,完成设备存储器初始化、硬件的初始化和向MUX层注册该END驱动功能;2)实现END驱动要求的多个设备函数,如设备启动关闭函数等;3)实现中断处理程序,完成硬件中断的处理[5]。
LAN91C111网卡基于ISA总线结构,采用中断方式进行数据传输。在设备启动前,需预先设置好接口参数,包括内存映射地址、I/O端口和系统控制器的输入。由于在pcPentium的BSP中并没有提供该网卡的驱动程序,因此,该网卡驱动将BSP部分和驱动主体合为一体,形成了一个lan91c111End.c的主函数,提供MUX层所需要的各种API函数。
2.1 缓冲池数据结构
LAN91C111网卡的驱动与上层协议进行数据交换需要相应的内存缓冲,并且管理这些缓冲也需要相应的函数。VxWorks提供了netBufLib函数库用于创建和管理网络设备用到的内存缓冲池,网卡驱动可以直接使用也可在此基础上设计自己特定的内存缓冲池。VxWorks提供mBlk-clBlkcluster数据结构用于END驱动和MUX层进行数据交换,如图2所示。
图2 数据包结构图
发送时,网卡发送模块按这种结构处理报文;接收数据时,网卡仍然按这种结构将报文组织成M_BLK,回调函数END_RCV_RTN_CALL将报文传给上层协议。这一切都按VxWorks相应的规范和函数进行操作。
2.2 中断处理程序
LAN91C111网卡的中断处理函数为lan91 c111Int(),通过读不同的中断状态寄存器的值来处理设备允许的各种中断事件。一旦有中断发生,中断处理函数首先屏蔽中断,再分析中断状态寄存器值,调用相应的处理函数,其过程是:读中断状态寄存器,清中断事件,根据中断状态,调用相应的中断处理程序,如接收中断处理程序、发送中断处理程序等。为避免处理器长时间处于中断状态,提供系统的中断处理能力的中断处理程序中不能有运行时间过长的代码,以免造成系统阻塞而影响性能,也不能独占共享资源以避免死锁。对于网络驱动,一般调用netJobAdd()函数将处理函数添加到tNetTask任务的工作队列中,由系统任务完成。
3 驱动程序使用测试与问题分析
上述工作完成后,就可将驱动程序添加到Vx-Works中。再把完成后的系统接入一局域网,使用Ping命令对其进行测试,无论发送和接收都可完成测试,表明驱动程序开发成功。
为了对系统、网卡以及驱动程序的性能进行进一步的测试,在局域网中对其使用大数据量不间断测试方法。当接收包的数量低于20000时,网络正常,但高于时,会出现如下现象:网络瞬时处于停顿状态,然后又同时接收到大量的数据包,计算机死机,将此现象称为"网络阻塞"。针对该问题对系统和网卡驱动程序进行了分析。
由于网卡接收数据是被动的,在中断方式下接收过程不直接由上层协议调用,而是由接收中断触发,因此,导致该问题的主要原因跟网卡的接收中断程序有关。通过对标准ISA网卡驱动程序进行分析和比较,对接收中断程序的以下两方面进行了改进:
1)在接收中断服务程序被netJobAdd()函数调用前后添加了关、开中断处理;
2)接收报文时,将簇指针的申请与mBlk和clBlk指针的申请一样,同时移到系统任务中完成。
修改后,经测试网络阻塞现象明显得到减轻,但是并没有彻底解决。ISA总线最大传输速率为16MB/s,并且允许多个CPU共享资源,其CPU资源占用高、数据传输带宽小的缺点也是导致网络阻塞产生的原因之一。
4 结束语
本文分析了实时操作系统VxWorks下网卡驱动程序的设计框架和实现原理,主要阐述了基于ISA网卡的END驱动程序在VxWorks下实现的共性,对涉及到的缓冲池数据结构和中断处理过程进行了分析。由于在实际应用中,网络中不会出现测试中的大数据量接收和发送事件,因此该网卡的阻塞现象不会影响系统的实际应用。
[1]孔祥营,张保山,俞烈彬.VxWorks驱动及分布式编程[M].北京:中国电力出版社,2007.
[2]寇云林,陈怀民,段晓军,等.VxWorks END网络驱动软件的开发与实现[J].计算机测量与控制,2009,17(1):218 -233.
[3]SMSC.LAN91C111 data sheet[EB/OL].http://www.smsc.com:2010-07-01.
[4]李润超,张钦宇,曾伟,等.基于LAN91C111的嵌入式以太网系统设计和评估[J].计算机工程与设计,2010,31(17):3739-3742.
[5]周启平,张扬.VxWorks下设备驱动程序及 BSP开发指南[M].北京:中国电力出版社,2004.
[6]曹桂平.VxWorks END网口驱动程序设计[J].微计算机应用,2008,29(12):67 -74.