EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO回呼函式 (sercx.h)

EvtSerCx2PioTransmitDrainFifo 事件回呼函式是由序列架構延伸模組的第 2 版所呼叫, (SerCx2) ,以清空序列控制器硬體中的傳輸 FIFO。

語法

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO EvtSercx2PioTransmitDrainFifo;

void EvtSercx2PioTransmitDrainFifo(
  [in] SERCX2PIOTRANSMIT PioTransmit
)
{...}

參數

[in] PioTransmit

PIO 傳輸物件的 SERCX2PIOTRANSMIT 句柄。 序列控制器驅動程式先前稱為 SerCx2PioTransmitCreate 方法來建立這個物件。

傳回值

備註

您的序列控制器驅動程式可以選擇實作此函式。 如果您的驅動程序實作此函式,它也必須實作 EvtSerCx2PioTransmitCancelDrainFifoEvtSerCx2PioTransmitPurgeFifo 事件回呼函式。 實作這些函式的驅動程式會在 SerCx2PioTransmitCreate 呼叫中註冊它們,以建立 PIO 傳輸物件。

如果實作,SerCx2 會呼叫 EvtSerCx2PioTransmitDrainFifo 函式,以在 PIO 傳輸交易結束時清空序列控制器硬體中的傳輸 FIFO。 此函式可確保保留在傳輸 FIFO 中的任何數據位元組都會傳輸至序列連接的周邊裝置。 從 FIFO 傳輸最後一個字節之後, EvtSerCx2PioTransmitDrainFifo 函式會呼叫 SerCx2PioTransmitDrainFifoComplete 方法來通知 SerCx2。

如果序列控制器驅動程序實作 EvtSerCx2PioTransmitDrainFifo 函式,SerCx2 不會完成暫止的寫入 (IRP_MJ_WRITE) 要求,直到驅動程式呼叫 SerCx2PioTransmitDrainFifoComplete 為止。

如果您的序列控制器具有硬體 FIFO (或類似的緩衝機制,) 保留傳輸數據,則驅動程式應該實作 EvtSerCx2PioTransmitDrainFifo 函式。 否則,SerCx2 無法在擱置寫入要求完成之前確認傳輸 FIFO 已清空。 相反地,SerCx2 會在寫入緩衝區的最後一個字節寫入傳輸 FIFO 之後完成此要求。 不保證寫入傳輸 FIFO 的數據將會傳輸,而不會有明顯的延遲。 在寫入要求完成之後,保留在 FIFO 中的任何數據都可能會遺失,然後才能將其傳輸至序列連接的周邊裝置。 在成功完成的寫入要求中,這種未預期的數據遺失可能會為周邊驅動程序產生可靠性問題。

例如,周邊驅動程式可能會將寫入要求傳送至周邊裝置所連接的序列埠。 在完成所有未處理的寫入要求之前,此驅動程式應該延遲傳送 IOCTL,以變更串行埠傳輸數據的傳輸速率。 不過,如果未實作 EvtSerCx2PioTransmitDrainFifo 函式,則傳輸 100 個字節數據的寫入要求可能會完成,而 50 個數據位元組仍保留在傳輸 FIFO 中。 如果周邊驅動程式接著傳送 IOCTL 來設定新的傳輸速率,FIFO 中的部分剩餘位元組可能會以新的傳輸速率傳輸,因而造成錯誤。

同樣地,如果傳送 100 個字節數據的寫入要求已完成,而 50 個數據位元組仍保留在傳輸 FIFO 中,而序列控制器會結束 D0 進入低電源裝置狀態,才能傳輸 FIFO 中的剩餘位元組之前,周邊驅動程式不會知道這些位元組會遺失。

如需詳細資訊,請參閱 SerCx2 PIO-Transmit Transactions

範例

若要定義 EvtSerCx2PioTransmitDrainFifo 回呼函式,您必須先提供函式宣告來識別您要定義的回呼函式類型。 Windows 提供一組驅動程式的回呼函式類型。 使用回呼函式類型宣告函式有助於 驅動程式的程式代碼分析靜態驅動程式驗證器 (SDV) ,以及其他驗證工具尋找錯誤,而且這是撰寫 Windows 操作系統驅動程式的需求。

例如,若要定義名為 MyPioTransmitDrainFifoEvtSerCx2PioTransmitDrainFifo 回呼函式,請使用 EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO 函式類型,如下列程式代碼範例所示:

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO  MyPioTransmitDrainFifo;

然後,實作回呼函式,如下所示:

_Use_decl_annotations_
VOID
  MyPioTransmitDrainFifo(
    SERCX2PIOTRANSMIT  PioTransmit
    )
  {...}

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO函式類型是在 Sercx.h 頭檔中定義。 若要在執行程式代碼分析工具時更精確地識別錯誤,請務必將 Use_decl_annotations 批註新增至函式定義。 Use_decl_annotations批註可確保使用頭檔中套用至EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO函式類型的註釋。 如需函數宣告需求的詳細資訊,請參閱 使用 KMDF 驅動程式的函式角色類型來宣告函式。 如需 Use_decl_annotations的詳細資訊,請參閱 標註函式行為

規格需求

需求
最低支援的用戶端 從 Windows 8.1 開始提供。
目標平台 桌面
標頭 sercx.h
IRQL 在 IRQL <= DISPATCH_LEVEL呼叫。

另請參閱

EvtSerCx2PioTransmitCancelDrainFifo

EvtSerCx2PioTransmitPurgeFifo

IRP_MJ_WRITE

SERCX2PIOTRANSMIT

SerCx2PioTransmitCreate

SerCx2PioTransmitDrainFifoComplete