Leí la documentación sobre interrupciones en Arduino y hay un código de ejemplo:
int pin = 13;
volatile int state = LOW;
void setup() {
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop() {
digitalWrite(pin, state);
}
void blink() {
state = !state;
}
Bueno, no es un buen ejemplo, pero para mi pregunta es suficiente.
¿Qué pasa si en la función blink()
es una operación no atómica? Digamos, tengo que cambiar varias variables, llamar a alguna función, etc. ¿Debo llamar a noInterrupts()
antes, o las interrupciones están deshabilitadas automáticamente?
void blink() {
noInterrupts(); // Disable interrupts
// some complex work, here.
interrupts(); // Enable interrupts
}
Busqué en hardware/arduino/cores/arduino/WInterrupts.c
en mi directorio IDE de Arduino, pero no puedo encontrar ninguna información allí.
Y una cosa más: ¿Por qué debería declarar cualquier variable en la rutina de interrupción como volatile
?