@Tw1ce

Как не откладывать обработку прерывания в долгий ящик?

Если я в коде по прерыванию отключаю обработку этого самого прерывания, например на пару секунд, то прерывание действительно не будет обрабатываться эти две секунды, но если оно было, то будет обработано сразу же после следующего подключения прерывания. Верно ли я понимаю, что микроконтроллер запоминает факт прерывания, а поскольку мой вектор единственен для данной обработки, и он выключен, то не может этот флаг скинуть, пока как раз таки я снова не подключу прерывание и он тут же радостно мне его передает? Возможно ли как-то переопределить данное поведение? Или скинуть каким-то другим способом этот флаг? Я хочу в какой-то момент полностью отключать обработку, чтобы если прерывания и были за время отсутствия обработчика (а они я так понимаю есть всегда), то мне о них докладывать не нужно.
volatile bool interrupt;
bool process;

void isr() {
  interrupt = true;
  digitalWrite(13, HIGH);
  delayMicroseconds(10000);
  digitalWrite(13, LOW);
}

void setup() {
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(1, isr, FALLING);
}

void loop() {
  if (interrupt) {
    detachInterrupt(1);
    interrupt = false;
    process = true;
  }
  if (process) {
    delay(2000);
    process = false;
    attachInterrupt(1, isr, FALLING);
  }
}
  • Вопрос задан
  • 91 просмотр
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Если я в коде по прерыванию отключаю обработку этого самого прерывания, например на пару секунд, то прерывание действительно не будет обрабатываться эти две секунды, но если оно было, то будет обработано сразу же после следующего подключения прерывания.

Это описание верно только для прерывания срабатывающего по фронту сигнала. Прерывание срабатывающее по уровню сигнала нигде не запоминается. Вне зависимости от того, было ли оно запрошено в то время, пока оно было запрещено, если оно не запрошено в момент разрешения прерывания -- прерывания не случится.

Верно ли я понимаю, что микроконтроллер запоминает факт прерывания

Верно для прерываний срабатывающих по фронту. Неверно для прерываний срабатывающих по уровню.

не может этот флаг скинуть, пока как раз таки я снова не подключу прерывание и он тут же радостно мне его передает?

Неверно в общем случае. Флаги запроса прерывания могут быть доступны через регистры, иногда эти регистры можно программно очищать.

Возможно ли как-то переопределить данное поведение?

У некоторых прерываний можно настроить, срабатывают они по уровню или по фронту. Например, у Atmel можно настроить как детектируются внешние прерывания INT0 и INT1 -- регистром EICRA.

Или скинуть каким-то другим способом этот флаг?

Опять же, на Atmel флаги внешних прерываний лежат в R/W регистре EIFR, в нужные биты которого можно записать 0, чтобы очистить запомненный запрос прерывания.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы