xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
阅读:2039回复:9

我的中断不能触发WaitForSingleObject?

楼主#
更多 发布于:2005-05-30 18:06
我用下面的函数注册了一个中断处理函数:
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。
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-31 11:05
ce是可抢占时间片轮转调度,调度策略为高优先级任务工作时低优先级任务得不到执行。如果有比你的ist优先级更高的任务始终就绪你的ist就永远不会执行,按你的说法isr工作了,返回sysintr后event肯定会被置为有效。
根据地的兄弟们,团结就是力量
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-31 17:58
但是我没有运行其它程序啊,而且每次都是这样的情况.我还试了把线程的优先级设高一些,但是没有作用.

如果除去InterruptInitialize调用引起的一次触发,只有第一次的中断触发了WaitForSingleObject,以后的中断都没有触发WaitForSingleObject.
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-01 10:42
问题已经解决了,去掉InterruptDisable就可以了.
非常感谢wxl_50685330的热心帮助
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-01 13:32
你在后面不是用InterruptDone重新开放了中断吗?为什么搞清楚了?
根据地的兄弟们,团结就是力量
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-02 16:48
是问题解决了,但我还没有搞清楚是怎么回事,照说后面用InterruptDone重新开放中断了.
等以后有时间再来仔细考虑这个问题.可能是在我的InterruptDisable函数里有什么操作,是的IST不能执行了.
wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-10 14:39
兄弟们好,我是这么理解的:
在执行InterruptDisable函数后,关掉了硬件的中断同时解除了(deregister)这个event与sysintr之间关联,因此,第二个中断产生时,WaitForSingleObject不会被触发。
Come on, let us drive the world.
xzffff
驱动小牛
驱动小牛
  • 注册日期2003-07-06
  • 最后登录2012-09-20
  • 粉丝0
  • 关注0
  • 积分377分
  • 威望41点
  • 贡献值0点
  • 好评度34点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-11 01:54
我认同兄弟的说法,InterruptDisable和InterruptInitialize搭配的,所以不能用在IST的循环中不能调用InterruptDisable。

欢迎兄弟回来。呵呵
ssddn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-06
  • 最后登录2010-04-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-06-13 13:07
InterruptDisable将关闭中断处理,
如需再次处理中断需要重新调用InterruptInitialize
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-13 18:03
啊呀,真的喔,我还以为interruptdisable就简单去设中断屏蔽位,搞了半天那还要搞那个名堂....
根据地的兄弟们,团结就是力量
游客

返回顶部