舰船电子对抗
SHIPBOARDELECTRONICCOUNTERMEASURE
Oct.2005
Vol.28No.5
10/100M自适应双网卡切换在
VxWorks中的实现
宫 斌
(船舶重工集团公司723所,扬州225001)
摘要:描述了Intel8255910/100M自适应网卡在VxWorks操作系统中实现双网切换的驱动设计。首先说
明在VxWorks中支持多网络适配器的具体配置方法,然后提出了一种在SBSPC104硬件平台上实现Intel
82559和82559ER双网络适配器互为备份、自动切换的设计方法。
关键词:VxWorks;网络适配器;自动切换中图分类号:TP393.03 文献标识码:B 文章编号:CN3221413(2005)0520056205
Realizationof10/100MAdaptiveDoubleNetCardSwitchinginVxWorksGONGBin(The723InstituteofCSIC,Yangzhou225001,China)
Abstract:ThispaperdescribesthedrivingdesignofdoublenetswitchingforIntel8255910/100MadaptivenetcardinVxWorksoperatingsystem,firstlyillustratestheconcretecollo2cationmethodtosupportmultiplenetadaptorsinVxWorks,thengivesadesignmethodtomakeIntel82559and82559ERdoublenetadaptorsbeingsparepartsforeachotherandau2to2switchingontheSBSPC104hardwareplatform.Keywords:VxWorks;netadaptor;auto2switching
0 引 言
随着局域网技术的高速发展,网络通信在作战系统中的应用已经越来越广泛。目前作战系统中大多使用10M以太网,而系统要求的提高使得高速大带宽的通信网络成为作战系统网络发展的方向。本文结合某型出口设备中电子战系统网络通信的实际应用,介绍在VxWorks操作系统中Intel8255910/100M自适应网卡的配置和双网卡切换的实现。
VxWorks是美国风河系统(WindRiverSystem)公司研制的高性能、可裁减的嵌入式实
性被广泛地应用在通信、军事、航空和航天等领域中。VxWorks操作系统具有较强的网络性能,其标准的网络栈是一个与BSD4.4兼容的实时TCP/IP堆栈,它从基于BSD4.3的堆栈升级而来,增加了完全的路由支持以及Internet的一些新特性,使得VxWorks的网络性能更加优越。本文介绍的某设备电子战系统中的系统控制模块即采用了VxWorks操作系统,为适应作战系统提出的100M网络通信要求,进行了相应的网络配置和双网切换的驱动开发。
1 网络适配器的配置
系统控制模块在电子战系统中承担信息资
时操作系统。它以良好的可靠性和卓越的实时
收稿日期:20041227
第5期宫斌:10/100M自适应双网卡切换在VxWorks中的实现57
源的分配工作,并完成各分系统之间及对外的主要通信任务,其中与作战系统的通信通过网络完成。
该模块采用PC/104单板计算机,主要配置为SCM/SPT2嵌入式PentiumCPU模块,最高运行速度可达300MHz,在板内存达128M。该模块的网络硬件配置为SPT2板上带有的1个82559网络适配器;1块EM104P2LAN100N(该板有1个82559ER的网络适配器)。其软件
/3definetheoneyouwanttobuildfor,un2deftheother3/
/3also,intheMakefile,commentoutthelastMACH_EXTRAtobuildforeeV3/
#undefINCLUDE_FEI/3includeIntelE2therExpressPRO100BPCI3/
#defineINCLUDE_EEV/3includeIntelEtherExpressPRO100BPCI3/
#defineINCLUDE_EEE_END#defineINCLUDE_NETWORK
#defineINCLUDE_PCI/3includePCIbuslibrary3/1.3 修改syslib.c
环境包括集成开发环境软件Tornado2.0和Vx2Works5.4操作系统。
VxWorks操作系统的开发工具Tornado中
包含许多网络设备的驱动和代码,提供了Vx2Works所支持的网络适配器的驱动程序和模
在syslib.c中添加对网卡诊断程序的调用:
#ifdefINCLUDE_EEVsyseeVPciInit();#endif/3INCLUDE_EEV3/
1.4 修改sysNetif.c
块。而对Intel82559网络适配器的驱动需要加
入Intel公司提供的驱动模块(eeV_44_DRV.o)和诊断程序,并对相关文件进行修改。1.1 驱动模块配置具体过程如下:把eeV_44_DRV.o文件复制到目录$(WIND_BASE)/target/lib/objPENTI2UMgnuvx/中。
在sysNetif.c中加入函数,在初始化时将所有的网络适配器驱动起来,确保其正常工作:
#ifdefINCLUDE_EEV
#defineINIT_STATE_MASK(VM_STATE_MASK_VALID|CACHEABLE)
#defineINIT_STATE(VM_STATE_VALID|VM_STATE_WRITABLE|VM_STATE_CACHEABLE_NOT)#defineMAX_UNITS4
#definePCI_VENDOR_ID0x8086
#definePCI_DEVICE_ID0x1229/382559(D101MorD101S)3/
#definePCI_ER_DEVICE_ID0x1209/382559ER(D101ER)3/
externinteeE_board_pci_info[MAX_UNITS][3];
externvoid3eeE_bdvect[];externinteeEboards;voidsyseeVPciInit(void){
VM_STATE_
MASK_WRITABLE|VM_STATE_MASK_
在BSP的makefile文件中修改MACH_EXTRA宏定义如下:
MACH_EXTRA=$$(WIND_BASE)/target/lib/objPENTIUMgnuvx/eeV_44_DRV.o
在Tornado中基于pcPentium的BSP生成一个bootableVxWorksimage。1.2 修改Config.h
(1)系统的加载和调试接口都通过第1个
网络适配器来完成(第1个网络适配器为Em104P,所以需要修改Config.h中的DE2FAULT_BOOT_LINE类似如下,IP地址可以
根据实际环境修改):
#defineDEFAULT_BOOT_LINE\\
\"eeE(0,0)host:VxWorksh=192.168.
0.125e=192.168.0.129u=targetpw=passf=0x08tn=VxTarget\"
(2)在Config.h中加入对相应网络适配器的定义及支持PCI总线的数据库:
58
charirq;
UINT32membaseCsr;intdone=0;intcount=0;UINT16data;intbus,dev,func;
舰船电子对抗
到这一错误3/
第28卷
eeE_board_pci_info
[count][0]=-1;
}else{
/3正常状态3/
sysIntEnablePIC(irq);eeE_board_pci_info
[count][0]=bus;
}
eeE_board_pci_info[count]
[1]=dev;
eeE_board_pci_info[count]
[2]=func;
eeE_bdvect[count]
NULL;eeEboards++;
if((count++)==MAX_
UNITS)
{
done=1;break;}}}}if(done)
break;
}}
void3eeV_PhysToVirt(UINT32physaddr){
return(void3)physaddr;
}
ulong_teeV_VirtToPhys(void3virtaddr){
return(ulong_t)virtaddr;
}
#endif/3INCLUDE_EEV3/
=
/3查找设备,从PCI配置中读取总线号、设备
号和功能号,并指出首个网卡3/
func=0;
for(bus=0;bus for(dev=0;dev { pciConfigInWord(bus,dev,func, PCI_CFG_VENDOR_ID,&data); if(data==PCI_VENDOR_ID){ pciConfigInWord(bus,dev,func, PCI_CFG_DEVICE_ID,&data); if((data==PCI_DEVICE_ID)| |(data==PCI_ER_DEVICE_ID)) { /3读取内存基地址3/pciConfigInLong(bus,dev,func, PCI_CFG_BASE_ADDRESS_0,&membaseCsr); membaseCsr 0xFFFFFFF0; /3读取中断请求级别3/pciConfigInByte (bus,dev, func,PCI_CFG_DEV_INT_LINE,&irq); /3在sysPhysMemDesc[]中 & = 添加入口3/ if(sysMmuMapAdd((void3)mem2 baseCsr,(102434),INIT_STATE_MASK,INIT_STATE)==ERROR) { /3在连接(attach)中会检测 第5期宫斌:10/100M自适应双网卡切换在VxWorks中的实现59 1.5 ConfigNet.h的修改 在configNet.h中添加:#ifdefINCLUDE_EEE_END#defineEEE82559_LOAD_FUNCVEndLoad/3driverexternalinterface3/ #LOAN define1 EEE82559 _ BUFF _ /3enablebufferloaning /3eeVEnd初始化字符串格式: ee2 运行的系统是必需的。在作战系统中,为提高网 络通信的可靠性,对上网的设备和系统提出了双网卡冗余备份、故障时自动切换的要求。电子战系统作为作战系统中的重要信息源之一,必须符合这一要求,以保证与其他系统和设备的可靠网络通信,并且对自身的稳定运行也非常重要。 本系统的双网卡切换采用2个网络适配器互为备份,当其中一个出现故障时系统可以检测到错误,并迅速切换到另一个网络适配器上。2个网络适配器使用同一个IP地址,对于外部同PC104已经建立起来的TCP/IP连接,等同于1个网卡,切换网络适配器不会造成连接中断。2.2 环境 3/ 3 3/ #STRING define EEE82559 _ LOAD _ \"0x30:0x30\" IMPORTEND_OBJ3EEE82559_LOAD_FUNC(char3,void3); #endif/3INCLUDE_EEE_END3/ 系统的连接图如图1所示。 在configNet.h中的终端类型表“endDevT2bl”中添加: #ifdefINCLUDE_EEE_END{0,EEE82559_LOAD_FUNC,EEE82559_LOAD_STRING,EEE82559_BUFF_LOAN,NULL,FALSE}, {1,EEE82559_LOAD_FUNC,EEE82559_LOAD_STRING,EEE82559_BUFF_LOAN,NULL,FALSE}, #endif/3INCLUDE_EEE_END3/1.6 工程项目的配置 2.3 实现 图1 测试环境示意图 把eeV_44_DRV.o也编译到工程项目中,具体操作如下:在VxWorks的工程窗口中选择“build”页面,在“Macros”页面中将“EXTRA_ MOULES”宏修改为“$(WIND_BASE)/tar2get/lib/objPENTIUMgnuvx/eeV_44_DRV.o”, 首先必须使VxWorks支持多网络适配器, 系统在初始化时要把所有的网络适配器驱动起来。这部分内容参见2.1。设备初始化完成后启动一个监控任务,该任务的功能是对当前使用的网络适配器进行不间断定时查询,当发现该网络适配器失效时就切换到另一个网络适配器上。如果切换成功这个网络适配器就成为当前的网络适配器,该任务继续对当前的网络适配器进行监控。判定一个网络适配器是否失效的方法是:读网络适配器控制芯片的MDI寄存器1,其Bit5位如果为0,说明该芯片的链路自检出错,如果为1则为正常。监控任务如下: #include\"drv/pci/pciConfigLib.h\"(该数据库为PCI总线规格2.1提供支持)voidpfKeepNetCardNoStop(void){ intbus,dev,func;inti=0; 然后点击“Add/Set”按钮,最后点击“OK”按钮完成设置。同时,工程项目的网络组件配置中,需要把IP_MAX_UNITS由缺省值1改为2(本系统中为两个网络适配器进行切换)。 2 双网切换的实现 2.1 概述 采用有效的防错、容错机制对一个需要稳定 60 UINT16data;intintflag;func=0; 舰船电子对抗 { 第28卷 /3读取第2个网络适配器控制芯片的MDI寄存器1的值3/ /3如果寄存器的Bit5为1,则说明该网 /3查找82559类型的网络适配器3/ pciConfigInWord(bus,dev,func,PCI_CFG_VENDOR_ID,&data); pciConfigInWord(bus,dev,func,PCI_CFG_DEVICE_ID,&data); if(/3如果没有找到两个82559类型的网络适配器则无法完成倒换任务3/) { printf(\"EndDevicenotfound!\\r\\n\");return;}while(1){ /3进行不间断查询3/ if(0==gCurrentUseEth)/3当前工作的络适配器线路自检失败3/ if(!(value&0x20)){ printf(\"board1linkstatus:off\\n\");/3切换到另一个网络适配器3/}} /3任务延时10ticks3/taskDelay(10);}} 3 结束语 经过测试,在CPU主频为300MHz的SPT2上连续成功切换的平均时间是120ms/次 网络适配器为第一个3/{ /3读取第1个网络适配器控制芯片的MDI寄存器1的值3/ /3如果寄存器的Bit5为1,则说明该网络适配器线路自检失败3/ if(!(value&0x20)){ printf(\"board0linkstatus:off\\n\");/3切换到另一个网络适配器3/ }}else /3当前工作的网 左右,符合实际应用的需要。至于系统查询网络适配器的时间间隔,可以根据实际情况进行调整。本文所介绍的网卡驱动和双网切换仅适用于Intel82559和82559ER及兼容芯片组的网卡,并不具有通用性,但其双网检测和切换的设计方法具有普遍意义,可以为开发其他类型的高速大带宽网卡的双网切换提供借鉴。参考文献 [1] 罗国庆.VxWorks与嵌入式软件开发[M].北京: 络适配器为第2个3/ 机械工业出版社,2003.[2] 王学龙.嵌入式VxWorks系统开发与应用[M]. 北京:人民邮电出版社,2003. 因篇幅问题不能全部显示,请点此查看更多更全内容