转自:http://blog.csdn.net/guly699/archive/2009/10/19/4696722.aspx
先介绍一下WINCE常用的几个概念
1.IRQ(Interrupt ReQuest)、物理中断请求
2.SYSINTR、逻辑中断
3.ISR(Interrupt Service Routine)、中断服务例程
4.IST(Interrupt Service Thread)、中断服务线程
中断处理
一般中断处理流程:
1.一个中断发生时,微处理器跳转到系统的中断处理模块来处理;
2.中断处理模块禁止微处理器中的所有其他同优先级和较低优先级的中断,然后再调用适当的ISR来处理这一物理中断请求(IRQ);
3.以中断标识位的形式ISR向中断处理模块返回一个逻辑中断,而且通常屏蔽了板级设备驱动中断;
4.当前正在执行的中断一直被硬件所屏蔽,这样可以等待适当的信号的到来,触发IST事件执行。除此之外,中断处理程序重新打开所有微处理器的中断;
5.IST对应处理流程应该被提前设置好,按照流程向硬件提供服务,然后完成中断处理;
6.中断事件处理结束前IST调用interruptdone()函数,这个函数的作用是告诉操作系统对该中断的处理已经完成,不用再屏蔽此中断了。在系统内部,这个函数执行后,还会调用OAL中的oeminterrupdone()函数来宣告中断处理已经完成。
中断服务
中断服务主要有两部分:内核模式中断服务例程(ISR)和用户模式中断服务线程(IST)。在WINCE中,ISR负责寄存器的保护和恢复,所以用C代码就可以实现一个ISR。
一般ISR只要完成下面五项就足够了,不应该在ISR上实现太复杂,太多的功能;
1.在数据丢失或者被另一中断覆盖的情况下,ISR能把数据从设备读取到软件的缓冲区中;
2.ISR清除设备中的中断条件;
3.ISR向内核返回一个逻辑中断号SYSINTR;
4.内核设置一个中断事件来解除对ISR的响应IST的请求;
5.调度器调度响应的IST完成相应的中断处理。
中断屏蔽
中断屏蔽可以使某一个中断执行过程中的所有操作无效,这会导致操作系统对此中断信号将不予理睬。
嵌套中断处理
为了防止高优先级中断的失效和延迟,WIN CE 内核引入了嵌套中断的机制。
共享中断处理
WIN CE 处理共享中断的步骤:
1.在OEMInit中与ISR程序建立关系的一个中断必须调用NKCallIntChain()内核函数。这个函数用于检查已安装ISR的列表,并发出中断信号。
2.如果第一个ISR决定它的关联设备宣告了一个中断,那么它将执行必要的准备工作,处理结束后,这个ISR将为这个设备返回一个逻辑中断号。如果这个ISR没有决定下一步的操作,那么ISR将会返回SYSINTR_NOP。
3.如果ISR判断出它相关的设备没有宣告中断,它回到SYSINTR_CHAIN,将导致NKCallIntChain访问链中下一个ISR的发生,安装ISR的顺序是很重要的,因为它涉及到隐含优先权的问题。
中断处理过程分析
一个完整的中断处理大致需要一下8个步骤:
1.如果内核的捕获异常代码接收一个硬件中断,那么内核接着就会识别一个异常,并操作相应的硬件中断。否则,跳到第二步执行。
2.中断管理器通知ISR禁用当前指定的中断,直到这个中断处理完成后,再启用这个中断。不过在此过程中其它的中断仍然可用。
3.异常管理器调用ISR来决定如何处理这个中断。
4.内核接收ISR的返回值后,就会知道该中断在做什么。
返回值 描述
SYSINTR_NOP 内核不做任何响应
SYSINT_RESCHED 操作系统定时超时,内核重新调度IST
SYSINTR_XXX (逻辑中断号) 内核触发中断源ISR后,IST将被唤醒开始工作,接着IST创建一个事件等待中断信号到来。
5.当IST被唤醒后,它做中断处理要做的所有工作,如将数据移到一个缓冲区里或用一种可行的方法来解决此数据。
6.必要时,IST调用各种I/O函数访问硬件来完成对它的相关操作。
7.当IST完成中断处理工作时,它将调用InterruptDone()函数来通知内核。
8.内核调用OAL中的函数OEMInterruptDone()来宣告所有中断处理工作已经完成。OAL通知硬件重新打开该中断。
配置、注册、并撤销一个中断处理程序
当一个设备驱动程序加载时必须要遵循以下步骤执行相关的动作。
1.在内核中注册ISR
2.将物理中断映(IRQ)射为逻辑中断
中断服务例程
中断服务线程
中断通知