Cuando se interrumpe la captura de Arduino, ¿se llama noInterrupts ()?

2

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 ?

    
pregunta vasco

1 respuesta

5

Mirando enlace puede ver que su función de manejo de interrupciones se ejecuta desde el contexto del controlador de interrupciones.

Sólo se puede ejecutar un controlador de interrupciones a la vez, por lo que puede estar seguro de que no se producirán interrupciones mientras se ejecuta la rutina blink() . No es necesario que llame a noInterrupts() o interrupts() desde su función de controlador.

Debido a que su función se ejecutará en un contexto de interrupción, es importante regresar tan pronto como sea posible para permitir que otros códigos de interrupciones (y primer plano) continúen ejecutándose.

Cualquier variable utilizada en su controlador de interrupciones, que también es utilizada por el código de no interrupción, debe ser volatile . Esto le dice al compilador que debe volver a leer la ubicación de la memoria en cada acceso y no en caché. Sin volatile , un controlador de interrupciones podría cambiar la variable entre las instrucciones que dejan el código en primer plano con un valor en caché no válido.

    
respondido por el Toby Jaffey

Lea otras preguntas en las etiquetas