noInterrupts()

noInterrupts()

Tem horas em que você não pode ser interrompido no meio de uma operação — por exemplo, ao ler uma variável de vários bytes que uma interrupção também altera. O noInterrupts() congela todas as interrupções por um instante, garantindo que aquele trecho rode do início ao fim sem ninguém "furar a fila". Assim que terminar, você chama interrupts() pra tudo voltar ao normal.

Sintaxe

noInterrupts();

Parâmetros

Nenhum.

Retorno

Nada (void).

Exemplo

volatile int leituraSensor = 0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int valor;

  noInterrupts();          // ninguem altera leituraSensor agora
  valor = leituraSensor;
  interrupts();            // libera de novo

  Serial.println(valor);
  delay(100);
}

Notas e cuidados

  • Sempre acompanhe de um interrupts() logo depois — deixar as interrupções desligadas por muito tempo quebra o millis(), a comunicação serial e o atendimento de eventos.
  • Serve pra criar uma "seção crítica": proteja apenas o mínimo necessário, poucas linhas.
  • Nos bastidores equivale à instrução cli() do AVR (desabilita as interrupções).

Quer aprender a usar isso em projetos reais, do zero?

Conhecer o Curso Maker