中断同步对象

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,直到其中一个 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 接口支持以下方法:

IInterruptSync::CallSynchronizedRoutine

IInterruptSync::Connect

IInterruptSync::Disconnect

IInterruptSync::GetKInterrupt

IInterruptSync::RegisterServiceRoutine