WDM还引入了功能设备对象(Functional DeviceObject,FDO)与物理设备对象(Physical Device Object,PDO)来描述硬件。一个PDO对应一个真实的硬件,一个硬件只允许有一个PDO,却可以有多个FDO。在驱动程序中直接操作的不是硬件而是相应的PDO与FDO。当应用程序与WDM驱动程序进行通信时,系统为每一个用户请求打包,形成一个I/O请求包(IRP)结构,将其发送到驱动程序,并通过识别IRP中的PDO来区别是发送给哪一个设备。IRP从驱动程序堆栈栈顶进入,每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行,最底层的驱动程序在收到IRP后,通过硬件抽象层HAL与硬件发生作用,从而完成I/O请求工作。内核通常通过发送IRP来运行驱动程序中的代码。
4测频卡WDM驱动程序实现
在微软公司DDK工具的支持下,Compuware Nu-Mega公司提供Driver Studio工具包中的DriverWorks将WDM驱动程序编写所需的对内核及对硬件的访问封装成类库,加上驱动程序代码生成向导DriverlWizard,极大地简化了驱动程序的开发难度。本文选择DriverWorks作为WDM驱动程序的开发工具。
测频卡驱动程序的主要功能是为用户读取所测信号的频率参数,包括载频、调制方式、码元速率等。同时用户还能通过驱动程序发送命令对测频卡的工作方式进行控制。由此可知,驱动程序要重点处理好硬件访问和中断处理工作。
4.1I/O访问
类KIoRange封装了对I/O端口的操作。本卡中PCI配置寄存器中的Base 2基地址寄存器定义了I/O空间。在OnstartDevice例程中取得I/O资源,并初始化,其函数实现如下:
完成初始化后,可以用成员函数inb,inw,ind从I/O端口读一个(多个)字节、字、双字的数据;outb,outw,outd向I/O端口写一个(多个)字节、字、双字的数据。
4.2内存访问
在Windows系统中,内存分为分页内存和非分页内存。在WDM驱动程序中,对于硬件的内存映射一般需要用非分页内存。因为在一些较高级别的例程中,使用分页内存会造成系统产生缺页中断,从而引起死锁。使用非分页内存无需太多的转换,非常安全,效率也高。类KMemoryRange封装了对PCI设备映射内存的操作。类KMemoryRange成员函数的读/写操作同类KIoRange。由PCI配置寄存器中的直插电感Base 0和Base 1基地址寄存器分别定义了两个内存空间。在OnstartDevice例程中取得内存资源并初始化,其函数实现如下:
Status=m_MemoryRange0.Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddresslndexToOrdinal(0));
Status=m_MemoryRangel.Initialize(pResListTranslated,pResListRaw,PeiConfig.BaseAddresslndexToOrdinal(1));
4.3中断处理
中断处理一般需要声明两种类实例:Klnterrupt和KDeferredCall。Kinterrupt类用于实现硬件中断处理;KDeferredCall类用于实现延时过程调用。首先创建一个Klnterrupt类实例m_Irq,将此实例作为设备类的成员变量,然后创建一个KDeferredCall类实例m_DpcFor_Irq。m_Irq对应的中断服务例程和m_DpcFor_Irq对应的延时过程调用例程也需要在实例中声明。这两个实例m_Irq和m_DpcFor_Irq都是在OnstartDevice例程中初始化的,代码如下:
status=m_Irq.模压电感器InifializeAndConnect(pResListTranslated,LinkTo(Isr_Irq),This);模压电感器
m_DpcFor_Irq.Setup(LinkTo(DpeFor_Irq),this);
中断服务例程的处理时间应尽量短,对于一些耗时,但不需要立即处理的任务,中断服务程序会调用一个低于中断服务程序DIRQL级别的延迟过程调用程序DPC,在DISPATCH_LEVEL上完成处理,这个级别上的限制较少,函数调用也相对比较方便。在中断服务例程中,首先判断中断是否是自己设备产生的,若不是,返回FALSE;若是,进行必要的处理,请求一个DPC(延时过程调用),然后返回TRUE。关键代码如下:
在延时过程调用例程DpcFor_Irq中,读取所测信号的频率参数:
5驱动程序与应用程序之间的通信
虽然驱动程序是为设备的硬件层编程服务的,但同样需要提供和应用程序进行通信的能力,从而最终达到应用程序控制设备的目的。应用程序与驱动程序之间的通信通过调用Win32 API来实现,应用程序用Creatfile函数通过已
基于北斗二代系统的嵌入式船用导航仪硬件设计摘要:随着北斗二代系统的研制与建设,在导航领域我国将会从GPS主宰的局面转向为以我国自主研发的北斗二代全球导航系统为主的局面。为了实现北斗船用导航仪更轻便、快捷、低功耗和低成本,提出了一种采用ARM9
便携式家庭心电检测诊断仪的研制1、引言随着人民生活水平的提高以及社会老龄化程度的加深,心脑血管疾病的发病率呈上升趋势,已成为威胁人类身体健康的杀手之一。因为心脏病的发作具有突发性和随机性,为患者提供普及性心电图机以成为发展的必然趋
嵌入式系统在可配置系统中实现模拟I/O随着一种新产品 我们在Missing Link ELECTRONICS公司称之为 智能产品 的面市,嵌入式系统的发展出现了新动向。这一名词源自最近新出现的一个词 智能电话 ,用于描述具有智能电话特性的
2/3 首页 上一页 1 2 3 下一页 尾页