PortCls 系统驱动程序实现 IInterruptSync 接口,以实现微型端口驱动程序的优势。 IInterruptSync 表示中断同步对象,该对象将中断服务例程(ISR)列表的执行与非中断例程同步。
中断同步对象提供两个关键功能:
执行 ISR 列表以响应中断。 同步对象连接到中断源。 每次中断发生时,同步对象都会按照所选模式按指定顺序执行 ISR。 (请参阅以下三种模式的说明。
执行非 ISR 的例程。 这些非中断例程未连接到同步对象的中断。 相反,非中断程序在调用方选择的时间运行。 但是,同步对象使用对象的 ISR 列表同步执行非中断例程。 换句话说,非中断例程在同步对象列表中的任一 ISR 开始执行之前运行完成,反之亦然。
中断同步对象在处理多个 ISR 时很灵活。 ISR 位于同步对象在中断时遍历的链接列表中。 当微型端口驱动程序向同步对象注册 ISR 时,它指定是否应将 ISR 添加到此列表的开头或末尾。
微型端口驱动程序调用 PcNewInterruptSync 函数以创建中断同步对象。 在此调用期间,驱动程序指定对象在中断时遍历其 ISR 列表的方式。 该调用支持下表中由 INTERRUPTSYNCMODE 枚举常量指定的三个选项。
| 恒定 | 含义 |
|---|---|
InterruptSyncModeNormal |
调用列表中的每个 ISR,直到其中一个 ISR 返回STATUS_SUCCESS。 |
InterruptSyncModeAll |
不论之前 ISR 的返回代码如何,都只调用列表中的每个 ISR 一次。 |
InterruptSyncModeRepeat |
遍历整个 ISR 列表,直到在一次完整遍历中,列表中没有任何 ISR 返回 STATUS_SUCCESS。 |
在 InterruptSyncModeNormal 模式下,同步对象调用列表中的每个 ISR,直到其中一个返回STATUS_SUCCESS。 在该列表中,此 ISR 之后的任何 ISR 都不会被调用。 此模式模拟操作系统通常处理 ISR 的方式。 如果 ISR 未返回STATUS_SUCCESS,则行为与 InterruptSyncModeAll 相同。
在 InterruptSyncModeAll 模式下,无论上述 ISR 的返回代码如何,列表中的每个 ISR 都完全调用一次。 这适用于更多基元硬件,其中中断源不是确定性的,尽管在其他情况下也很有用。 例如,在每次中断时,两个中断源可能会紧密同步,而不管特定中断来自哪两个源。
在 InterruptSyncModeRepeat 模式下,同步对象重复遍历整个 ISR 列表,直到列表的行程发生时,列表中没有例程返回STATUS_SUCCESS。 此模式适用于多个源的中断可能同时在同一中断线上触发的情况,或者在 ISR 处理期间可能会触发第二个中断。 每个中断源都必须能够确定它是否需要处理。 如果始终返回STATUS_SUCCESS的 ISR 在此模式下与同步对象一起注册,系统将停止响应。
在任何一种模式下,如果任一已注册的 ISR 返回STATUS_SUCCESS,同步对象将向操作系统确认中断。 在所有三种模式下,如果所有中断源都指示它们未成功处理中断,则同步对象将向作系统返回不成功的结果代码。
IInterruptSync 接口支持以下方法: