基于PXI总线的水声目标回波模拟模块的设计
动程序编写
3.1.1 WDM 模型简介
WDM 模型(Windows Driver Model)是微软公司为当前主流操作系统Windows2000 和WindowsXP 的驱动程序设计的一种构架,它和传统的VXD 的驱动是完全不同的体系结构。Window2000/XP 系统结构图如图2 所示,应用程序调用Windows 子系统win32API,这个调用由系统服务接口作用到I/O 管理器,I/O 管理器进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package),它实际上是一个数据结构,具有丰富的成员,对于单层的驱动程序直接接受并执行这个请求包,并完成对硬件的操作,从而完成I/O 请求工作,并将执行的结果通过I/O 管理器返回给应用程序,而对于多层的驱动则将驱动程序分成了若干层,每层驱动再把I/O 请求划分成更简单的请求,以传给更下层的驱动执行。
3.1.2 设计方法
系统使用 VC+DDK+Driverstudio 来进行驱动的开发。Driver Studio 为驱动程序设计提供DriverWizard 向导,可以很方便地建立一个完整的驱动程序框架。设计PCI 驱动程序基本步骤为:
① 选择 PCI 总线类型,填写相应的VendorID、DeviceID、SubsystemID、RevisionID,
这些必须和PCI 板卡上的配置信息一致,用于产生INF 文件,在安装时识别板卡;
② 填写注册表信息;
③ 添加资源,包括I/O、Memory、IRQ、DMA 等;
④ 选择设备接口方式、读写方式、电源管理方式等;
⑤ 添加 IOCTL 命令字,并选用相应的输入输出模式;
⑥ 产生框架代码,添加用户代码;
⑦ 编译调试。
驱动程序设计的工作主要在步骤⑥、⑦,编写驱动主要针对以下的几个方面。驱动程序框架已经在添加资源时,创建了操作资源的KMemoryRange 类和KIoRange 类的对象,如将PCI 的Base1 空间设定为一个I/O 映射的空间,这个空间实际上就是CPLD 中寄存器的空间。要读写CPLD 中的寄存器访问双口存储器就是访问Base1 空间,这时S5920的PTNUM[2:0]会输出001,可以使用它完成对映射到该空间双口存储器的片选使能。
驱动程序中需要创建对象 KIoRange m_IoPortRange1;
并在 OnStartDevice(KIrpI)函数中调用
status = m_IoPortRange1.Initialize(
pResListTranslated,
pResListRaw,1);
对该对象进行初始化。
在驱动的其它例程中就可以使用对象 m_IoPortRange1 调用该类的成员函数ind、inw、inb、outb、outw、outd 来完成对PCI 卡的Base1 空间的DWORD、WORD 和Byte 的输入输出操作。
3.2 应用软件编写
3.2.1 应用程序与驱动程序的通信方法
应用程序与驱动程序通信步骤为:应用程序首先使用 CreatFile 函数打开设备,然后使用WriteFile、ReadFile、DeviceIoControl 与驱动程序进行通信,最后在应用程序退出前使用CloseHandle 关闭设备。DeviceIoControl 使用不同的IOCTL 命令字来调用驱动中的不同程序,完成应用程序与驱动程序的数据交换,驱动程序根据访问方式的不同,使用不同的方式获取应用程序的输入输出缓冲区地址。
驱动程序与应用程序的通信:当驱动程序获取了特定事件发生时,有时需要将这一信息通知给应用程序,主要的方法有2 种:一种是使用DeviceIoControl 进行异步通信,另一种是在应用程序中创建一个事件,并将该句柄传给驱动程序,然后在应用层开启一个线程等待这个事件,驱动程序会在事件发生的时候设置事件信号状态来触发应用程序。
3.2.2 与NI LabView 应用程序通信
仿真系统控制软件由 NI 公司的LabView 软件编制,为使本模块能使用该软件控制,必须编写接口程序。接口程序实际上就是Windows 标准动态链接库。链接库可以由LabView软件调用。
链接库导出函数定义如下:
extern "C" __declspec(dllexport) HANDLE OpenDrv();
extern "C" __declspec(dllexport) void CloseDrv(HANDLE hDevice);
extern "C" __declspec(dllexport) void WriteData(HANDLE hDevice,
ULONG freq,double frequency1,double frequency2,
double frequency3,double frequency4,double delay,double atten);
由于在C++中HANDLE 型定义为void *,而LabView 中没有指针型变量,用Labview调用该函数时可直接定义为ULONG 型。具体代码略。
4 应用实例
某型多普勒声呐发射信号频率为 300kHz,发射脉宽最大60ms,信号采用重复相位编码,编码灵活可变,带宽达到75kHz。为了完成对该声纳的检测,需要对其回波进行模拟,考虑到回波会产生伸缩效应,本模块的主要技术指标如下:
采样频率:10MHz~40MHz
存储深度:1MB
D/A 频率:10MHz~40MHz
系统总线:PXI
模拟回波时延:2ms~3s,精度0.1ms
该模块已用于某型多普勒声呐的检测,可以模拟不同深度、不同相对
PXI总线水声目标回波模拟模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)