從SPB連線的周邊裝置中斷
不同於PCI之類的 總線,簡單的周邊總線 (SPB) ,例如I2C或 SPI,不提供標準化的總線特定方法,將周邊裝置的中斷要求傳達至處理器。 相反地,SPB 連接的周邊裝置會透過位於SPB和SPB控制器外部的不同硬體路徑發出中斷訊號。 此中斷路徑的詳細數據通常會因一個硬體平臺而異,但 Windows 會從 SPB 連線周邊裝置的驅動程式隱藏這些詳細數據,讓驅動程式能夠跨各種硬體平台運作。
一般而言,SPB 連線周邊裝置的中斷要求行會連接到一般用途 I/O (GPIO) 控制器上的針腳,而 GPIO 控制器會將中斷從裝置轉接至處理器。 如需詳細資訊,請參閱 GPIO 中斷。
周邊設備驅動器會取得此 GPIO 中斷作為抽象 Windows 中斷資源, (CmResourceTypeInterrupt) ,並將中斷連接到驅動程式的中斷服務例程, (ISR) 。 中斷資源抽象概念會隱藏驅動程式中斷的平臺特定詳細數據。 例如,驅動程式可以忽略詳細數據,例如是否從 GPIO 針腳或從其他來源接收中斷。 為了維持這個抽象概念,核心的插斷陷阱處理程式在 DIRQL 上執行,可能需要清除或暫時遮罩 GPIO 針腳上的中斷,以無回應作用中的中斷要求。 GPIO 控制器的硬體緩存器通常是記憶體對應,而且可以在 DIRQL 存取。
相反地,SPB 連接的周邊裝置並未對應記憶體,而且此裝置的ISR通常必須在 IRQL = PASSIVE_LEVEL執行。 若要存取裝置中的硬體緩存器,ISR 會傳送 I/O 要求,以透過 SPB 執行序列傳輸。 這類傳送速率相對緩慢,無法在在 DIRQL 執行的 ISR 中執行。 不過,被動層級 ISR 可以同步傳送 I/O 要求,然後封鎖直到要求完成為止。
針對邊緣觸發的中斷,核心的陷阱處理程式會自動清除 GPIO 針腳上的中斷要求,然後排程裝置的 ISR 在被動層級執行。 陷阱處理程式必須清除中斷,以防止在陷阱處理程式傳回之後再次發生相同的中斷。
針對層級觸發的中斷,核心的插斷陷阱處理程式會自動遮罩 GPIO 針腳上的中斷要求,然後排程裝置的 ISR 在被動層級執行。 ISR 必須清除來自裝置的中斷要求。 在ISR傳回之後,核心會取消遮罩 GPIO 針腳上的中斷要求。
裝置的被動層級ISR應該只執行中斷的初始服務,然後返回以避免延遲其他裝置的被動層級ISR。 一般而言,驅動程式應該延遲中斷背景工作線程的額外中斷相關處理,其優先順序低於ISR。
從 Windows 8 開始,使用者模式驅動程式架構 (UMDF) 支援 UMDF 驅動程式的 ISR。 SPB 周邊裝置的 UMDF 驅動程式會呼叫 IWDFDevice3::CreateInterrupt 方法,以將 ISR 連接到來自裝置的中斷。 當裝置發出中斷要求訊號時,核心的陷阱處理程式會排程ISR在被動層級執行。 如需詳細資訊,請參閱 存取硬體和處理中斷。
從 Windows 8 開始,核心模式驅動程式架構 (KMDF) 支援被動層級 ISR。 SPB 周邊裝置的 KMDF 驅動程式會呼叫 WdfInterruptCreate 方法,將被動層級 ISR 連接到裝置的中斷。 這個方法的其中一個輸入參數是 WDF_INTERRUPT_CONFIG 結構的指標,其中包含中斷的組態資訊。 若要將ISR設定為在被動層級執行,請將此結構的 PassiveHandling 成員設定為 TRUE。 如需詳細資訊,請參閱 支援 Passive-Level 中斷。