none
关于wince中断处理的问题 RRS feed

  • 问题

  • 其他东西就不写出来了,大概说一下就是在中断处理中,我已经将一个物理中断号转化为系统中断号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状态吧。 请做过的朋友,斑竹来帮帮忙!感激
    2009年10月26日 2:12

答案


  • 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层的代码了

    2009年10月28日 14:38

全部回复

  • 为什么会都一推连在一起呢?奇怪了。 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资源。为什么无法实现呢? 请斑竹指点迷津啊!!!!!!!!!!!!!
    2009年10月26日 2:18
  • 就没有人回答吗?
    2009年10月27日 9:01
  • 从这个代码片断里,分析不出来原因吧.

    2009年10月27日 9:35
  • 您觉得还需要什么内容才能分析?这个也只是一个简单的中断处理驱动程序,关键处理部分就在这个thread行数上。 这个论坛竟然这么冷清,有点寒心啊!
    2009年10月28日 7:28
  • 我也觉得这个论坛比较不活跃,很少看见斑竹们回答问题啊................: (
    归正题:
    我觉得你的代码只能说明WaitForSingleObject没启作用,至于为什么没用,肯定应该在这段代码之外的地方找

    2009年10月28日 8:17

  • 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层的代码了

    2009年10月28日 14:38