Windows CE 5.0:驱动程序---中断
中断
发布日期: 11/9/2004 | 更新日期: 11/9/2004
大多数外围设备生成中断,以便从操作系统 (OS) 接收服务。可以使用中断的设备一些示例有 PC 卡、板上计时器、音频输入设备、键盘、触摸屏和指点设备。几乎任何类型的外围设备都可能使用中断作为启动 OS 的服务操作的主要方法。因为这些外围设备可能导致或通知中断,所以它们的设备驱动程序必须处理中断以便服务相应的设备。物理中断 (IRQ) 是硬件线路,设备可以通过它们向微处理器发送中断信号。逻辑中断 (SYSINTR) 是 OAL 指定的 IRQ 的映射。
注 某些外围设备不向微处理器生成中断。在这种情况下,外围设备的控制器处理中断。
中断处理包含两个部分:内核模式中断服务例程 (ISR) 和用户模式中断服务线程 (IST)。在某些 OS 中,ISR 是小而快速的汇编代码片段,但是在 Windows CE 中,内核处理寄存器的保存和还原,所以可以将 ISR 实现为小而快速的 C 代码。
ISR 必须完成服务中断所需的最少工作。为此,它按照显示的顺序执行该过程:
1. | 如果数据可能丢失或者被下一个中断改写,则 ISR 将数据从设备读取到缓冲区中。 |
2. | ISR 清除该设备上的中断条件。 |
3. | ISR 向内核返回一个 SYSINTR。 |
4. | 内核设置供 IST 等待的中断事件。 |
5. | 调度程序调度等待的 IST 以执行任何必须发生以完整处理该中断的可能冗长的操作。 |
设备驱动程序在加载时必须执行下列操作:
• | 注册它的 ISR。 驱动程序必须向内核注册它的 ISR,除非该驱动程序依赖常见的 OAL ISR 函数来处理它的中断。驱动程序必须向内核注册它的 ISR,以便内核在适当的物理中断发生时调用 ISR。 |
• | 在 OAL 的 OEMInit 函数中生成从 IRQ 到 SYSINTR 的映射。 - 或者 - 加载该驱动程序的总线驱动程序必须生成从 IRQ 到 SYSINTR 的映射(对于 PCI 总线驱动程序而言就是如此)。 |
如果该驱动程序不安装 ISR,则该设备生成的任何中断都由默认 ISR(它由 OAL 在 OEMInit 中安装)处理。
以下列表显示了驱动程序安装 ISR 和等待中断事件的一种方式:
1. | 驱动程序调用 LoadIntChainHandler 以安装 ISR。 |
2. | 默认 ISR(由 OAL 安装)首先执行以响应中断。 |
3. | OAL 调用 NKCallIntChain 以执行该驱动程序安装的 ISR。 |
4. | 驱动程序产生一个 IST,它会注册以接收中断事件通知。该 IST 在使用 hEvent 参数之前必须调用 InterruptInitialize,这会在 idInt 参数和 ISR 返回的 SYSINTR 值之间提供链接。 没有导出流接口的内置设备驱动程序必须在初始化期间找到方便的时间以注册它们的 ISR 并产生 IST。 |
5. | 驱动程序调用 WaitForSingleObject 函数以等待 ISR 生成的中断事件。 |
公开流接口的驱动程序通常在它们的 XXX_Init (Device Manager) 函数中执行这些活动,该函数由 Device Manager 调用。
另请参阅
Interrupt Handling Process Overview | Interrupt Notifications | Shared Interrupts | Nested Interrupts | Interrupt Masking | Interrupt Handler Registration | Interrupt Processing Sequence | Interrupt Handler Deregistration | Real-Time Priority System | Scheduling