hothand
驱动牛犊
驱动牛犊
  • 注册日期2002-01-11
  • 最后登录2009-02-05
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1695回复:9

设备驱动程序与应用程序通信问题?(中断)

楼主#
更多 发布于:2002-06-03 11:41
设备驱动程序与应用程序通信问题?(中断)

工作流程。
1。PCI向外设FIFO写入数据-
2。外设读取数据,清空FIFO,产生中断
3。PCI驱动响应中断,通知应用程序传输数据
再返回到第一项

如果我的PCI设备产生了一个中断,我如何通知我的应用
程序呢?
我使用的是DriverStudio开发,用DriverWizard产生框架。

谢谢!
Hothand
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-03 12:55
这个问题前面有很多人问过

最简单的方式是在应用层创建事件(event),将事件句柄传给驱动,然后中断服务后,在dpc例程中讲事件设置为信号态。同时应用层另开一个线程监视这个事件,如果发生则表明中断发生

明白?
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-03 13:17
这很简单!
你现在应用层作WriteFile(...),向下就发送了一个IRP_MJ_WRITE的IRP包,驱动接受到后,就执行:
1。PCI向外设FIFO写入IRP所戴的数据;
2。外设读取数据,清空FIFO,产生中断
3。PCI驱动响应中断, 完成此IRP包;
然后:再作ReadFile(...)向下就发送了一个IRP_MJ_READ的IRP包,驱动接受到后,就执行:,
从设备中将数据读取;完成此IRP包;

好了,基本操作就完成了,当然具体实现还有许多工作呢!

hothand
驱动牛犊
驱动牛犊
  • 注册日期2002-01-11
  • 最后登录2009-02-05
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-03 14:52
中午刚刚问清楚PCI卡只是作数据收集的功能

即中断一来就将FIFo的数据读入计算机储存起来
不断的收集数据!

zydcat你说的线程和事件我没有用过,不太熟悉,颇有困难!

blue说的我不太清楚!关键是在中断中如何通知应用程序
让应用程序调用ReadFile(。。)的函数。

谢谢!
Hothand
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-06-03 17:31
一回生
二回熟,

很简单的。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
hothand
驱动牛犊
驱动牛犊
  • 注册日期2002-01-11
  • 最后登录2009-02-05
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-06-04 10:34
找到一个例子
有一个线程的部分
DWORD WINAPI ThreadProc(LPVOID junkola)
{ // ThreadProc
while(TRUE) {
WaitForSingleObject(hEvent, INFINITE);
puts(\"Event happened\");
Test_READ_DATA();
}
return 0;

}
里面的WaitForSingleObject主要完成什么功能呢?
这个程序怎么跳出while()的循环?
它是不是会不断地输出puts(\"Event happened\");和Test_READ_DATA()????

Hothand
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-06-04 10:46
用户被禁言,该主题自动屏蔽!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-06-04 11:04
 
找到一个例子
有一个线程的部分
DWORD WINAPI ThreadProc(LPVOID junkola)
{ // ThreadProc
while(TRUE) {
WaitForSingleObject(hEvent, INFINITE);
puts(\"Event happened\");
Test_READ_DATA();
}
return 0;

}
里面的WaitForSingleObject主要完成什么功能呢?
这个程序怎么跳出while()的循环?
它是不是会不断地输出puts(\"Event happened\");和Test_READ_DATA()????

当你的驱动将event置为信号态的后,WaitForSingleObject就会结束,返回正确值,这时你就知道中断发生了,可以读数据了。
while循环你自己可以设置条件退出。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
hothand
驱动牛犊
驱动牛犊
  • 注册日期2002-01-11
  • 最后登录2009-02-05
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-06-07 09:16
根据zydcat的说法

我们先在应用程序上实例化一个事件,开辟了一个线程监视事件的发生;同时在驱动程序中的中断服务程序中设置事件。

问题:1,事件设置后,需要清除吗?在什么地方清除?是不是set()一次,就产生一次事件?
     2,应用程序是否要在线程中,先屏蔽硬件中断,处理完成后再打开中断?
Hothand
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-06-07 09:42
问题:1,事件设置后,需要清除吗?在什么地方清除?是不是set()一次,就产生一次事件?
++++++++++++++++++++++
当然要清除事件,否则事件一直是信号态,一般在等待事件发生后立即清除事件。

2,应用程序是否要在线程中,先屏蔽硬件中断,处理完成后再打开中断?
++++++++++++++++++++++
不需要屏蔽中断,除非是你不想要中断发生
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
游客

返回顶部