Я программирую arduino, я приложил прерывание на заднем фронте pin2. Пока я нахожусь в ISR, и ISR не выполнил все строки. Перед тем, как закончить все линии, если падающий край снова наступает, что происходит? Прерывает ли начало с начала или игнорирует его. Здесь я говорю только о прерывании на pin2.Что произойдет, если прерывание происходит во время работы ISR?
ответ
процессор Atmel отключает прерывания, когда прерывание принимается:
(Раздел 4.4: Бит 7 - I: Global Interrupt Enable)
Глобальное разрешение прерывания бит должен быть установлен для прерываний be включен. Затем выполняется индивидуальное управление включением прерываний в отдельных регистрах управления. Если глобальный регистр разрешения прерываний сбрасывается, ни один из прерываний не включается независимо от индивидуальных настроек разрешения прерываний . I-бит очищается аппаратным обеспечением после того, как произошло прерывание, и устанавливается инструкцией RETI на , что позволяет выполнять последующие прерывания. I-бит также может быть установлен и очищен приложением с инструкциями SEI и CLI, как описано в справочном руководстве по набору команд .
Далее:
Внешнее прерывание Флаг Регистр - EIFR
• Биты 7..0 - INTF6, INTF3 - INTF0: Флаги Внешние прерывания 6, 3 - 0 Когда ребро или логическое изменение на контакте INT [6; 3: 0] запускает запрос прерывания , INTF7: 0 устанавливается (один). Если I-бит в SREG и соответствующий бит разрешения прерывания, INT [6; 3: 0] в EIMSK, установлены (один), MCU перейдет к вектору прерывания. Флаг очищается , когда выполняется процедура прерывания. В качестве альтернативы, флаг может быть очищен, написав ему логический. Эти флаги всегда очищаются , когда INT [6; 3: 0] настроены как прерывание уровня. Обратите внимание, что когда , входящий в спящий режим с прерываниями INT3: 0, отключен, буферы ввода на этих контактах будут отключены. Это может привести к логическому изменению во внутренних сигналах, которые будут устанавливать флаги INTF3: 0.
Другими словами, при обнаружении другое прерывание, то регистр флага будет иметь тот набор битов, и что прерывания, когда принимается прерывания разрешены снова (при возврате из прерывания, если нет отдельного действия не выполняются).
http://www.atmel.com/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_%20Datasheet.pdf
Если вы хотите, вы можете реализовать код, который позволяет прерыванию во время этой процедуры обслуживания прерывания, но вы должны убедиться, что код после такой точки полностью Реентрантный, и/или маски текущее прерывание (некоторые процедуры обслуживания прерываний довольно сложно обрабатывать, когда вы не получите очередное прерывание вскоре после этого, и это становится почти невозможным, если вы получаете еще один, когда вы в данный момент находитесь в этом обработчике). Тем не менее, часто для правильных операционных систем допускаются все другие прерывания, что означает запись в регистр EIMSK.
Как правило, лучше всего собирать необходимую информацию в обработчике прерываний, хранить его в «безопасном» месте (для этого подходят круговые буферы) и сигнализировать, что новые данные доступны для обычной задачи в системе и обрабатывать данные там.
[Кроме того, насколько я могу судить, в прерывании нет никаких остановок вызовов функций - пока вы понимаете, что делаете, и нет проблем, например, от вызова функции как от прерывания, так и от регулярный код в то же время]
+1, я могу подтвердить, что вызывающие функции в обработчике прерываний просто прекрасны. Как говорит @Mats, нелокальные данные, доступные из функции, могут быть проблемой, если они могут быть повторно введены из нескольких вложенных прерываний или из состояний прерывания и пользователя, например. набор системных функций ОС, которые можно безопасно назвать, очень мал. –
- 1. Что произойдет, если я отключу прерывание внутри своего ISR?
- 2. Что произойдет, если вы развернете Hangfire во время работы?
- 3. STM32F4 прерывание TIM6 не происходит во время работы DMA
- 4. Что происходит во время завершения работы ОС?
- 5. Что происходит, если лямбда перемещается/разрушается во время работы?
- 6. Что происходит во время обработки
- 7. Что происходит, когда событие происходит во время работы программы
- 8. прерывание во время работы php-файла
- 9. Что происходит с преждевременным «возвратом» в ISR?
- 10. Что происходит при изменении хранимой процедуры во время ее работы?
- 11. Что произойдет, если вы вызовете прерывание() в спящем потоке?
- 12. Что произойдет, если страница закрыта во время выполнения javascript?
- 13. Что произойдет, если исключение выбрано во время finalize()
- 14. Что произойдет, если ключ во время обмена ключами украден?
- 15. Что произойдет, если исключение выбрано во время выделения?
- 16. Что произойдет, если приложение WinRT прекратится во время копирования файла?
- 17. Что произойдет, если экземпляр списка будет заменен во время перечисления?
- 18. Что произойдет, если во время Rails Pessimistic Lock произошла ошибка?
- 19. Что происходит во время просмотра в списке?
- 20. Что происходит, когда скрипт onkeyup перезагружается во время работы?
- 21. UART получает прерывание включенное, но без ISR?
- 22. Прерывание во время исполнения во время выполнения
- 23. Что делать, когда происходит прерывание
- 24. Что произойдет, если я удалю исполнителей программы во время ее работы?
- 25. Почему прерывание службы прерывания Windows (ISR) прерывается?
- 26. sprintf во время ISR вызывает сбой?
- 27. Что происходит, если вы редактируете файл во время компиляции?
- 28. Что происходит во время сбора мусора, если поколение 2 заполнено?
- 29. Что произойдет, если клиент отключится?
- 30. Что происходит во время ожидания и гибернации?
Я не знаю о Arduino специально, но многие небольшие процессоры отключают прерывания, когда выполняется другое прерывание. Это важная причина для того, чтобы держать ISR как можно быстрее. Многие другие процессоры имеют прерывания разных приоритетов, так что прерывание более высокого приоритета может прерывать прерывания с более низким приоритетом. Вы должны прочитать спецификации для процессора на плате Arduino. –
В целом, пусть ваш ISR как можно мал и короче, хорошим ISR может быть просто установить флаг, который будет проверяться основным циклом. –
мой дед debounments, поэтому всегда не может зависеть только от прерывания. должен закончить вычисление в прерывании, так что debounces не влияет – user2983115