阅读:2039回复:9
我的中断不能触发WaitForSingleObject?
我用下面的函数注册了一个中断处理函数:
pPortObj->dwSysInt = SYSINTR_PARPORT; pPortObj->hParportEvent = CreateEvent(NULL,FALSE,FALSE,NULL); InterruptInitialize(pPortObj->dwSysInt,pPortObj->hParportEvent,NULL,0); pPortObj->pDispatchThread = CreateThread(NULL,0,InterruptRoute,pPortObj,0,NULL); 我判断了这几个函数的返回值,调用都没错.IST函数是: static DWORD WINAPI InterruptRoute(PPortInformation pPortObj) { while (1){ RETAILMSG(1,(TEXT(\"InterruptRoute:waiting for interrupt\\r\\n\"))); WaitReturn = WaitForSingleObject(pPortObj->hParportEvent ,INFINITE); InterruptDisable(pPortObj->dwSysInt); …………………… InterruptDone(pPortObj->dwSysInt); } } 我在OEMInterruptHandler函数里添加了调试语句,当接受我的中断时,显示一个调试信息。 我的程序在调用InterruptInitialize时,调用了一次OEMInterruptHandler,并触发了一次WaitForSingleObject,InterruptRoute内部的循环执行了一次。后来处理器接收到第一个中断,触发了WaitForSingleObject一次。再后来的中断,OEMInterruptHandler里的调试信息都出现了,说明处理器已经接收到了,ISR已经执行了,但是就是不触发WaitForSingleObject。 |
|
论坛版主
|
沙发#
发布于:2005-05-31 11:05
ce是可抢占时间片轮转调度,调度策略为高优先级任务工作时低优先级任务得不到执行。如果有比你的ist优先级更高的任务始终就绪你的ist就永远不会执行,按你的说法isr工作了,返回sysintr后event肯定会被置为有效。
|
|
板凳#
发布于:2005-05-31 17:58
但是我没有运行其它程序啊,而且每次都是这样的情况.我还试了把线程的优先级设高一些,但是没有作用.
如果除去InterruptInitialize调用引起的一次触发,只有第一次的中断触发了WaitForSingleObject,以后的中断都没有触发WaitForSingleObject. |
|
地板#
发布于:2005-06-01 10:42
问题已经解决了,去掉InterruptDisable就可以了.
非常感谢wxl_50685330的热心帮助 |
|
论坛版主
|
地下室#
发布于:2005-06-01 13:32
你在后面不是用InterruptDone重新开放了中断吗?为什么搞清楚了?
|
|
5楼#
发布于:2005-06-02 16:48
是问题解决了,但我还没有搞清楚是怎么回事,照说后面用InterruptDone重新开放中断了.
等以后有时间再来仔细考虑这个问题.可能是在我的InterruptDisable函数里有什么操作,是的IST不能执行了. |
|
6楼#
发布于:2005-06-10 14:39
兄弟们好,我是这么理解的:
在执行InterruptDisable函数后,关掉了硬件的中断同时解除了(deregister)这个event与sysintr之间关联,因此,第二个中断产生时,WaitForSingleObject不会被触发。 |
|
|
7楼#
发布于:2005-06-11 01:54
我认同兄弟的说法,InterruptDisable和InterruptInitialize搭配的,所以不能用在IST的循环中不能调用InterruptDisable。
欢迎兄弟回来。呵呵 |
|
8楼#
发布于:2005-06-13 13:07
InterruptDisable将关闭中断处理,
如需再次处理中断需要重新调用InterruptInitialize |
|
论坛版主
|
9楼#
发布于:2005-06-13 18:03
啊呀,真的喔,我还以为interruptdisable就简单去设中断屏蔽位,搞了半天那还要搞那个名堂....
|
|