Interrumpir objetos de sincronización
El controlador del sistema PortCls implementa la interfaz IInterruptSync para beneficiarse de los controladores de miniport. IInterruptSync representa un objeto de sincronización de interrupción que sincroniza la ejecución de una lista de rutinas de servicio de interrupción (ISR) con rutinas de no interrupción.
Los objetos de sincronización de interrupciones proporcionan dos funcionalidades clave:
Ejecución de una lista de ISR en respuesta a una interrupción. El objeto de sincronización está conectado a un origen de interrupción. Cada vez que se produce la interrupción, el objeto de sincronización ejecuta los ISR en un orden especificado según el modo seleccionado. (Vea la siguiente descripción de los tres modos).
Ejecución de rutinas que no son ISR. Estas rutinas de no interrupción no están conectadas a la interrupción del objeto de sincronización. En su lugar, una rutina de no interrupción se ejecuta en un momento de la elección del autor de la llamada. Sin embargo, el objeto de sincronización ejecuta la rutina de no interrupción de forma sincrónica con la lista de ISR del objeto. En otras palabras, la rutina de no interrupción se ejecuta hasta su finalización antes de que cualquiera de los ISR de la lista del objeto de sincronización comience a ejecutarse y viceversa.
Un objeto de sincronización de interrupciones es flexible para tratar con varios ISR. Los ISR residen en una lista vinculada que atraviesa el objeto de sincronización en tiempo de interrupción. Cuando un controlador de minipuerto registra un ISR con un objeto de sincronización, especifica si el ISR se debe agregar al principio o al final de esta lista.
Un controlador de minipuerto llama a la función PcNewInterruptSync para crear un objeto de sincronización de interrupciones. Durante esta llamada, el controlador especifica la manera en que el objeto va a atravesar su lista de ISR en tiempo de interrupción. La llamada admite las tres opciones especificadas por las constantes de enumeración INTERRUPTSYNCMODE en la tabla siguiente.
Constante | Significado |
---|---|
InterruptSyncModeNormal |
Llame a cada ISR de la lista hasta que uno de ellos devuelva STATUS_SUCCESS. |
InterruptSyncModeAll |
Llame a cada ISR de la lista exactamente una vez, independientemente de los códigos de retorno de los ISR anteriores. |
InterruptSyncModeRepeat |
Recorrer toda la lista de ISR hasta que se produzca un recorrido por la lista en el que ningún ISR de la lista devuelva STATUS_SUCCESS. |
En el modo InterruptSyncModeNormal , el objeto de sincronización llama a cada ISR de la lista hasta que uno de ellos devuelva STATUS_SUCCESS. No se llama a los ISR de la lista que siguen a este ISR. Este modo emula la forma en que el sistema operativo normalmente controla los ISR. Si ninguno de los ISR devuelve STATUS_SUCCESS, el comportamiento es el mismo que InterruptSyncModeAll.
En el modo InterruptSyncModeAll , cada ISR de la lista se llama exactamente una vez, independientemente de los códigos de retorno de los ISR anteriores. Esto está pensado para hardware más primitivo en el que el origen de la interrupción no es determinista, aunque también puede ser útil en otras situaciones. Por ejemplo, dos orígenes de interrupción pueden estar estrechamente sincronizados en cada interrupción, independientemente de cuál de los dos orígenes provenga una interrupción determinada.
En el modo InterruptSyncModeRepeat , el objeto de sincronización recorre repetidamente toda la lista de ISR hasta que se produce un recorrido por la lista en el que no se devuelve ninguna rutina de la lista STATUS_SUCCESS. Este modo es adecuado para situaciones en las que las interrupciones de varios orígenes podrían activarse en la misma línea de interrupción al mismo tiempo, o una segunda interrupción podría desencadenarse durante el procesamiento de ISR. Cada origen de interrupción debe ser capaz de determinar si requiere procesamiento. El sistema dejará de responder si un ISR que siempre devuelve STATUS_SUCCESS se registra con un objeto de sincronización en este modo.
En cualquiera de estos modos, el objeto de sincronización reconocerá la interrupción en el sistema operativo si alguno de los ISR registrados devuelve STATUS_SUCCESS. En los tres modos, si todos los orígenes de interrupción indican que no controlaron correctamente la interrupción, el objeto de sincronización devolverá un código de resultado incorrecto al sistema operativo.
La interfaz IInterruptSync admite los métodos siguientes: