阅读:1684回复:8
大家看看 使用 vtoolsd 写 vxd 驱动数据采集卡的看法(8253定时启动AD,模数转换完毕发中断) 流程对不对
首先使用vtoolsd定义 几个相关类 以及共享中断号
然后在 win32程序中 : 使用CreateFile 打开 vxd 写一个 采样函数 (UINT MyThreadFunc ) 以及 将 触发运行该函数的线程的ring3层事件 (createvent) 通过微软未公布的函数 OpenVxdHandle 将这一ring3层事件转化成对应的ring0层事件句炳 再使用DeviceIoControl 把这个ring0的事件传给ring0层的 vxd ring0层中: ring0层将通过 OnW32DeviceIOControl 接受这一参数 (指的是 触发线程函数的句柄) 在vxd的 OnShareHaredwareInt中调用 VWin32_SetWin32Event(hWin32Eveent) 发送这一触发信号 回到win32程序中来: 通过CreateThread在朱线程创建一个工作线程,并运行采样函数 在采样函数中调用 ::WaitForSingleObject(MyEventHandle ,INFINITE); 等待AD转换结束产生的中断 如: MyThread() { for (;;) // 这个线程始终保持对这些信号的响应 { ::WaitForSingleleObjects(4,hEvents,FALSE,INFINITE)) } } 这样就可以 接受来自 ring0 的VWIN32_SETWIN32EVENT 调用 这时可以在 ring3层存储文件,显屏 现在,仍有的疑问是: 1.8253的控制字在 win32程序中写还是在vxd中写? 2.如果在 vxd中写 是不是 OnSysytemInit ,OnSharewareInt ,OnW32DeviceIOcontrol都要写 还是只需写一次 3.如在win32程序中写,又要写几次? 我看过一些代码,他们都写了好几次,我的看法是既然VC本身能对端口操作,只要程序开始运行时写一次就可以,我的理解对么?也即总共的8253控制字和通道选择只需写一次,以后只要在采样函数中(新开得线程)读不同时间的通道值即可 4.另一个问题: VWin32_SetWin32Event是怎样将ring0层事件句柄发送给::waitforsingleobject的 Thank you! solar2jlu.edu.cn slw_z@sina.com |
|
|
沙发#
发布于:2002-01-23 07:58
补充:
用作控制的程序 采用程序启动AD较好 信号处理的采用 8253定时启动 可以确保采样间隔一致 |
|
|
板凳#
发布于:2002-01-24 10:37
太大尔化之了,有太多的细节没有考虑哟
|
|
地板#
发布于:2002-01-24 14:54
控制字可以在Win32写也可以在VxD写。
你在OnSharewareInt 中写,应该是每次中断的时候你都写一次(有必要吗?除非象清除中断标志等);在OnW32DeviceIOcontrol中写,就是你在调用deviceiocontrol的时候才写,就是需要的时候在写了;而在OnSysytemInit中写,就是当静态的在用,每次开机时,就写了。 我说的对吗? 看你的需要来决定了。 |
|
地下室#
发布于:2002-01-24 15:05
我想在中断后触发Win32 程序中的采样线程,在里面读取数据; 我采用8253定时启动AD是不是只需要在OnW32DeviceIOcontrol写一次 而在OnSysytemInit中写,就是当静态的在用,每次开机时,就写了。 这里有一问:我没加载 (createfile)怎么就写了?应该是等我动态加载了vxd? |
|
|
5楼#
发布于:2002-01-24 15:24
我的意思是说,你处理SYSTEM_INIT(可能有点错误)消息,那是只有静态VxD才处理的。动态VxD不需要的。你想在VxD动态加载的时候就写的话,应该响应sys_dynamic_init(大概的)消息。
你说的定时启动是说间隔一定的时间,还是开机后一段时间? |
|
6楼#
发布于:2002-01-24 15:28
对不起,是我没讲清楚
1.我用的是 onSystemdynamicInit (不是 静态的那个) 2.AD转换启动 不是开机 而是 AD卡定时采集数据 |
|
|
7楼#
发布于:2002-01-24 15:43
你好像用了中断的吧?
新数据来的时候,产生中断吗?不会来一个中断一次吧? 你应该有FIFO的,FIFO半满的时候应该有中断产生,在中断例程里面保存数据就可以了,或者让Win32来做也可以的。然后清中断,等下一个中断。还需要定时吗? |
|
8楼#
发布于:2002-01-24 16:06
I did not use FIFO。 Because没有搭电路,只用数采卡来采集数据,作实时信号处理
的确是来一次中断,读一个数 我不清中断,使用8253 作AD定时也可以吧 |
|
|