在RTX环境下的PCI板卡驱动方法研究
2016-05-14陈丽平
陈丽平
摘要:制导控制系统半实物仿真是制导控制系统研制工作中非常重要的手段,为保证实验结果的准确性,其对实时性要求非常高。Windows操作系统不是一个实时性操作系统,RTX扩展了该系统的硬件抽象层,提供了精确的时钟,定时器,但RTX只支持部分的外围硬件驱动,对于半实物仿真中使用的各类PCI板卡驱动不支持,本文以某类型的PCI板卡为例,介绍了一种在RTX环境下PCI板卡驱动的方法。
关键词:RTX 制导控制系统 硬件抽象层
中图分类号:TP39 文献标识码:A 文章编号:1007-9416(2016)07-0094-01
1 概述
在半实物仿真平台搭建过程中,对于参试设备多、结构复杂的仿真系统,其对实时性的要求非常高,如何保证仿真的实时性一直是仿真界研究中的一个重点和难点。仿真的实时性要求响应时间准确,受外界影响小,并且其在执行相同的任务过程中,每次任务执行时间应保持一致。Windows操作系统由于其友好的人机交互界面、Win32接口函数丰富、功能强大等特点得到广泛应用,但其线程调度机制隐含着不确定性,且线程的优先级比较少,定时精度比较差,故其不是一个实时的操作系统,不适用于实时性要求较高的半实物仿真平台。RTX能很好的解决这一问题,它是Windows操作系统的扩展,在保留Windows所有优势的同时实现硬实时处理能力的软件解决方案,其完全利用Windows的特性,开发简单,无需专用工具包[1]。
RTX(Real - Time Extension)是美国Ardence公司在Windows操作系统基础上开发的一套软件实现硬实时解决方案,结构如图1。
从图1看出,RTX的实时子系统RTSS有精确高速的任务调度器,其优先级都高于windows的进程,此外还提供了精确的时钟,定时器。其提供的定时器周期最小可达100微妙,完全能够满足半实物仿真平台搭建的需求。
2 板卡驱动方法
CPU是通过地址访问或内存访问的方式实现PCI设备的功能,而驱动程序就是直接操作设备工作的软件程序,所以实现PCI设备的驱动程序就是对相应的寄存器进行相应的操作。实现以上操作须获得该设备在BIOS上的基地址,及相应寄存器的偏移地址,基地址加偏移地址才能操作该寄存器,此外还须了解PCI设备寄存器的属性,需厂家详细的硬件手册。
2.1 PCI设备信息获取
PCI设备寄存器配置,是由BIOS初始化自动完成完成。如需开发某PCI设备的驱动程序,须定位到该设备,获取该设备的信息,如该设备的映射基地址、PCI总线号等,在访问内部寄存器之前,要对逻辑映射地之或端口进行使能[2]。在RTX下使RtGetBusDataByOffset()函数获得PCI设备信息,通过遍历比较VendorID、DeviceID和CardIndex,定位到该设备。伪代码如下:
for(uBusNum)//总线循环
for(uDeviceNum)//设备循环
for(uFunNum)//功能循环
{uBytesWritten = RtGetBusDataByOffset(PCIConfiguration,uBusNum,SlotNumber.u.AsULONG,PciData,uOffset,PCI_COMMON_HDR_LENGTH);//获取PCI设备信息
if((PciData->DeviceID == DeviceID) && (PciData->VendorID == VendorID) && uDeviceNum == CardIndex)//比较PCI设备的VendorID和DeviceID和CardIndex定位设备
{
//端口使能设置
PciData->Command = (PCI_ENABLE_IO_SPACE | PCI_ENABLE_MEMORY_SPACE | PCI_ENABLE_BUS_MASTER | PCI_ENABLE_WRITE_AND_INVALIDATE);
RtSetBusDataByOffset(PCIConfiguration,uBusNum,SlotNumber.u.AsULONG,PciData,0,PCI_COMMON_HDR_LENGTH);
//基地址获得
_base_addr = PciData->u.type0.BaseAddresses[2] & 0xfffffffe;
上述VendorID、DeviceID和CardIndex,可在设备管理器中查询。
2.2 访问内部寄存器
对板卡操作的核心就是对板卡内部寄存器的配置和读写,上述已获得PCI板卡的基本信息,根据厂家的硬件手册,可以知道内部寄存器的功能、地址及其性质[3]。以PCI12初始配置为例,伪代码如下:
for( i=0;i { RtWritePortUchar((PUCHAR)(addr1716+0x04), i); //配置采样的通 RtWritePortUchar((PUCHAR)(addr1716+0x05), i); //配置采样的通道 RtWritePortUchar((PUCHAR)(addr1716+0x02), ucGain); //配置采样的通道的电压范围 } Len12AD为AD采样通道数,为16,addr12是PCI12板卡的基地址,后面为操作寄存器的偏移地址。同样,要实现该板卡的其他功能,到硬件手册里找到相应的寄存器,对其进行相应的配置和读写即可。操作完毕之后,关闭板卡,用RtDisablePortIo()函数关闭IO。 3 结语 RTX解决了Windows不能提供强实时性的问题,但其不支持半实物仿真平台搭建中使用的板卡驱动,本文介绍了一种在RTX环境下的PCI板卡驱动方法,通过实验表明,该方法可行且稳定可靠。 参考文献 [1]黄键,庞亚华,薛顺虎.PTX环境下PCI设备实时驱动的开发.计算机工程,2010. [2]吕瑛,陈怀民,吴成富,邓红德.RTX换件下某智能串口卡的驱动开发.科学技术与工程,2007. [3]黄甫祯, 陈怀民,吴成富,王亮.基于RTX的实时网络应用研究.测控技术,2008.