Проверка прерываний

Если я отключу прерывания (например, noInterrupts или cli) и включу их (interrupts или sei для пример) позже, будут ли прерывания, которые выполнялись бы в окне между огнем, при выполнении последнего? Я думаю, что нет, и не подтверждал и не опровергал это. Если нет, всегда есть возможность вручную отключить таймеры или компоненты с аналогичными проблемами в отношении статуса прерывания? Логично, что платы Arduino на основе AVR будут вести себя аналогично. Кажется правдоподобным, что биты для принудительного выполнения прерывания будут включаться и выключаться, когда происходит переход. Благодарим за обращение.

, 👍1

Обсуждение

ваш вопрос не об Arduino ... это общий вопрос о микроконтроллере AVR ... лучше подходит на https://electronics.stackexchange.com/questions, @jsotola

Спасибо, кажется, я сделал ту же ошибку, что и раньше, я думал, что никакие прерывания и прерывания не оправдают ее., @markoj

@jsotola это разумный вопрос - иначе вы могли бы отбросить почти все вопросы об Arduino, говоря, что они касаются микроконтроллеров AVR., @Nick Gammon


1 ответ


Лучший ответ:

3

См. Как прерывания работают на Arduino Uno и подобных платах?

Да, большинство прерываний будут запомнены, и ISR будет выполняться, когда прерывания снова разрешены, а также выполняется еще одна инструкция. Если бы этого не произошло, было бы очень плохо, так как вы можете отключить прерывания на короткое время, и вы не хотели бы пропустить то, для чего было прерывание (например, входящие последовательные данные).

Чтобы этого не произошло, вам нужно очистить сообщение " Произошло прерывание прерывания" бит для отдельных прерываний. Это задокументировано в таблице данных для каждого прерывания.

Порядок, в котором будут обслуживаться необработанные прерывания, определяется приоритетом прерывания, то есть прерывания с меньшим номером будут обслуживаться первыми. Вызов ISR заставляет процессор сбрасывать "произошло прерывание"; бит для этого прерывания.

,

Обратите внимание, что каждое прерывание имеет один бит «произошло прерывание», поэтому, если конкретное прерывание срабатывает несколько раз в течение окна CLI-SEI, оно будет обслужено только один раз вне окна. Поэтому обработчик должен проверить все возможные триггеры..., @user10489

@ user10489 Не могли бы вы уточнить, что вы подразумеваете под «всеми возможными триггерами?». Бит прерывания будет установлен только один раз в этом окне. После того, как он установлен, он не может быть «двойным набором». Для ISR важно быстро обрабатывать соответствующие прерывания, чтобы не задерживать без необходимости обработку других прерываний., @Nick Gammon

Верно. Если прерывание срабатывает несколько раз, но срабатывает только один раз, ваш обработчик будет вызываться только один раз, но, возможно, ему придется обрабатывать все вещи, которые могли бы вызвать его срабатывание. Например, если у вас есть прерывание для символов, полученных uart, вы можете прочитать несколько символов., @user10489

Да, в этом случае UART имеет (небольшой) буфер, поэтому рекомендуется читать его до тех пор, пока он не опустеет., @Nick Gammon

В качестве примечания для тех, кому это может оказаться полезным: кажется, что флаги прерываний - это те форсирующие биты, такие как принудительное сравнение A и B в регистрах таймера., @markoj