Arduino: Generando señales de tiempo crítico con interrupciones

Tengo algunos problemas para entender completamente cómo se usan en la práctica las interrupciones en, por ejemplo, Arduinos/AVR. Supongamos que quiero generar una señal de tiempo crítico como PWM y al mismo tiempo poder responder a las entradas de los botones. Ambos deben implementarse con interrupciones.

¿Cómo puedo asegurarme de que la señal PWM no se estropee cuando se activa el botón y, por lo tanto, se está ejecutando otra rutina de interrupción (no relacionada con la señal)? Similar a esto, ¿cómo pueden las bibliotecas basadas en interrupciones como 'cable' asegurar que no se pierdan solicitudes mientras se ejecuta otro código (quizás también basado en interrupciones) (implementado por mí u otras bibliotecas)?

¿Por qué implementaría PWM con interrupciones cuando los AVR son perfectamente capaces de hacerlo en hardware?
Tome esto solo como un ejemplo, por favor. Dos tareas, una de las cuales es crítica en cuanto al tiempo y la otra cualquier otra cosa.

Respuestas (1)

Es fácil: no se puede. Y depende de la plataforma.

Algunos microcontroladores tienen controladores de interrupción de múltiples prioridades, de modo que si se está ejecutando un ISR de baja prioridad y se dispara una interrupción más alta, el micro deja de dar servicio a la baja, guarda el contexto, da servicio a la de alta prioridad y luego regresa a la rutina de menor prioridad. Para su ejemplo, probablemente configuraría el PWM en alta prioridad y los botones en baja prioridad, esperar un puñado de nosotros por un humano no es gran cosa.

En términos generales, si un microcontrolador no tiene un controlador de interrupción con prioridad habilitada, un ISR no es interrumpible. Si se presiona un botón y después de algunos ciclos de reloj, el temporizador se ajusta, por lo que es hora de alternar bien el pin PWM ... El pin esperará. El bit de solicitud de interrupción se establece y cuando el micro termine de dar servicio a los botones, volverá a la rutina principal y luego volverá a atender la nueva solicitud. Si se produce más de una solicitud mientras se atiende a otra... Eso depende de la plataforma. Puede haber un orden fijo o programable, se pueden servir FCFS o incluso de forma aleatoria.

La clave es: mantenga sus ISR cortos , y por cortos me refiero a cortos . Cuanto más corto, mejor. O, en este caso específico, realice la tarea no crítica mediante el sondeo. Puede tener su tiempo agradable (1) y verificar los botones dentro de allí, y hacer lo que necesite hacer con su entrada, y generar PWM a través de la interrupción.

Y el consejo final: no uses arduino. Si escribe todo su código, sabrá lo que hace y cómo se comporta. Los micros Atmel se pueden programar en "vainilla" c o asm, y en mi opinión eso es mucho mejor.