Red de conocimiento informático - Problemas con los teléfonos móviles - Cómo escribir una rutina de servicio de interrupción de vxworks

Cómo escribir una rutina de servicio de interrupción de vxworks

La rutina del servicio de interrupciones se utiliza para manejar interrupciones del hardware y es una parte importante del controlador del dispositivo. Para responder a las interrupciones externas de manera oportuna y evitar que se pierdan las interrupciones. La rutina del servicio de interrupción debe ser lo más pequeña posible y solo se deben realizar las tareas más necesarias en la rutina del servicio de interrupción. Generalmente, cuando se inicia el sistema, después de que el dispositivo de hardware se inicializa exitosamente, el ISR se conecta al vector de interrupción: el vector de interrupción también se puede suspender en cualquier momento después de que se inicia el sistema. El último método se utiliza a menudo para la depuración. En VxWorks, hay dos funciones diferentes que brindan funcionalidad de enlace de interrupciones: intConnect y pciIntConnect. La diferencia entre las dos es que intConnect usa un vector de interrupción exclusivo, mientras que pcilntConnect puede compartir vectores de interrupción entre diferentes ISR. De hecho, pcilntConnect llama internamente a la función intConnect, que utiliza internamente una lista vinculada para administrar múltiples ISR diferentes. pcilntConnect requiere que cada vez que se acceda al ISR, se verifique un registro de hardware para confirmar que la interrupción fue realmente generada por el hardware al que presta servicio el ISR. Si los registros de hardware indican que el hardware no generó una interrupción, el ISR sale inmediatamente para darle a otros ISR conectados al mismo vector de interrupción la oportunidad de verificar si se generó una interrupción. El código en pcilntLib.c ilustra esto claramente:

void pciInt (int irq ){

PCLlNT RTN * pRtn;

for (pRm = (PCI_INT_RTN* )DLL_FIRST(amp;pcilntList[irq]);

pRtn! =NULL;

pRtn = (PCI_INT_RTN*)DLL_NEXT(amp; nodo))

(*pRtn-gt; rutina) (pRtn-gt; parámetro);

}

Cuando ocurre una interrupción en el bus PCI, el sistema llamará a void pcilnt(int irq ) función, pciInt usará una lista enlazada interna para llamar secuencialmente al ISR conectado a esa interrupción. Si un ISR no sale normalmente, afectará el funcionamiento de otros ISR. Para verificar si el vector de interrupción está conectado de manera confiable al ISR durante la depuración, puede llamar a pciInt en la línea de comando o directamente en el programa para ver si se activa el ISR. En el caso de la determinación del hardware, se puede tener cuidado de garantizar que cada hardware utilice una interrupción diferente, de modo que los dispositivos en PCI también puedan utilizar la interrupción de conexión intConnect directamente.

Vale la pena señalar que el proceso de adjuntar el vector de interrupción al ISR no es simplemente establecer el valor del vector de interrupción en la tabla de vectores, además de establecer el valor del vector de interrupción, VxWorks también rodea el ISR; conectado al vector de interrupción Se agregó un contenedor delgado que incluye guardar los valores de registro antes de ejecutar el IsR. Establece la pila y restaura los registros y la pila después de la ejecución de IsR. En el caso de interrupciones frecuentes, la pila de interrupciones del sistema puede agotarse y desbordarse. Para evitar la situación anterior, se debe modificar el tamaño de la pila de interrupciones del sistema, es decir, agregar el siguiente código en config.h:

#define INCLUDE_KERNEL

#define ISR_STACK_SIZE 0xl000 // Indica que el sistema El tamaño de la pila de interrupciones es 4k

Debido a la naturaleza especial del controlador de interrupciones, el controlador de interrupciones no se puede utilizar para funciones que puedan causar bloqueo, como printf, semTake, etc. Consulte lt;gt; para obtener una lista específica de funciones que no se pueden utilizar.

A veces, para facilitar la depuración, desea imprimir cierta información en el ISR. El sistema proporciona una función sysLog que es equivalente a prinf. Es sin bloqueo. Por el contrario, la función prinf regresa solo después de que se completa el trabajo de impresión y sysLog solo regresa cuando el trabajo de impresión se coloca en la cola de impresión del sistema. Aunque semTake no está permitido en un ISR, se puede utilizar semGive (excepto para tipos mutuamente excluyentes). Generalmente, semTake y semGive se utilizan para la comunicación entre el ISR y el programa normal: cuando ocurre una interrupción y el ISR completa las tareas necesarias, se llamará a semGive para notificar a otra tarea que usa semTake para esperar la señal ISR. Después de la señal emitida por semGive, continúe completando las tareas que son inconvenientes de completar en el ISR.