Vxworks嵌入式操作系统下网络设备驱动程序设计
扫描二维码
随时随地手机看文章
1 前言
由于目前发展现代化的坦克火控系统已成为充分发挥坦克火力,提高战场生存能力的最有效途径之一。随着嵌入式系统的发展,VxWorks操作系统以其良好的有效性、可裁减性、互操作性、可靠性和卓越的实时性等优点被广泛地应用在高精尖技术及实时性要求极高的领域中。因此基于 VxWorks嵌入式操作系统的目标自动跟踪技术的研究已经成为提高坦克火控系统性能研究的主要方向。本文以研制坦克目标自动跟踪系统信息处理平台为背景,设计了基于 VxWorks的目标自动跟踪系统的 PCI总线接口板,实现了坦克火控计算机与坦克火控系统之间的数据通信。其中以桥接芯片 PCI9054为核心的设计尤为重要。使目标自动跟踪系统具备了能够捕获和跟踪较复杂背景下的无伪装的坦克和装甲车的能力,以及在跟踪状态下出现目标被遮挡时,系统进入记忆跟踪状态的能力。
2 目标自动跟踪系统的硬件电路设计
在基于 VxWorks嵌入式系统下,根据坦克目标自动跟踪系统的总体技术要求,需要完成 I/O板硬件结构电路的设计;PCI9054的配置;接口驱动程序的编写以及系统主程序的设计,实现目标自动跟踪计算机与坦克火控系统之间的数据通信。
下面就坦克目标自动跟踪系统总体设计进行论述。坦克目标自动跟踪系统包括通用视频跟踪器的所有功能,系统硬件由跟踪器主机、瞄准线功率驱动模块、视场图像及相关信息显示器、前端图像采集系统和连接电缆等几部分组成。跟踪器主机由主机板、 DSP板、图像图形板、I/O板、电源板和机箱、无源底板、插接件组成,主要完成图像采集、处理并输出控制;瞄准线驱动控制模块主要对跟踪器主机输出的控制信号进行功率放大来驱动瞄准线;显示器用于显示视野图像及相关信息;前端图像采集系统主要指火控系统光学改造部件及图像采集器 CCD;连接电缆用于实现目标自动跟踪系统各部件的信号连接。坦克目标自动跟踪系统组成如图1:
从图 1中可知,系统通信与控制模块(亦称 I/O板)是通用型的目标自动跟踪器与火控系统相连接的桥梁,在目标自动跟踪火控系统中具有极其重要的作用。它要求实时处理 DSP板传送的目标现在点和瞄准线中心的偏差量,最终转化为对瞄准线的控制量。将瞄准线控制量传送给瞄准线驱动控制模块,实现高精度控制瞄准线,使之始终对准目标。
3 在 VxWorks下的驱动程序设计
3.1设备驱动程序的设计与实现
应用程序必须通过驱动程序才能与硬件进行数据通信,而驱动程序的编写与操作系统密切相关。在 VxWorks操作系统中, BSP板级支持包向 VxWorks提供与硬件环境的接口,负责完成加电时的硬件初始化、为 VxWorks访问硬件驱动程序提供支持、将 VxWorks中与硬件有关以及与硬件无关的软件进行集成。因此在 VxWorks下编写驱动程序时首先要对 BSP进行修改配置。根据本系统的实际情况需要修改 config.h头文件:
#define DEFAULT_BOOT_LINE "fei(0,0)host: VxWorks h=172.16.21.100 e=172.16.21.253 u=chb pw=123456"在 VxWorks中,设备驱动程序有查询方式和中断方式二种。无论采用哪一种方式,设备驱动程序的基本流程都是相同的,如图 2:
从图 2中可以看出,编写设备驱动程序的第一步是获取硬件接口参数,包括内存映射地 址、I/O端口和系统中断控制器的输入(IRQ)。获取这些参数的方法由硬件的接口方式决定。例如,PCI总线作为一种即插即用的总线结构,在 BIOS和操作系统的支持下,能够自动为设备分配合适的硬件接口参数。其部分程序代码如下:
1) 定义常量和全局变量 #define PCI9054_DEVICE_ID 0x9054 #define PCI9054_VENDOR_ID 0x10B5 #define PCI9054_MEMSIZE 0x00001000 #define PCI9054_INIT_STATE_MASK (VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE) #definePCI9054_INIT_STATE (VM_STATE_ VALID | VM_STATE_ WRITABLE | VM_STATE_ CACHEABLE_NOT) Typedef struct pci9054Info { UNIT pciBus,pciDevice,pciFunc; Char irq; }PCI9054_INFO; LOCAL PCI9054_INFO pci9054InfoTable={-1,-1,-1,-1};
摘 要:本文主要介绍在Vxworks操作系统下网络设备驱动程序设计、调试方法以及将其加入系统内核的配置方法。
关键词:Vxworks 嵌入式操作系统 网络设备
引 言
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。
1 嵌入式系统
嵌入式系统是以嵌入式计算机为技术核心,面向用户、面向产品、面向应用,软硬件可裁减的,适用于对功能、可靠性、成本、体积、功耗等综合性严格要求的专用计算机系统。和通用计算机不同,嵌入式系统是针对具体应用的专用系统,目的就是要把一切变得更简单、更方便、更普遍、更适用;它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能。
嵌入式系统主要由嵌入式处理器、外围硬件设备、嵌入式操作系统以及特定的应用程序等四部分组成,是集软硬件于一体的可独立工作的“器件”;用于实现对其它设备的控制、监视或管理等功能。
嵌入式系统应具有的特点是:要求高可靠性;在恶劣的环境或突然断电的情况下,要求系统仍然能够正常工作;许多嵌入式应用要求实时处理能力,这就要求嵌入式操作系统(EOS)具有实时处理能力;嵌入式系统中的软件代码要求高质量、高可靠性,一般都固化在只读存储器中或闪存中,也就是说软件要求固态化存储,而不是存储在磁盘等载体中。
2 设备驱动程序[!--empirenews.page--]
Vxworks5.4中驱动程序主要分为三种:字符、块以及网络驱动程序。本文所介绍的网卡驱动程序则属于网络设备驱动程序。
2.1 网络设备驱动程序设计
网络的各功能部件图1所示,网络设备驱动程序实际上是处理硬件和上层协议之间的接口程序。网络传输协议层分发数据在应用程序接口和网络接口之间。网络化网络协议(如IP协议)发送数据在网络主机之间。连接/接口层使能主机隶属于硬件到相同物理媒质的通信。
在Vxworks5.4中,网卡驱动程序又分为END(Enhanced Network Driver)和BSD两种。它们分别处于如图2所示结构中。
2.1.1 BSD驱动程序设计
在Vxworks5.4中,网络驱动程序都是基于BSD UNIX版本4.3基础上的,这些驱动程序都定义在一个全局例程中,那就是attach子程序,xxattach( )子程序中包含5个函数指针,它们都被映射到ifnet结构中,这5个函数可见表1,它们在IP协议层任何地方被调用。
表1 网络接口处理
驱动程序指定函数 |
函数指针 |
功能 |
xxInit( ) |
if_init |
初始化接口 |
[!--empirenews.page--]xxOutput( ) |
if_output |
对要传输的输出分组进行排队 |
xxIoctl( ) |
if_ioctl |
处理I/O控制命令 |
xxReset( ) |
if_reset |
复位接口设备 |
[!--empirenews.page--]xxWatchdog( ) |
if_watchdog(optional) |
周期性接口例程 |
驱动程序入口xxattach( )调用ether_attach( )来把上述5个函数映射到ifnet结构中,ether_attach( )调用如下:
ether_attach(
(IFNET *) & pDrvCtrl->idr,
unit,
"xx",
(FUNCPTR) NULL,
(FUNCPTR) xxIoctl,
(FUNCPTR) ether_output( ), /* generic ether_output */
(FUNCPTR) xxReset
);
pDrvCtrl->idr.ac_if.if_start = (FUNCPTR)xxTxStartup;
上述参数中,需要一个接口数据记录(Interface Data Record (idr)),unit号和设备名,下面四个参数就是相关驱动程序的函数指针。第一个函数指针指的是init( )例程,这个例程可要可不要,第二个函数指针指的是ioctl( )接口,它允许上层来控制设备状态;第三个函数指针指的是把数据包送到物理层;最后一个函数指针指的是如果TCP/IP堆栈决定需要复位的话,它就复位这个设备。
接着下面那一句代码表示添加数据传输例程到IDR,ether_output( )例程被调用后,传输开始例程就被TCP/IP协议堆栈调用。
在这个入口驱动程序中还包括设备的初始化、发送和接收描述符的初始化等。
2.1.2 END驱动程序设计
END驱动程序是基于MUX模式,网络驱动程序被划分为协议组件和硬件组件。MUX数据链路层和网络层之间的接口,它管理网络协议接口和低层硬件接口之间的交互;将硬件从网络协议的细节中隔离出来;删除使用输入钩例程来过滤接收从协议来的数据包,和删除了使用输出钩例程来过滤协议包的发送;并且链路层上的驱动程序需要访问网络层(IP或其他协议)时,也会调用相关的MUX例程。值得注意的是,网络层协议和数据链路层驱动程序不能直接通讯,它们必须通过MUX。如图3所示:
2.3将驱动程序加载到Vxworks系统中
要对所设计的驱动程序进行测试,首先就必须把驱动程序加载到Vxworks IMAGE中,并且给设备分配一个IP,这样才能有利于网间测试。
首先,修改configNet.h文件,添加如下代码:
#ifdef INCLUDE_DM_9102_END
#define DM_9102_BUFF_LOAN_0 1
#define DM_9102_LOAD_FUNC sysDm9102EndLoad
#define DM_9102_LOAD_STR_0 ""
IMPORT END_OBJ * DM_9102_LOAD_FUNC (char *, void *);
和END_TBL_ENTRY endDevTbl [] 中添加
#ifdef INCLUDE_DM_9102_END
{0, DM_9102_LOAD_FUNC, DM_9102_LOAD_STR_0, TRUE, NULL, FALSE},
#endif /* INCLUDE_DM_9102_END */
其次,编辑config.h文件,添加如下代码:
#define INCLUDE_DM_9102_END /* Davicom 9102 Fast Ethernet Controller */
最后,编辑sysLib.c文件,添加如下代码:
/* include dm9102 End driver support routines */
#ifdef INCLUDE_DM_9102_END
IMPORT STATUS sysDm9102PciInit (void);
#endif /* INCLUDE_DM_9102_END */
/* include dm9102End driver support routines */
#ifdef INCLUDE_DM_9102_END
#include "sysDm9102End.c"
#endif /* INCLUDE_DM_9102_END */
#ifdef INCLUDE_DM_9102_END
sysDm9102PciInit ();
#endif /* INCLUDE_DM_9102_END */
通过上述过程相应的添加程序,然后重新编译Vxworks,这样就将所设计的网卡驱动程序添加到Vxworks内核中了。
2.4 PCI设备检测
如果所设计的网卡是基于PCI总线的,那么在程序开始就需要对PCI设备进行检测,在Vxworks5.4中有专门的PCI函数来检测设备的总线号、设备号和功能号。首先利用pciFindDevice( )函数对给定VendorID和DeviceID的设备进行检测,检测完后同时给出了设备的总线号、设备号和功能号;接下来就是获得该设备的中断号、基地址(包括IO和内存)。Vxworks中pciConfigLib.h文件中定义PCI总线的常量。如中断号:PCI_CFG_BRG_INT_LINE,IO基地址:PCI_CFG_BASE_ADDRESS_0,内存基地址:PCI_CFG_BASE_ADDRESS_1等等。所以利用函数pciConfigInByte和pciConfigInLong就可以很容易地获得设备的中断号和基地址。[!--empirenews.page--]
2.5 调试方法
为了方便调试网卡驱动程序,推荐利用串口对程序进行下载并将Vxworks image拷贝到软盘中以从软盘来加载它。调试的时候首先应该给网卡分配一个IP(利用usrNetIfConfig函数),然后利用ping来对网卡进行测试。
3 结语
利用上述方法所设计的网卡后,不久可以利用它来进行程序下载,而且能满足网卡所有的功能,包括对TCP/IP和UDP/IP(组播、广播和单播)进行了测试。