En un AVR (ATtiny2313), ¿cuál recibe servicio primero cuando TIMER0_OVF y TIMER0_COMPA vencen al mismo tiempo?

Si el registro de comparación del temporizador de 8 bits de un AVR es 255 y el temporizador se desborda (según la hoja de datos, la interrupción de comparación ocurre en el siguiente ciclo de reloj del temporizador), entonces tanto la interrupción de desbordamiento como la interrupción de comparación deben presentarse al mismo tiempo. ¿Cuál será atendido primero?

Respuestas (2)

Consulte la hoja de datos del ATtiny2313: http://www.atmel.com/dyn/resources/prod_documents/doc2543.PDF

La prioridad de las interrupciones está determinada por el orden de los vectores de interrupción. Consulte la página 46 para ver la lista. Cuanto menor sea el número, mayor es la prioridad. Dado que el desbordamiento del temporizador/contador0 tiene un número más bajo (7) que la coincidencia de comparación A del temporizador/contador0 (14), el ISR de desbordamiento se ejecutará primero.

Impresionante. Pensé que sería algo así.

Realmente espero que alguien sepa esto y que obtenga una respuesta directa con un buen razonamiento de los documentos, ejemplos de cómo planificar interrupciones simultáneas, etc. pero todo lo que puedo decirle ahora es que es el que todavía se está ejecutando cuando hacer

ISR(TIMER0_OVF_vect)
{
  printf("OVF ISR Ran First\n"); //or whatever your console output uses
  fflush(stdout);

  while(1);
}

ISR(TIMER0_COMPA_vect)
{
  printf("COMPA  ISR Ran First\n"); //or whatever your console output uses
  fflush(stdout);

  while(1);
}
No sé acerca de estos AVR, pero en todos los sistemas integrados en los que he trabajado, y ha habido muchos, no puede/no debe usar printf o su equivalente desde dentro de una función de interrupción. Para empezar, si el dispositivo de salida utiliza interrupciones, esta función, como nunca regresa, probablemente bloqueará su funcionamiento.
Entiendo que es un mal estilo, pero todo lo que quería hacer era mostrar dónde estaba el código. Se podría haber usado un LED conmutado, una cadena global en un Big Loop o cualquier cantidad de salidas, pero printf es fácil de leer. El objetivo era escribir una interrupción de bloqueo (¡que definitivamente es una mala práctica en el 99% de los casos que puedo imaginar!)