sunrain_hjb的BLOG
Develop Helpful and Effective apps to make Jobs easier and Better!

Windows Embedded CE 6.0的中断处理过程主要分为两部分:

  •  中断服务例程(ISR):处于内核中的低级处理程序,中断发生时首先被调用。
  • 中断服务线程(IST):处于驱动或者应用中的中断处理线程,由系统调度,完成大部分的中断处理工作。

ISR的实现在OALOEM适配层)中,它只处理最低级的中断响应,通常是获取IRQSYSINTR并设置MCU内部的中断控制寄存器。中断处理的主要部分在驱动或者应用的中断处理线程中。中断处理线程与其他普通线程一样,使用同一个线程优先级管理系统。ISRIST之间通过事件对象进行同步。IST中创建一个事件对象,并使用函数WaitForSingleObject()等待该事件被触发。ISR中通知内核触发相应的事件对象。Windows Embedded CE 6.0的中断处理的过程如下图所示。

                      Windows Embedded CE 6.0的中断处理过程

  在其他的一些嵌入式操作系统中,在介绍中断处理时经常会提到一个中断向量表的概念,如uC/OS。当中断发生时它会进入IRQ的处理程序,并根据IRQ的值跳转到事先分配好的中断向量表相应的中断处理函数中。但在WinCE中实际上并不存在中断向量表的概念,而只有一个异常向量表,对应于MCU的几种运行模式。WinCE的中断处理对应于两个异常IRQHandlerFIQHandler,通常我们使用的是IRQHandler。当外部中断产生时,系统执行IRQHandler(),IRQHandler()中调用OEMInterruptHandler()获取IRQ对应的SYSINTR,然后根据SYSINTR调用函数OEMNotifyIntrOccurs()触发与SYSINTR关联的事件,最后由IST完成主要的中断处理工作。这种中断处理机制在一定程度上影响了系统的实时性,但提高了IST的灵活性。有关WinCE系统实时性分析,将在另外一篇中描述。

     下面结合DEVICEEMULATORPWRBUTTON驱动进行分析。该驱动也是一个流驱动,所以可以用驱动调试助手进行动态加载和卸载,但需要对代码进行相应的修改,否则会出问题。

    首先看PBT_Init()函数,代码如下:

Code

      RESET ButtonISTPOWER ButtonIST基本一致,所以这里只分析POWER ButtonIST,代码如下。      

Code

    以上代码结构清晰,不再赘述。但这样编译出来的驱动是不能通过驱动调试助手动态加载的,必须进行相应的修改才行。主要原因是没有善始善终,分配的系统逻辑中断没有释放,系统逻辑中断与事件的关联也没有取消。实验现象是,能通过驱动调试助手加载卸载,但中断并不能正常工作了。下面介绍一下解决这个问题的办法。

  首先定义一个全局变量g_bThreadExit初始化为FALSE。IST修改后的代码如下:

Code

  PBT_Deinit()修改后的代码如下:

Code

  经过以上修改,该中断驱动程序就可以通过驱动调试助手动态加载和卸载,并能正常工作了。另外,在模拟器中由于没有外部中断按键,可以通过创建一个特定名称的事件与中断关联,并在另外一个应用或者驱动中设置该事件以模拟一个外部中断按键的触发,这种方法也可以在实际平台中根据需要使用。示例代码如下:

Code

  总的来说,WinCE中断处理过程结构清晰,方便开发人员灵活设计IST。在使用驱动调试助手调试有关中断的驱动程序时,需要善始善终,否则会出现中断不能正常工作的情况。

posted on 2009-05-26 23:35  sunrain_hjb  阅读(9738)  评论(5编辑  收藏  举报

Map