solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1685回复:8

大家看看 使用 vtoolsd 写 vxd 驱动数据采集卡的看法(8253定时启动AD,模数转换完毕发中断) 流程对不对

楼主#
更多 发布于:2002-01-23 07:51
首先使用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
我欲乘风而去
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-01-23 07:58
补充:
用作控制的程序 采用程序启动AD较好
信号处理的采用 8253定时启动 可以确保采样间隔一致
我欲乘风而去
zhouwei
驱动牛犊
驱动牛犊
  • 注册日期2001-10-23
  • 最后登录2005-07-13
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-01-24 10:37
太大尔化之了,有太多的细节没有考虑哟
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-01-24 14:54
控制字可以在Win32写也可以在VxD写。
你在OnSharewareInt 中写,应该是每次中断的时候你都写一次(有必要吗?除非象清除中断标志等);在OnW32DeviceIOcontrol中写,就是你在调用deviceiocontrol的时候才写,就是需要的时候在写了;而在OnSysytemInit中写,就是当静态的在用,每次开机时,就写了。
我说的对吗?
看你的需要来决定了。
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-01-24 15:05
 
我想在中断后触发Win32 程序中的采样线程,在里面读取数据;
 
 我采用8253定时启动AD是不是只需要在OnW32DeviceIOcontrol写一次

 
而在OnSysytemInit中写,就是当静态的在用,每次开机时,就写了。 这里有一问:我没加载 (createfile)怎么就写了?应该是等我动态加载了vxd?
 
我欲乘风而去
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2002-01-24 15:24
我的意思是说,你处理SYSTEM_INIT(可能有点错误)消息,那是只有静态VxD才处理的。动态VxD不需要的。你想在VxD动态加载的时候就写的话,应该响应sys_dynamic_init(大概的)消息。
你说的定时启动是说间隔一定的时间,还是开机后一段时间?
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-01-24 15:28
对不起,是我没讲清楚

1.我用的是 onSystemdynamicInit (不是 静态的那个)
2.AD转换启动 不是开机 而是 AD卡定时采集数据
我欲乘风而去
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-01-24 15:43
你好像用了中断的吧?
新数据来的时候,产生中断吗?不会来一个中断一次吧?
你应该有FIFO的,FIFO半满的时候应该有中断产生,在中断例程里面保存数据就可以了,或者让Win32来做也可以的。然后清中断,等下一个中断。还需要定时吗?
solarjl
驱动牛犊
驱动牛犊
  • 注册日期2001-12-26
  • 最后登录2002-01-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-01-24 16:06
I did not use FIFO。 Because没有搭电路,只用数采卡来采集数据,作实时信号处理

的确是来一次中断,读一个数

我不清中断,使用8253 作AD定时也可以吧
我欲乘风而去
游客

返回顶部