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.