论文部分内容阅读
摘 要:介绍在windows系统环境下,为满足转台实时控制,提出实时控制动态链接库的开发需求,介绍实现方法,并结合具体工程实践验证动态链接库的实际效果。
关键词:转台 实时控制 动态链接库
中图分类号:TP273.5 文献标识码:A 文章编号:1007-3973(2013)002-082-02
1 引言
在windows环境下通过自制的PCI并口卡实现转台实时控制,应用程序要实现控制协议,则必须与PCI卡的驱动程序进行通信。为了屏蔽双方通信的细节问题(驱动程序连接、地址读写、I/O控制等),实现嵌入式调用,提出了动态链接库的开发。
2 通信原理
驱动程序必须与应用程序进行通信,才能最终达到应用程序控制设备的目的,目前比较流行的通信方法一种是:使用WriteFile和ReadFile分别从驱动中读取和写入数据,然后用不同的IRP来传递信息。另一种是:使用DeviceIoControl通信。
2.1 应用程序与驱动程序通信
2.1.1 应用程序实现与驱动通信的过程
2.1.2 DeviceIoControl函数
2.2.1 DeviceIoControl异步完成
当应用程序调用DeviceIoControl函数时,驱动程序首先把此IRP保存,然后设法返回STATUS_PENDING。在一个事件发生后,驱动程序完成该IRP。
2.2.2 Win32事件
应用程序创建一个事件,直接将该事件句柄传递给驱动程序,然后等待驱动程序发送事件消息。驱动程序在获得该事件指针后,在IRQL<=DISPATCH_LEVEL级别下的例程中设置事件信号状态来触发应用程序。
2.3 驱动程序获取应用程序数据缓冲区的方法
buffered方式,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
direct方式,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页。因此你的驱动程序将使用MDL工作。
最终使用哪种方式是由I/O控制命令中的数据访问方式来决定。实际就是共享BUFFER和建立一个MDL的过程。
3 动态链接库的功能实现
3.1 设备的打开与关闭函数
在Windows操作系统中,设备被看成是一个文件。我们可以打开一个设备句柄(就如同打开一个文件),然后应用程序可以在设备句柄最后关闭之前与驱动程序通信(读/写操作),从而间接驱动设备。
应用程序访问驱动程序的步骤是:先用CreateFile函数打开设备,然后用DeviceIOControl函数,也可采用ReadFile和WriteFile函数与驱动程序通信,本设计采用前者。当应用程序退出时,用CloseHandle关闭设备。
3.2 中断处理函数
开中断:打开中断,开始采数。调用此函数成功后,设备驱动程序开始采数,并每隔1ms给应用程序发一个消息。
关中断:关闭中断,停止采数。
3.3 数据采集和数据交换函数
数据采集:根据转台并行通信协议,读取规定的设备地址中对应的数据,再加以合并整理出转台各轴的角位置数据。
数据交换:此函数完成应用程序和底层驱动程序交换数据的功能。该函数带两个参数,参数类型均为DWORD *,一个为转台各轴角位置数据在1ms内采样的数据包,另一个为下一个1ms内转台各轴角位置数据的仿真数据。
3.4 转台控制指令函数
转台控制指令包括:运行(位置、速率、摇摆)、停止运行、仿真、停止仿真指令。根据转台并行通信的协议,向规定的设备地址中写入对应的数据即可完成转台的控制指令。
4 典型案例分析
如图2所示,上位机发送内框仿真指令及仿真参数(正弦波1度1Hz,仿真周期为5个),则转台处于仿真状态下,数据采样效果比较满意,该图显示的是转台做1度1Hz的正弦仿真。上位机采样周期为1ms,每次数据采集有2组数据,以0.5ms间隔显示。
根据曲线分析图可以看出,转台实时控制效果较好,满足工程需要。
5 结论
转台实时控制动态链接库可以满足1ms的实时控制需求,达到了工程要求。
该动态链接库的开发实现了转台上位机软件的嵌入式开发,无需开发人员了解转台通信协议及底层实现细节,既方便了上位机开发人员同时也能很好的保护公司商业秘密。
关键词:转台 实时控制 动态链接库
中图分类号:TP273.5 文献标识码:A 文章编号:1007-3973(2013)002-082-02
1 引言
在windows环境下通过自制的PCI并口卡实现转台实时控制,应用程序要实现控制协议,则必须与PCI卡的驱动程序进行通信。为了屏蔽双方通信的细节问题(驱动程序连接、地址读写、I/O控制等),实现嵌入式调用,提出了动态链接库的开发。
2 通信原理
驱动程序必须与应用程序进行通信,才能最终达到应用程序控制设备的目的,目前比较流行的通信方法一种是:使用WriteFile和ReadFile分别从驱动中读取和写入数据,然后用不同的IRP来传递信息。另一种是:使用DeviceIoControl通信。
2.1 应用程序与驱动程序通信
2.1.1 应用程序实现与驱动通信的过程
2.1.2 DeviceIoControl函数
2.2.1 DeviceIoControl异步完成
当应用程序调用DeviceIoControl函数时,驱动程序首先把此IRP保存,然后设法返回STATUS_PENDING。在一个事件发生后,驱动程序完成该IRP。
2.2.2 Win32事件
应用程序创建一个事件,直接将该事件句柄传递给驱动程序,然后等待驱动程序发送事件消息。驱动程序在获得该事件指针后,在IRQL<=DISPATCH_LEVEL级别下的例程中设置事件信号状态来触发应用程序。
2.3 驱动程序获取应用程序数据缓冲区的方法
buffered方式,I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区。而你的驱动程序将使用这个系统缓冲区工作。I/O管理器负责在系统缓冲区和用户模式缓冲区之间复制数据。
direct方式,I/O管理器锁定了包含用户模式缓冲区的物理内存页,并创建一个称为MDL(内存描述符表)的辅助数据结构来描述锁定页。因此你的驱动程序将使用MDL工作。
最终使用哪种方式是由I/O控制命令中的数据访问方式来决定。实际就是共享BUFFER和建立一个MDL的过程。
3 动态链接库的功能实现
3.1 设备的打开与关闭函数
在Windows操作系统中,设备被看成是一个文件。我们可以打开一个设备句柄(就如同打开一个文件),然后应用程序可以在设备句柄最后关闭之前与驱动程序通信(读/写操作),从而间接驱动设备。
应用程序访问驱动程序的步骤是:先用CreateFile函数打开设备,然后用DeviceIOControl函数,也可采用ReadFile和WriteFile函数与驱动程序通信,本设计采用前者。当应用程序退出时,用CloseHandle关闭设备。
3.2 中断处理函数
开中断:打开中断,开始采数。调用此函数成功后,设备驱动程序开始采数,并每隔1ms给应用程序发一个消息。
关中断:关闭中断,停止采数。
3.3 数据采集和数据交换函数
数据采集:根据转台并行通信协议,读取规定的设备地址中对应的数据,再加以合并整理出转台各轴的角位置数据。
数据交换:此函数完成应用程序和底层驱动程序交换数据的功能。该函数带两个参数,参数类型均为DWORD *,一个为转台各轴角位置数据在1ms内采样的数据包,另一个为下一个1ms内转台各轴角位置数据的仿真数据。
3.4 转台控制指令函数
转台控制指令包括:运行(位置、速率、摇摆)、停止运行、仿真、停止仿真指令。根据转台并行通信的协议,向规定的设备地址中写入对应的数据即可完成转台的控制指令。
4 典型案例分析
如图2所示,上位机发送内框仿真指令及仿真参数(正弦波1度1Hz,仿真周期为5个),则转台处于仿真状态下,数据采样效果比较满意,该图显示的是转台做1度1Hz的正弦仿真。上位机采样周期为1ms,每次数据采集有2组数据,以0.5ms间隔显示。
根据曲线分析图可以看出,转台实时控制效果较好,满足工程需要。
5 结论
转台实时控制动态链接库可以满足1ms的实时控制需求,达到了工程要求。
该动态链接库的开发实现了转台上位机软件的嵌入式开发,无需开发人员了解转台通信协议及底层实现细节,既方便了上位机开发人员同时也能很好的保护公司商业秘密。