Cómo escribir una rutina de servicio de interrupción de vxworks
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.