Indica si las interrupciones están habilitadas

7

¿Hay alguna manera de saber si sei() / interrupts() o cli() / noInterrupts() se llamó por última vez?

Necesito esto para poder habilitar interrupciones, ejecutar algún código y configurar interrupciones deshabilitar interrupciones si están deshabilitadas.

Aquí hay un código de ejemplo:

void function_requiring_interrupts(void) {
    bool interruptsEnabled = getInterrupsState(); // what function / variable here?

    interrupts();

    // Code requiring interrups are enabled

    if(!interruptsEnabled) {
        noInterrupts();
    }
}
    
pregunta Tyilo

1 respuesta

9

Una forma de hacer esto es guardar y luego restaurar el registro de estado SREG, y así guardar y luego restaurar el estado de interrupción a lo que fue, por lo tanto:

  uint8_t oldSREG = SREG; // Save the status
  cli();

  // Do stuff, as little as possible.

  SREG = oldSREG;

Además, la razón descrita en la pregunta tiene problemas inherentes: si algún otro código ya tenía las interrupciones deshabilitadas, y su código habilita interrupciones, la corrupción de los datos o la falla del programa podrían ocurrir. Cualquier bloque de código "inhabilitado por interrupciones" esperaría que todos los registros y la memoria / variables permanezcan sin ser entretenidos, mientras que habilitar interrupciones puede hacer que eso cambie.

Por lo tanto, la lógica inversa, como en el fragmento de código anterior, es la mejor práctica: deshabilite explícitamente las interrupciones para su propio código según sea necesario, pero restaure las interrupciones lo antes posible, luego continúe con el resto de su procesamiento.

    
respondido por el Anindo Ghosh

Lea otras preguntas en las etiquetas