Compartir a través de


EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO función de devolución de llamada (sercx.h)

La función de devolución de llamada de eventos EvtSerCx2PioTransmitDrainFifo se llama mediante la versión 2 de la extensión del marco de serie (SerCx2) para purgar la transmisión FIFO en el hardware del controlador serie.

Sintaxis

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO EvtSercx2PioTransmitDrainFifo;

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

Parámetros

[in] PioTransmit

Identificador de SERCX2PIOTRANSMIT a un objeto PIO-transmit. El controlador de controlador serie llamó anteriormente al método SerCx2PioTransmitCreate para crear este objeto.

Valor devuelto

Ninguno

Observaciones

El controlador de controlador serie puede, como opción, implementar esta función. Si el controlador implementa esta función, también debe implementar el EvtSerCx2PioTransmitCancelDrainFifo y EvtSerCx2PioTransmitPurgeFifo funciones de devolución de llamada de eventos. Un controlador que implementa estas funciones los registra en el serCx2PioTransmitCreate llamada que crea el objeto pio-transmit.

SerCx2 llama a la función EvtSerCx2PioTransmitDrainFifo, si se implementa, para purgar la transmisión FIFO en el hardware del controlador serie al final de una transacción pio-transmit. Esta función garantiza que los bytes de datos que permanezcan en la transmisión FIFO se transmitan al dispositivo periférico conectado en serie. Después de transmitir el último byte desde FIFO, la función EvtSerCx2PioTransmitDrainFifo llama al método SerCx2PioTransmitDrainFifoComplete para notificar a SerCx2.

Si el controlador del controlador serie implementa una función EvtSerCx2PioTransmitDrainFifo, SerCx2 no completa una solicitud de escritura pendiente (IRP_MJ_WRITE) hasta que el controlador llame a SerCx2PioTransmitDrainFifoComplete.

Si el controlador serie tiene un FIFO de hardware (o un mecanismo de almacenamiento en búfer similar) para contener datos de transmisión, el controlador debe implementar una función EvtSerCx2PioTransmitDrainFifo. De lo contrario, SerCx2 no puede confirmar que la transmisión FIFO se ha purgado antes de que se complete la solicitud de escritura pendiente. En su lugar, SerCx2 completa esta solicitud después del último byte del búfer de escritura se escribe en la transmisión FIFO. No puede haber ninguna garantía de que los datos escritos en la transmisión FIFO se transmitan sin un retraso significativo. Los datos que permanezcan en el FIFO después de que se complete la solicitud de escritura se pueden perder antes de que se puedan transmitir al dispositivo periférico conectado en serie. Esta pérdida de datos inesperada en una solicitud de escritura completada correctamente puede crear problemas de confiabilidad para el controlador periférico.

Por ejemplo, un controlador periférico podría enviar solicitudes de escritura a un puerto serie al que está conectado un dispositivo periférico. Hasta que se completen todas las solicitudes de escritura pendientes, este controlador debe retrasar el envío de un IOCTL para cambiar la velocidad de baudios a la que el puerto serie transmite datos. Sin embargo, si no se implementa ninguna función EvtSerCx2PioTransmitDrainFifo, es posible que se complete una solicitud de escritura para transmitir 100 bytes de datos mientras que 50 bytes de datos siguen estando en la transmisión FIFO. Si el controlador periférico envía un IOCTL para establecer una nueva velocidad de baudios, algunos de los bytes restantes del FIFO se pueden transmitir a la nueva velocidad de baudios, lo que provoca un error.

Del mismo modo, si se completa una solicitud de escritura para transmitir 100 bytes de datos mientras se conservan 50 bytes de datos en la transmisión FIFO, y el controlador serie sale D0 para entrar en un estado de dispositivo de baja potencia antes de que se puedan transmitir los bytes restantes en FIFO, el controlador periférico no sabrá que estos bytes se pierden.

Para obtener más información, vea SerCx2 PIO-Transmit Transactions.

Ejemplos

Para definir un EvtSerCx2PioTransmitDrainFifo función de devolución de llamada, primero debe proporcionar una declaración de función que identifique el tipo de función de devolución de llamada que está definiendo. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir un EvtSerCx2PioTransmitDrainFifo función de devolución de llamada denominada MyPioTransmitDrainFifo, use el tipo de función EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO, como se muestra en este ejemplo de código:

EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO  MyPioTransmitDrainFifo;

A continuación, implemente la función de devolución de llamada de la siguiente manera:

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

El tipo de función EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO se define en el archivo de encabezado Sercx.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations a la definición de función. La anotación Use_decl_annotations garantiza que se usen las anotaciones que se aplican al tipo de función EVT_SERCX2_PIO_TRANSMIT_DRAIN_FIFO en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, consulte Declaración de funciones mediante tipos de rol de función para controladores kmDF. Para obtener más información sobre Use_decl_annotations, vea Anotación del comportamiento de la función.

Requisitos

Requisito Valor
cliente mínimo admitido Disponible a partir de Windows 8.1.
de la plataforma de destino de Escritorio
encabezado de sercx.h
irQL Se llama a irQL <= DISPATCH_LEVEL.

Consulte también

EvtSerCx2PioTransmitCancelDrainFifo

EvtSerCx2PioTransmitPurgeFifo

IRP_MJ_WRITE

SERCX2PIOTRANSMIT

SerCx2PioTransmitCreate

serCx2PioTransmitDrainFifoComplete