Uso válido de ISR_NOBLOCK

1

Estoy usando dos interrupciones de temporizador:

  • TIMER0_OVF se activa cada 12 ms, con su ISR solo sondeando un pin, estableciendo condicionalmente una bandera e incrementando un valor, por lo que debería completarse bastante rápido

  • TIMER2_OVF se activó a una velocidad de 4 kHz, y su ISR solo alterna un pin de salida para hacer que suene un altavoz piezoeléctrico

Dado que el TIMER0_OVF ISR bloquea las interrupciones de TIMER2_OVF por un breve momento cada 12 ms, el pitido no suena limpio, se superpone con un "rrr ...".

Agregar ISR_NOBLOCK a TIMER0_OVF ISR resuelve esto y suena un pitido limpio, y el resto aún funciona bien.

Sin embargo, no estoy seguro de si este es un uso válido de ISR_NOBLOCK y si hay una forma más elegante de generar un pitido "limpio".

Leer sobre ISR_NOBLOCK en < avr / interrupt.h & gt ;: Interrupts Me da la impresión de que está pensado para casos excepcionales en los que se necesitan interrupciones anidadas y se deben utilizar con cuidado.

    
pregunta Torsten Römer

1 respuesta

1

Este es un uso razonable de ISR_NOBLOCK siempre que entienda las limitaciones. Si agrega más interrupciones, puede encontrar problemas.

Sin embargo, para el caso del pitido, es posible que el temporizador genere la señal sin la intervención de la CPU. Consulte enlace

    
respondido por el pjc50

Lea otras preguntas en las etiquetas