驱动中等待多个事件的问题

wyy123   2009-4-8 10:06 楼主
各位好~
有个问题想跟大家讨论下:
在CE下,驱动中能否使用WaitForMultipleObjects来等待多个中断事件?

前些天记得有个帖子说过,驱动中不能用WaitForMultipleObjects来等待多个事件,实际上我也试了下,没有成功,情况是这样的:
1.用两个IRQ中断申请了两个系统中断,用KernelIoControl;
2.创建两个事件,用InterruptInitialize;
3.创建线程,并在线程中使用WaitForMultipleObjects等待第二步中创建的事件;

结果是,线程启动的时候,由于没有等待的时间发生,线程阻塞,但是当第一次触发事件(外部中断产生)时,WaitForMultipleObjects就一直返回WAIT_FAILED

难道在中断中不能使用WaitForMultipleObjects来等待多个中断么?能说说理由么?WaitForMultipleObjects应该是OS提供的API,况且驱动是加载到Device进程中在用户空间运行的啊,为什么不行呢?还是用法有误?请各位分析~

拜~

回复评论 (14)

1. Driver 中要用 WaitForMultipleObjects 去等非中斷事件是沒有限制的.

2. 但 IST 中的 InterruptInitialize 所使用的 Event, 是只能使用 WaitForSingleObject, 你可參考 http://msdn.microsoft.com/en-us/library/ms885677.aspx 中有一句
"The hEvent parameter can only be used in a WaitForSingleObject call to wait for the event to be triggered by the kernel."

所以這是 WindowsCE 的限制

Paul, Chao @ Techware
点赞  2009-4-8 10:13
用法不正确。看看别人驱动里面怎么用的就行了。
点赞  2009-4-8 10:18
引用: 引用 1 楼 paul_chao 的回复:
1. Driver 中要用 WaitForMultipleObjects 去等非中斷事件是沒有限制的.

2. 但 IST 中的 InterruptInitialize 所使用的 Event, 是只能使用 WaitForSingleObject, 你可參考 http://msdn.microsoft.com/en-us/library/ms885677.aspx 中有一句
"The hEvent parameter can only be used in a WaitForSingleObject call to wait for the event to be triggered by the kernel."

所以這是 WindowsCE 的限制

Paul, Chao @…


补充Paul, Chao 老牛。

这个东西我后来才明白,Paul, Chao 牛人说的很对。

WaitForMultipleObjects 可以用来等待几个事件,任何一个事件都可以触发它

楼主你看看背光驱动就用到这个WaitForMultipleObjects 了。
通常在不同的驱动中使用setevent来和WaitForMultipleObjects 合作
点赞  2009-4-8 10:18
引用: 引用 3 楼 gooogleman 的回复:
引用 1 楼 paul_chao 的回复:
1. Driver 中要用 WaitForMultipleObjects 去等非中斷事件是沒有限制的.

2. 但 IST 中的 InterruptInitialize 所使用的 Event, 是只能使用 WaitForSingleObject, 你可參考 http://msdn.microsoft.com/en-us/library/ms885677.aspx 中有一句
"The hEvent parameter can only be used in a WaitForSingleObject call to wait for the event to be triggered by the kernel."


所以這是 Wind…


我认为第二条相当关键, 学习了。实际上 WinCE 把多个物理中断关联到同一个IST中采用了另一套机制。
点赞  2009-4-8 10:23
引用: 引用 1 楼 paul_chao 的回复:
1. Driver 中要用 WaitForMultipleObjects 去等非中斷事件是沒有限制的.

2. 但 IST 中的 InterruptInitialize 所使用的 Event, 是只能使用 WaitForSingleObject, 你可參考 http://msdn.microsoft.com/en-us/library/ms885677.aspx 中有一句
"The hEvent parameter can only be used in a WaitForSingleObject call to wait for the event to be triggered by the kernel."

所以這是 WindowsCE 的限制

Paul, Chao @ Tec…

拜~
Paul老大,一针见血,再拜~呵呵

我也是看背光驱动里有用才用的;不过背光驱动力的事件不是用InterruptInitialize 关联的;

这下明白了,官方有说法的;呵呵~

点赞  2009-4-8 10:26
其实楼主可以多个中断绑定同一个线程啊。比如触摸屏驱动,就是AD中断和定时器中断绑定在一个线程的。
点赞  2009-4-8 10:28
引用: 引用 6 楼 gooogleman 的回复:
其实楼主可以多个中断绑定同一个线程啊。比如触摸屏驱动,就是AD中断和定时器中断绑定在一个线程的。

请赐教,具体说说是怎么等待事件的?
点赞  2009-4-8 10:30
引用: 引用 6 楼 gooogleman 的回复:
其实楼主可以多个中断绑定同一个线程啊。比如触摸屏驱动,就是AD中断和定时器中断绑定在一个线程的。

通过CreateEvent的第四个参数吧?
点赞  2009-4-8 13:22
mark、学习下。
点赞  2009-4-8 13:28
guanzhu
点赞  2009-4-8 16:29
貌似可以使用它来等待多个事件,但其中任何一个就可以触发唤醒吧。
点赞  2009-4-8 16:33
等待事件?

——你的背光驱动没有吗?我就照着背光驱动就可以了。

至于多个中断绑定同一个线程,你看看2440触摸屏驱动(线程初始化在微软代码下面,你找来看看就什么都明白了,看书中,就不帖代码了。)
点赞  2009-4-8 16:35
2. 但 IST 中的 InterruptInitialize 所使用的 Event, 是只能使用 WaitForSingleObject, 你可參考 http://msdn.microsoft.com/en-us/library/ms885677.aspx 中有一句
"The hEvent parameter can only be used in a WaitForSingleObject call to wait for the event to be triggered by the kernel."

经典.....

至于多个中断绑定同一个线程,你看看2440触摸屏驱动(线程初始化在微软代码下面,你找来看看就什么都明白了,看书中,就不帖代码了。)
没有代码,应该就是用同一个事件,但是seteventdata的参数不一样.
点赞  2009-4-8 18:03
MARK
点赞  2009-7-27 16:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复