Win9x下实时中断VXD及其与Win32应用程序间通讯的实现_第1页
Win9x下实时中断VXD及其与Win32应用程序间通讯的实现_第2页
Win9x下实时中断VXD及其与Win32应用程序间通讯的实现_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、win9x 下实时中断 vxd 及其与 win32 应用程序间通讯的实现毛建东1 , 高宗海2 , 李大成2(11 西北第二民族学院 电子与信息工程系 , 宁夏 银川 750021 ; 21 西安理工大学 机械与精密仪器工程学院 , 陕西 西安 710048)摘 要 :介绍了通过获取实时钟来实现实时中断的技术 ,实时硬件中断虚拟设备驱动程序 (vxd) 的实现 ,以及利用事件实现 vxd 与win32 应用程序间的通讯 ,并将两者相结合来实现高速数据采集 。关键词 :vxd ; 实时中断 ; win32 应用程序 ; 事件 ; 多线程中图分类号 : tn91912 文献标识码 : a 文章编号

2、 : 100327241 (2004) 0720036203vxd of re al - ti m e i n t u r r u p t a n d it s ap p lic a ti o nu n d e r t h e o s wi n 9xmao jian - dong , gao zong - ha i , l i da - cheng(1. department of electronic & information engineeriny. the second northwest oniversity for minorities , yinchuan 750021

3、,china ;2. school of mechanical & instrumental engineering , xian university of technology , xian , 710048 ,china)abstract :the method of acquiring real - time clock used for real - time interrupt is described. the use of vxd of real - time hardware interrupt and the event - driven method for co

4、mmunication between the virtual device driver and win32 are discussed with the application to high speed data acquisition system.key words :vxd ; real - time interrupt ; win32 application ; event ; multiple threads1 引言随着计算机技术的飞速发展 , windows 9x 凭借其出色的多 任务 、图形用户接口 ( gui) 、性能优越的硬件兼容性及卓越的 32 位软件环境等性能已经越

5、来越成为工业控制中实时控制的优秀 平台 。 本文将讨论实时中断中通过获取计算机实时钟来实现 中断的技术 ,以及利用事件实现虚拟设备驱动程序与应用程序 之间的通讯 ,并且将二者相结合来实现高速数据采集 。应用程序发送一条 wm timer 消息 ,然而 , wm timer 消息并不是异步的 ,并且被放在常规消息队列中 ,易造成实时处理消息的不稳定性 , 因此这种方法只适合实时性要求不高的场合 ; (2) 利用 windows 多媒体定时器 ,通过设置回调函数可获得 1ms 的高精度定时 ,但对于更高的定时显得无能为力 ; (3) 通过修改 主板的 cmos 实时钟的状态寄存器的内容来获得高达

6、8khz 的 中断频率 ,然后截获实时钟中断 ( irq8) 来为定时采样提供中断 频率 。利用基于 win9x 操作系统的虚拟设备驱动程序 vxd 来实现 win9x 下实时中 断 的 驱 动 程 序 的 编 写 , 将 其 嵌 入 win9x 的 ring0 层 ,利用 其 直 接 实 现 对 硬 件 i/ o 端 口 、中 断 等 的 操 作 。位 于 win9x 的 ring3 层的应用程序与 vxd 通讯主要有三种方式 。(1) 在应用程序中采用查询 vxd 与应用程序的公共变量的的方法 来了解 vxd 是否有数据 , 此法简单 , 但速度较慢2 ; ( 2) 采用从 vxd 中向应

7、用程序发送消息的方法 ,但在消息发送频率太高的实 时 钟 的 获 得 及 利 用 事 件 实 现 vxd2与应用程序通讯实时中断控制中 , 实时钟的获得非常重要1。( 1) 在 win2dows 中 ,可以通过调用 settimer 函数为应用程序分配一个计时器 。当指定了时间间隔以后 ,windows 系统将每隔指定的时间向利用事件实现 vxd 向应用程序发送控制消息和数据 ,此方法效率较高 ,实用于高频采样且不会发生数据丢失 ,但编程较复杂 。 本文采用修改 cmos 状态寄存器并截获实时钟中断来提供 采样频率 ,并利用事件实现 vxd 与应用程序通讯的方法 。实际 中利用了 win32

8、应用程序的多线程特点和线程间通信的事件机 制 。win32 应用程序设置两个线程并定义一个事件 ,主线程负 责动态加载/ 卸载 vxd 和与 vxd 通信 ,辅助线程通过 reset event 函数和 waitforsingleobject/ waitforsingleobject ex 函数 暂 时 挂 起 , vxd 可 以 通 过 vwin32. vxd 提 供 的 win32 事 件 服 务 中 的- vwin32- setwin32 event 服务 唤 醒 辅 助 线 程 , 从 而 间 接 实 现 vxd 回调 win32 应 用 程 序 。由 于 vxd 和 应 用 程 序

9、分 别 使 用 的 是 ring0 层和 ring3 层的事件句柄 ,所以需要在应用程序中使用未公 开的 api 函数 openvxdhandle 将应用程序事件句柄转化为 vxd句柄 ,然后将此句柄传递给 vxd 使用 。其中 , readregister ( b yte reg) 和 writeregister ( b yte reg ,b yte value) 函数源程序与 vtoolsd 2. 03 中的 chime 实例程序 相同 ,不再赘述 。3 . 2利用 vwin32 . vxd 中的 vwin32 setwin32 event函数唤醒暂时被挂起的线程这设在 vxd 中的异步事

