积极答复者
关于wince中断处理的问题

问题
-
其他东西就不写出来了,大概说一下就是在中断处理中,我已经将一个物理中断号转化为系统中断号g_ButtonSysIntr,然后系统中断号g_ButtonSysIntr跟事件ISTEvent也关联了,然后在这个中断线程中处理 while (ISTEvent) { RETAILMSG(1, (TEXT("######WaitForSingleObject start!############.\r\n"))); WaitForSingleObject(Buttonintr->ISTEvent, INFINITE); …………中间省略 InterruptDone(g_ButtonSysIntr); RETAILMSG(1, (TEXT("********InterruptDone******.\r\n"))); } 通过WaitForSingleObject等待事件触发,事件触发后确实是有反应的,但问题是这个程序一直在while循环中执行,串口不停的打印上面两句RETAILMSG,按我的思路应该是在InterruptDone后就不会一直打印信息才对,重新回到WaitForSingleObject状态吧。 请做过的朋友,斑竹来帮帮忙!感激
答案
-
5IWINCE同学, CE本来就比较麻烦,有些东西不是简单的一句话可以说的清楚的吧,而且估计斑竹们也都很忙吧.
最近也老是要+班: ) 呵呵
根据你的描述我的看法如下:
1. 你的CPU占有率很高吗?你是不是将线程的优先级设置的太高了啊?我的项目应用程序和系统驱动里都是用了很多线程也很好啊
你可以的话可以发代码给我一起讨论一下,如果你方便: )
2. 整个思路是按你说描叙述的那样的,但你先前的代码我也没看到,所以不大好说.我在此留个大致的框架,你可以参考一下,和你是否有不同:
BOOL xxx::IsrThreadProc( void )
{
......................
// set the thread priority
CeSetThreadPriority(GetCurrentThread(), iPriority);
m_hevInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
if ( m_hevInterrupt == NULL)
{
goto leave;
}
.....................
xxx_IST xxxIst;
xxxIst.hevInterrupt = m_hevInterrupt;
......................
xxxIstLoop(&xxxIst);
leave:
return 0;
}
BOOL xxxIstLoop ( xxx_IST pxxxIst )
{
....................SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
wait_for_xxx_interrupt:
if (WaitForSingleObject(pxxxIst->hevInterrupt,INFINITE) == WAIT_OBJECT_0)
{
................InterruptDone(pxxxIst->dwSysIntr_xxx);
}goto wait_for_xxx_interrupt;
return TRUE;
}
3.如果按照以上的框加还不行,你就应该检查一下你的OAL层的代码了- 已标记为答案 warrentangModerator 2009年10月30日 3:18
全部回复
-
为什么会都一推连在一起呢?奇怪了。 while (Buttonintr->ISTEvent) { RETAILMSG(1, (TEXT("######WaitForSingleObject start!############.\r\n"))); WaitForSingleObject(Buttonintr->ISTEvent, INFINITE); …………中间省略………… InterruptDone(g_ButtonSysIntr); RETAILMSG(1, (TEXT("********InterruptDone******.\r\n"))); } 这个while循环一直在打印RETAILMSG的信息,只有就一直占用CPU资源了,我的思路应该是在InterruptDone后就挂起了,回到WaitForSingleObject状态,这样才不占用CPU资源。为什么无法实现呢? 请斑竹指点迷津啊!!!!!!!!!!!!!
-
5IWINCE同学, CE本来就比较麻烦,有些东西不是简单的一句话可以说的清楚的吧,而且估计斑竹们也都很忙吧.
最近也老是要+班: ) 呵呵
根据你的描述我的看法如下:
1. 你的CPU占有率很高吗?你是不是将线程的优先级设置的太高了啊?我的项目应用程序和系统驱动里都是用了很多线程也很好啊
你可以的话可以发代码给我一起讨论一下,如果你方便: )
2. 整个思路是按你说描叙述的那样的,但你先前的代码我也没看到,所以不大好说.我在此留个大致的框架,你可以参考一下,和你是否有不同:
BOOL xxx::IsrThreadProc( void )
{
......................
// set the thread priority
CeSetThreadPriority(GetCurrentThread(), iPriority);
m_hevInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);
if ( m_hevInterrupt == NULL)
{
goto leave;
}
.....................
xxx_IST xxxIst;
xxxIst.hevInterrupt = m_hevInterrupt;
......................
xxxIstLoop(&xxxIst);
leave:
return 0;
}
BOOL xxxIstLoop ( xxx_IST pxxxIst )
{
....................SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
wait_for_xxx_interrupt:
if (WaitForSingleObject(pxxxIst->hevInterrupt,INFINITE) == WAIT_OBJECT_0)
{
................InterruptDone(pxxxIst->dwSysIntr_xxx);
}goto wait_for_xxx_interrupt;
return TRUE;
}
3.如果按照以上的框加还不行,你就应该检查一下你的OAL层的代码了- 已标记为答案 warrentangModerator 2009年10月30日 3:18