2014-09-19 4 views
3

Я программирую arduino, я приложил прерывание на заднем фронте pin2. Пока я нахожусь в ISR, и ISR не выполнил все строки. Перед тем, как закончить все линии, если падающий край снова наступает, что происходит? Прерывает ли начало с начала или игнорирует его. Здесь я говорю только о прерывании на pin2.Что произойдет, если прерывание происходит во время работы ISR?

+4

Я не знаю о Arduino специально, но многие небольшие процессоры отключают прерывания, когда выполняется другое прерывание. Это важная причина для того, чтобы держать ISR как можно быстрее. Многие другие процессоры имеют прерывания разных приоритетов, так что прерывание более высокого приоритета может прерывать прерывания с более низким приоритетом. Вы должны прочитать спецификации для процессора на плате Arduino. –

+0

В целом, пусть ваш ISR как можно мал и короче, хорошим ISR может быть просто установить флаг, который будет проверяться основным циклом. –

+0

мой дед debounments, поэтому всегда не может зависеть только от прерывания. должен закончить вычисление в прерывании, так что debounces не влияет – user2983115

ответ

3

процессор 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.

Как правило, лучше всего собирать необходимую информацию в обработчике прерываний, хранить его в «безопасном» месте (для этого подходят круговые буферы) и сигнализировать, что новые данные доступны для обычной задачи в системе и обрабатывать данные там.

[Кроме того, насколько я могу судить, в прерывании нет никаких остановок вызовов функций - пока вы понимаете, что делаете, и нет проблем, например, от вызова функции как от прерывания, так и от регулярный код в то же время]

+0

+1, я могу подтвердить, что вызывающие функции в обработчике прерываний просто прекрасны. Как говорит @Mats, нелокальные данные, доступные из функции, могут быть проблемой, если они могут быть повторно введены из нескольких вложенных прерываний или из состояний прерывания и пользователя, например. набор системных функций ОС, которые можно безопасно назвать, очень мал. –

Смежные вопросы