none
关于何宗键老师有关《wince嵌入式系统》中的中断部分的困惑?请何宗键老师帮忙指点一下 RRS feed

  • 问题

  •  

    在您的书中说IST中通常会用WaitForSingleObject()对之前创建的事件进行等待,当中断产生时,WaitForSingleObject()就会返回,IST就可以在处理中断,我也查了一下DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds );好像它会悬挂当前的线程,直到对其中参数hHandle给出信号,它才会执行线程后续的语句。这样就有两个问题:

    第一:您书中注明的WaitForSingleObject()有返回是不是其中参数hHandle有信号时才产生返回值?

    第二:如果是的话,中断产生时就应该对hHandle产生信号(用SetEvent(hHandle)?)但是ISR(即OEMInterrupEnable)中相关的代码主要是返回相关的逻辑中断号,也没有对hHandle产生信号的代码?那到底在中断发生时是哪里对相关的hHandle产生信号让原本悬挂的IST继续后面的代码呢?

     

    有点困惑,请您多指教。

     

    2008年8月9日 17:53

答案

  • 偶看得第一本Wince的书也是何老师的《Windows CE嵌入式系统》,首先感谢何老师为广大Wince的入门者提供一本如此优秀的教材。(何宗键是偶的偶像)。

    第一:
    首先,要明白hHandle是一个Object,
    WaitForSingleObject()用于线程之间的通信,载体就是Object(Event、Mutex等)。
    为了方便理解,你可以把中断也看作一个线程。中断与IST两个线程通过Object(仅仅是Event,且只能用WaitForSingleObject)进行通信(单向的,中断--->IST)。

    第二:
    在实际使用中,可以用InterruptInitialize()来把逻辑中断号和Event关联起来,这样,系统发现逻辑中断号时,就会产生对应的Event。这应该是在内核中完成的。

    不知道这样能不能回答你的问题。
    2008年8月11日 2:26
  • 创建Event时可以指定它是否需要手动复位,(看CreateEvent的第2个参数),如果指定为TRUE,那么当EVENT变为signaled状态后需要用户调用ResetEvent来使它变为Nosignaled;如果指定为FALSE的话,当EVENT变为signaled状态后,系统会自动复位这个 EVENT的。用户调用InterruptDone的目的是通知系统去调用OEMInterruptDone,重新开启中断功能。
    2008年8月11日 6:16

全部回复

  • 偶看得第一本Wince的书也是何老师的《Windows CE嵌入式系统》,首先感谢何老师为广大Wince的入门者提供一本如此优秀的教材。(何宗键是偶的偶像)。

    第一:
    首先,要明白hHandle是一个Object,
    WaitForSingleObject()用于线程之间的通信,载体就是Object(Event、Mutex等)。
    为了方便理解,你可以把中断也看作一个线程。中断与IST两个线程通过Object(仅仅是Event,且只能用WaitForSingleObject)进行通信(单向的,中断--->IST)。

    第二:
    在实际使用中,可以用InterruptInitialize()来把逻辑中断号和Event关联起来,这样,系统发现逻辑中断号时,就会产生对应的Event。这应该是在内核中完成的。

    不知道这样能不能回答你的问题。
    2008年8月11日 2:26
  •  

    呵呵,首先谢谢wang wei的耐心解答,第二个解答就是我想求证的,因为看不到WINCE的源码,所以开始查了查MSDN的InterruptInitialize()里面有说“Event to be signaled when the interrupt is triggered”也猜了是不是内核中完成了相关的给信号操作,还是不放心就是想证实一下,现在OK了,还是想细问问,当第一次中断产生后,通过ISR到IST,在IST中最后通过InterruptDone()来完成一次中断处理,由于中断产生时已经使得WaitForSingleObject()中的Event有信号了,那在下一次的中断再次产生前会不会内核还要清除Event的信号呢?是通过InterruptDone()时内核完成的吗?

    2008年8月11日 3:38
  • 创建Event时可以指定它是否需要手动复位,(看CreateEvent的第2个参数),如果指定为TRUE,那么当EVENT变为signaled状态后需要用户调用ResetEvent来使它变为Nosignaled;如果指定为FALSE的话,当EVENT变为signaled状态后,系统会自动复位这个 EVENT的。用户调用InterruptDone的目的是通知系统去调用OEMInterruptDone,重新开启中断功能。
    2008年8月11日 6:16
  •  

    谢谢张强老师
    2008年8月12日 6:51