interrupción del temporizador (ISR)

0

Estoy utilizando una interrupción de temporizador para la multiplexación, sin embargo, mi pregunta se relaciona más estrechamente con las rutinas de servicio de interrupción.

Si configuro el prescaler y enciendo un temporizador, usando el código de abajo, puedo ejecutar el código asíncrono al bucle principal en un cierto intervalo dependiendo del prescaler. O al menos este es mi entendimiento de ello.

ISR(TIMER1_OVF_vect) { //code to run asynchronously at a certain interval }

Ahora, por ejemplo, si configuro mi temporizador para que interrumpa cada milisegundo (16000 ciclos a 16Mhz AVR) y el código que ejecuto toma, por ejemplo, 2 milisegundos para ejecutarse; es el código completamente ejecutado por la interrupción del segundo temporizador. Es decir, ¿la siguiente interrupción del temporizador depende de que se complete la anterior y podría tener un código lento ralentizar una interrupción?

Estoy usando un Atmega328P-PU con un cristal externo de 16Mhz como reloj.

    
pregunta Zano

3 respuestas

3

El siguiente código de interrupción no se ejecutará hasta que el anterior haya finalizado. Si genera interrupciones cada 1 ms y su controlador tarda 2 ms en ejecutarse, entonces su función principal no se ejecutará en absoluto. Los largos tiempos de ejecución de ISR suelen ser una indicación de un código muy malo.

    
respondido por el filo
3

Para responder a su pregunta real, la siguiente interrupción no se producirá hasta que ejecute la instrucción RETI, porque el indicador de interrupción global se borró en el hardware antes de ingresar su código.

Entonces, sí, la siguiente interrupción depende del código en su ISR.

Habiendo dicho eso, la pregunta como esta no debería haber ocurrido porque hay algo fundamentalmente incorrecto en el código que lo hace posible.

    
respondido por el Maple
0

Si está utilizando la optimización estándar (para el tamaño) y no establece ningún indicador especial sobre la interrupción (por ejemplo, ISR_NAKED), el compilador tras el salto a ISR guarda los registros con el estado del procesador y evita saltar a cualquier otra rutina de interrupción (deshabilitar y desactivar globalmente ). Puede escribir su propio código (por ejemplo, como insert asm volatile ("código asm"); para realizar una interrupción anidada. Después de que el código se ejecute en el estado del registro del procesador del compilador de rutina de Isr, habilite las interrupciones y haga "reti" (retorno de la interrupción). Si la señal de activación del controlador de interrupción se produce con una nueva interrupción cuando el procesador ejecuta otro isr, interrumpa la espera del controlador para finalizar el procesador y aumente el nuevo isr después de que se haya completado el proceso. Si, por ejemplo, el indicador de interrupción de aumento del temporizador0 dos o más mientras está pendiente otra rutina ISR, se ejecutará ISR para el temporizador0 una vez que se completó la antigüedad. El último estado es cuando la rutina isr está pendiente y otras dos fuentes de origen aumentan simultáneamente, luego, en primer lugar, se ejecutará isr para la señal con una identificación más baja (0 es para restablecer).

PD: perdón por mi inglés, trato de ser mejor.

    
respondido por el Szymon

Lea otras preguntas en las etiquetas