Restablecer interrupción: ¿Inicio o finalización de ISR?

4

Estoy trabajando en una unidad uC que tiene interrupciones configuradas para varios FIFO presentes en la unidad uC. Cada FIFO está conectado a un bus común y puede recibir datos de forma independiente (en cualquier momento). Ahora, cada vez que un FIFO recibe 8 bytes de datos, se llama un solo ISR y en el ISR tengo que identificar qué FIFO causó la interrupción.

Lo que me gustaría saber es si la Interrupción debe restablecerse al principio de la función ISR o al final.

Problema1 que puede ocurrir : supongamos que reinicio la interrupción al comienzo del ISR, si se llena otro FIFO mientras estoy en el ISR, ya que reinicié la interrupción, ¿qué ocurrirá? ? ¿Volverá a ingresar automáticamente el ISR después de que ejecute la última línea del ISR o ocurrirá algún otro problema?

Problema2 que puede ocurrir : supongamos que reinicio la interrupción al final del ISR, si se llena otro FIFO mientras estoy en el ISR, ya que aún no he restablecido la interrupción, Vuelvo a ingresar al ISR. He ejecutado la última línea del ISR?

¿Dónde está el mejor lugar para restablecer la interrupción? Por favor, disculpe si mi comprensión de las interrupciones es incorrecta

    

2 respuestas

4

Su pregunta no se limita a FIFOs ni a ningún hardware en particular que cause interrupciones.

Borre las condiciones de interrupción tan pronto como sepa que manejará esa condición.

En el caso de interrupciones vectoriales, esto es muy temprano en la rutina de interrupción porque usted sabe la causa de la interrupción simplemente por estar allí. Puede hacer el guardado normal del estado antes que cualquier otra cosa, pero eliminar la condición de interrupción debería ser lo siguiente que haga.

En el caso de una rutina de interrupción compartida, primero debe verificar qué dispositivo está causando la interrupción. Una vez que haya encontrado un dispositivo con su condición de interrupción establecida, vaya al código para manejar ese dispositivo. La eliminación de la condición de interrupción suele ser lo primero que hace este código.

El motivo principal para eliminar la condición de interrupción antes de reparar la interrupción es no perder una interrupción. Supongamos que hiciste lo contrario. El dispositivo se interrumpe, usted lo maneja, luego ocurre otro evento justo antes de borrar la condición de interrupción. Ahora se eliminó la condición para el nuevo evento, pero su código no lo sabe. El estado de ese dispositivo ahora está colgado porque necesita servicio y probablemente no pueda generar nuevos eventos, pero el evento que causó la condición actual ya se ha borrado. Ups.

Tenga en cuenta que es posible que el dispositivo al que termine el servicio en una rutina de interrupción compartida no sea el que originó la interrupción originalmente. Múltiples dispositivos podrían tener sus condiciones de interrupción establecidas para el momento en que los revise. Por lo general, los verifico en un orden fijo, manejo el primero que encuentro que necesita servicio, y luego salgo de la interrupción. Si otro dispositivo también tiene su condición de interrupción establecida, entonces el procesador causará otra interrupción. Algunas personas regresan y hacen bucles hasta que ningún dispositivo tiene su condición establecida, pero esto hace que la interrupción sea más larga en la mayoría de los casos.

También tenga cuidado al verificar los dispositivos que puedan tener su interrupción enmascarada desactivada en tiempo de ejecución. Un ejemplo común es la interrupción de transmisión UART. Por lo general, lo apaga cuando la salida FIFO se agota, luego lo habilita justo después de rellenar algo en el FIFO. En muchos procesadores, el enmascaramiento de la interrupción solo evita que la propia interrupción se genere, y no se indica la condición de interrupción. Si algún otro dispositivo causa una interrupción compartida y usted verifica primero el transmisor UART, erróneamente pensará que necesita servicio ya que su condición de interrupción se establece aunque su capacidad de interrupción esté enmascarada. Para cualquier dispositivo que pueda tener enmascarada su capacidad de interrupción, también debe verificar esa máscara e ignorar el dispositivo si está desactivado. Esto puede parecer obvio, pero es un error muy común.

    
respondido por el Olin Lathrop
0

Es mejor borrar el indicador de interrupción ("restablecer la interrupción") al comienzo del ISR porque no perderá otra interrupción si ocurre mientras la primera invocación aún se está ejecutando.

Ejemplo rápido: recibe datos usando algún periférico, el ISR tarda un tiempo en procesarlos, si recibe un segundo byte mientras el ISR todavía se está ejecutando y borra la marca desde el principio, solo obtendrá una segunda interrupción . Si lo ha borrado al final, perdería datos.

    
respondido por el filo

Lea otras preguntas en las etiquetas