Проверка прерываний
Если я отключу прерывания (например, noInterrupts
или cli
) и включу их (interrupts
или sei
для пример) позже, будут ли прерывания, которые выполнялись бы в окне между огнем, при выполнении последнего? Я думаю, что нет, и не подтверждал и не опровергал это. Если нет, всегда есть возможность вручную отключить таймеры или компоненты с аналогичными проблемами в отношении статуса прерывания? Логично, что платы Arduino на основе AVR будут вести себя аналогично. Кажется правдоподобным, что биты для принудительного выполнения прерывания будут включаться и выключаться, когда происходит переход. Благодарим за обращение.
@markoj, 👍1
Обсуждение1 ответ
Лучший ответ:
См. Как прерывания работают на Arduino Uno и подобных платах?
Да, большинство прерываний будут запомнены, и ISR будет выполняться, когда прерывания снова разрешены, а также выполняется еще одна инструкция. Если бы этого не произошло, было бы очень плохо, так как вы можете отключить прерывания на короткое время, и вы не хотели бы пропустить то, для чего было прерывание (например, входящие последовательные данные).
Чтобы этого не произошло, вам нужно очистить сообщение " Произошло прерывание прерывания" бит для отдельных прерываний. Это задокументировано в таблице данных для каждого прерывания.
Порядок, в котором будут обслуживаться необработанные прерывания, определяется приоритетом прерывания, то есть прерывания с меньшим номером будут обслуживаться первыми. Вызов ISR заставляет процессор сбрасывать "произошло прерывание"; бит для этого прерывания.
Обратите внимание, что каждое прерывание имеет один бит «произошло прерывание», поэтому, если конкретное прерывание срабатывает несколько раз в течение окна CLI-SEI, оно будет обслужено только один раз вне окна. Поэтому обработчик должен проверить все возможные триггеры..., @user10489
@ user10489 Не могли бы вы уточнить, что вы подразумеваете под «всеми возможными триггерами?». Бит прерывания будет установлен только один раз в этом окне. После того, как он установлен, он не может быть «двойным набором». Для ISR важно быстро обрабатывать соответствующие прерывания, чтобы не задерживать без необходимости обработку других прерываний., @Nick Gammon
Верно. Если прерывание срабатывает несколько раз, но срабатывает только один раз, ваш обработчик будет вызываться только один раз, но, возможно, ему придется обрабатывать все вещи, которые могли бы вызвать его срабатывание. Например, если у вас есть прерывание для символов, полученных uart, вы можете прочитать несколько символов., @user10489
Да, в этом случае UART имеет (небольшой) буфер, поэтому рекомендуется читать его до тех пор, пока он не опустеет., @Nick Gammon
В качестве примечания для тех, кому это может оказаться полезным: кажется, что флаги прерываний - это те форсирующие биты, такие как принудительное сравнение A и B в регистрах таймера., @markoj
- Проблема прерываний с датчиком потока
- Заставить TCNT оставаться ниже OCRxA на ATmega328P
- avrdude ser_open() can't set com-state
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Как правильно использовать volatile переменные в Arduino?
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
ваш вопрос не об Arduino ... это общий вопрос о микроконтроллере AVR ... лучше подходит на https://electronics.stackexchange.com/questions, @jsotola
Спасибо, кажется, я сделал ту же ошибку, что и раньше, я думал, что никакие прерывания и прерывания не оправдают ее., @markoj
@jsotola это разумный вопрос - иначе вы могли бы отбросить почти все вопросы об Arduino, говоря, что они касаются микроконтроллеров AVR., @Nick Gammon