10、件类的 handler 函数中3 。可以在 采集了若干个数据以后再调用 vwin32 setwin32 event () ,唤醒辅助线程 。void timerevent : : handler ( vmhandl e hvm , cl ient struct 3 pregs ,pvoid refdata) if (vxdevent ! = null)/ / 省略号处可以根据不同需要添加数据采集的程序语句if (count = = 32) / / 当采集了若干个数据后唤醒辅助线程 vwin32 setwin32 event (vxdevent) ;vxd 虚拟设备驱动程序的关键部分的3coun

11、t = 0 ;3 . 3在 vxd 中将所采数据的指针地址传回应用程序dword timerdevice : : onw32device iocontrol ( pioctlparamspdiocparams) switch (pdiocparams - > dioc ioctlcode)实现首先定义 : # define enabl e- interrupt 0x40handl e vxdevent ; / / 接收来自于 ring3 层的事件句柄b yte savedstatrega , savedstatregb ; / / 用 于 保 存 cmos 状 态 寄存器 a ,b 的值

12、b yte intfreq ; / / 设置中断频率int count = 0 ;3 . 1修改 cmos 状态寄存器的值 , 设置中断频率 , 在vxd 动态加载时实现bool timerdevice : :onsysdynamicdevice init() b yte statreg ; case 111 : / / 接收事件句柄并将 ring0 层的指向采样数据的指针的地址返回vxdevent = 3 ( ( handl e 3 ) pdiocparams - > dioc inbuf) ;3 ( ( dword 3 ) pdiocparams - > dioc outbuf

13、 ) = ( dword) ( ( pvoid) buf) ;break ;return 0 ;savedstatrega = readregister ( statreg态寄存器以便退出时恢复现场a) ; / / 保存 rtc 状savedstatregb = readregister( statregb) ;intfreq = 5 ; / / 设置中断频率 3 - - 8192hz ,4 - - 4096hz ,5- - 2048hz ,6 - - 1024hz1statreg = ( savedstatrega & (0x0f) ) | (intfreq & 0x0f)

14、; writeregister ( statreg a ,statreg) ;4 应用程序中关键部分的实现应用程序采用 c + + bulider 6. 0 编写 ,主要是因为界面设计 简单 ,实现多线程容易 。4 . 1 在主线程中 ,利用未公开的 win32api 函数 open2vxdhandle 将应用程序句柄转化为 vxd 句柄 ,并负责动 态加载/ 卸载 vxd 和 通 过 device iocontrol 函 数 与 vxd 通信首先定义 :dword 3 pring0data ; / / 指向 vxd 中采样数据的statreg = readregister ( statreg

15、 b) ; / / 设置 rtc 状态寄存器声明中断statreg| = enabl e interrupt ;writeregister ( statreg b ,statreg) ;readregister ( statreg c) ;hinstance kernel32 ; / / 定义指向 kernel32. dll 的指针handl e vxdevent , h1 ; / / ring0 的事件句柄和 ring3 的事件timercallback1 - > resume () ; / / 辅助线程开始工作辅 助 线 程 通 过 reset event 函 数 和 waitfor

16、sin24 . 2句柄gleobject/ waitforsingleobject ex 函数暂时挂起首先在 c + + builder6. 0 中创建一个类名为 ttimercallback 的 新线程 。class ttimercallback : public tthread protected : void fastcall execute () ;handl e handle1 ;pvoid p event ; / / 用于指向 vxdeventdword 3 pdata = new dword ; / / 用于获取 ring0 层数据指 针的地址dword cb ; / / vxd

17、 中实际返回的字节数/ / 以下为主线程的主要部分h1 = create event (0 ,false ,false ,null) ; / / 创建一个事件对象ttimercallback 3 timercallback1 = new ttimercallback ( true) ;/ / 定义辅助线程对象handl e (winapi 3 popenvxdhandle) ( handl e) = 0 ;/ / 定 义转换事件句柄的 api 函数kernel32 = loadlibrary(”kernel32. dll”) ; / / 装入 kernel32. dllif ( kernel3

18、2 ! = 0) popenvxdhandle = ( handl e( winapi 3 ) ( handl e) ) getp2 rocaddress ( kernel32 ,”openvxdhandle”) ; / / 获 取 openvxdhandle 函数的入口地址vxdevent = ( handl e(winapi 3 ) ( handl e) ) popenvxdhan2dle ( h1) ; / / 将应用层句柄转/ / 化为 vxd 句柄freelibrary ( kernel32) ;public : fastcall ttimercallback( bool creat

19、esuspended) ;/ / 其他自定义的成员函数 ;其次在成员函数 execute ( ) 中通过 reset event 函数和 wait2forsingleobject/ waitforsingleobject ex 函 数 暂 时 挂 起 辅 助 线 程 ,vxd 可 以 通 过 vwin32. vxd 提 供 的 win32 事 件 服 务 中 的vwin32 setwin32 event 服务唤醒辅助线程 。void fastcall ttimercallback : : execute () while ( ! terminated) reset event ( h1) ;w

20、aitforsingleobject ( h1 , infinite ) ; / / 等 待 vxd 中 的- vwin32- setwin32 event 唤醒memcpy (pring3data ,pring0data , sizeof (dword) ) ;/ / 获 得 数 据 后可以进行其他处理及显示/ / 其他语句5 结束语本文介绍的技术在实际中对 pcl813 数据采集卡编写了虚 拟设备驱动程序和应用程序 ,并应用于水力学中水锤试验的高 速数据采集 ,效果良好 ,具有实际的参考价值 。handle1 = createfile ( ” . timer. vxd”, 0 , 0 , 0 , 0 , fil eflag del ete on close ,0) ; / / 加载 vxdif ( h

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论