Должен ли обработчик прерывания быть реентерабельным?

Я использую статическую переменную внутри обработчика прерывания, что делает обработчик прерывания нереентерабельным.

  1. Можно ли иметь нереентерабельный обработчик прерываний?
  2. Когда возникает аппаратное прерывание, событие помещается в какую-то очередь и ожидает завершения текущего вызова обработчика прерывания, или обработчик прерывания вызывается сразу?

Спасибо

PS. Я использую Линукс. Я использую язык программирования C, если это имеет значение.


person Arash Fotouhi    schedule 08.08.2013    source источник
comment
Какую ОС вы используете, или это голое железо?   -  person seanmk    schedule 08.08.2013
comment
Это зависит от реализации и от того, как модуль iterrupt обрабатывает прерывания. Но когда вы получаете прерывание более высокого порядка, когда вы находитесь в подпрограмме обслуживания прерывания, другое прерывание обслуживается, а затем возвращается обратно в ISR для выполнения более старого прерывания. Это называется tail chaining.   -  person Uchia Itachi    schedule 08.08.2013
comment
@seanmk Я использую Linux. Я добавлю это к вопросу.   -  person Arash Fotouhi    schedule 08.08.2013


Ответы (2)


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

РЕДАКТИРОВАТЬ: Теперь, когда я знаю, что вы используете Linux, эта ссылка может оказаться полезной: Может ли обработчик прерывания быть вытеснен одним и тем же обработчиком прерывания?

По сути, ответ на ваш вопрос заключается в том, что Linux маскирует прерывание, когда оно утверждается, поэтому оно не будет вытеснять себя, если при регистрации ISR не будет передан определенный флаг.

Вот соответствующая цитата:

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

person seanmk    schedule 08.08.2013
comment
Флаг IRQF_DISABLED (старый SA_INTERRUPT) был удален из ядра Linux, начиная с версии 2.6.35. Теперь любой ISR работает с отключенными прерываниями для этого процессора. - person Jonatan Goebel; 08.08.2013

Не могу говорить обо всех обработчиках прерываний, но на дюжине платформ, для которых я написал аппаратную подпрограмму обслуживания прерываний (ISR), механика была такова, что универсально предотвращала повторный вход.

С другой стороны, ISR для программных прерываний из двух, которые я написал, были специально созданы для обнаружения и обработки повторной активности.

Как упоминалось в другом месте, это, вероятно, зависит от ОС/платформы.

person chux - Reinstate Monica    schedule 08.08.2013