上传时间:2012年3月7日 作者:张蓓蕾 夏伟杰 周建江 关键词:嵌入式、PXI
  所谓驱动程序,就是直接控制设备进行工作的底层程序,实现了硬件和高层应用程序的交互。如果要使用PXI总线设备上的某个功能,就需要CPU能通过某段范围的地址访问或内存访问的方式与该功能交互。RTX驱动程序可以将获得的基地址转换成系统能够识别的虚拟地址,然后通过读写函数对不同板卡的底层寄存器进行操作,从而实现控制板卡正常工作。PCI定位寄存器配置由BIOS自动完成初始化,如分配总线号、中断向量、地址空间等,驱动程序只需要对数据偏移寄存器,即设备内部寄存器进行配置。访问内部寄存器,首先要获得PCI设备在BIOS上的映射基地址,然后根据设备的寄存器偏移量和格式对寄存器进行访问。

  在RTX环境下,PXI设备驱动程序的基本结构如图4所示。其中,PXI设备和RTX位于结构底层,PXI设备与RTX内核通过中断和I/O端口来进行数据交互,RTX内核通过库函数和设备驱动程序来提供所需服务。上层应用程序与底层驱动程序通过建立共享内存来进行通信。

  在RTX环境下进行PXI设备驱动开发,首先需要将Windows下的设备转换为RTX下的设备。RTX提供实现该功能的属性窗,如图5所示。利用RTX属性窗进行转换分主要分为两个步骤:  (1)添加RTX的INF支持;  (2)在设备管理器中更新设备驱动,将PXI设备从Windows支持转换为RTX支持。  RTX环境下一个完整的PXI驱动程序至少由以下几方面组成:  (1)设备初始化和释放。查找PCI设备传送设备号和厂家号两个主要参数,并遍历所有的PCI插槽直到匹配为止。找到设备后,读出中断号、基地址等,为以后的工作做准备。  (2)地址到虚拟地址的映射,使系统能够识别硬件。由于对硬件的读写操作是基于物理地址,而应用程序实现读写操作使用的是虚拟地址,所以驱动程序必须要完成地址映射。  设计的PXI板卡驱动程序首先用接口函数DeviceSearch()在总线上轮询,并查找到设备。然后通过DeviceInit()函数获得设备的硬件资源,如中断号、内存、输入输出I/O和DMA等。通过RtGetBusDataByOffset()函数访问设备的整个PCI配置空间,得到本地配置寄存器和存储空间内存的基地址和中断号等信息,然后根据获得的基地址利用RtTranslateBusAddress()和RtMapMem ory()函数将读取出来的基地址转换为系统能够访问的虚拟地址。需要指出的是,板卡的本地寄存器和存储空间可以通过Memory映像和I/O直接访问,文中设计的驱动程序的运用的是Memory映像。如选用I/O直接访问,可以通过调用RtEnablePortIo()和RtReadPortUchar()等函数即实现对端口的直接读写。当找到并打开板卡后就可以自定义读写函数对板卡进行读写操作,从而达到控制板卡的目的,具体开发流程如图6所示。

4 结束语  RTX环境下的驱动程序可以通过RTX函数进行直接访问的,能够随时停止随时配置。文中基于RTX,在Windows平台实现了风洞虚拟飞行试验舵控仿真系统。与直接基于Windows平台设计的系统相比,系统的响应时间提高到ms级,满足了实时性要求。由于测试软件是基于VC++环境开发的可视化软件,系统具有良好的可扩展性,通用性较强。通过联调,验证了仿真系统的可靠性和实时性。
1  2