Должен ли мой обработчик прерываний отключать прерывания или процессор ARM делает это автоматически?

Наша группа использует специальный драйвер для взаимодействия четырех UART MAX3107 на общей шине I2C. Прерывания четырех MAX3107 подключены (т. Е. Общее прерывание через логику или)) к выводу GPIO на процессоре ARM9 (модуль LPC3180). Когда одно или несколько из этих устройств прерываются, они подтягивают линию GPIO, которая сконфигурирована как прерывание, чувствительное к уровню, на низкий уровень. Мой вопрос касается необходимости или отсутствия отключения определенной строки прерывания в коде обработчика. (Добавлю, что у нас Linux 2.6.10).

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

Код обработчика прерывания, который мы используем, включает disable_irq_nosync(irqno); в самом начале обработчика и соответствующий enable_irq() в конце обработчика. Если процессор ARM уже отключил линию прерывания (аппаратно), каков эффект этих вызовов (т.е.вызов disable_irq_nosync(), за которым следует вызов enable(irq())?


person Jim Luby    schedule 12.01.2013    source источник
comment
Раньше я никогда не обнаруживал, что явно повторно включаю прерывания на источнике GPIO, когда я их использовал - основной обработчик прерывания ядра должен заботиться об очистке и повторном включении источника на контроллере прерываний, чтобы не было опасность прерывания при обработке первого. Единственное, о чем я могу думать, это то, что обработчик был написан для одновременного присоединения к нескольким строкам. Я не думаю, что вам понадобятся эти звонки.   -  person marko    schedule 12.01.2013


Ответы (1)


Из документации Информационного центра Arm:

При входе в исключение (прерывание):

  • запросы прерывания (IRQ) отключены для всех исключений

  • запросы быстрого прерывания (FIQ) отключены для исключений FIQ и Reset.

Далее говорится:

Обработка FIQ вызывает отключение IRQ и последующих FIQ, предотвращая их обработку до тех пор, пока обработчик FIQ не включит их. Обычно это делается путем восстановления CPSR из SPSR в конце обработчика.

Таким образом, вам не нужно беспокоиться об их отключении, но вам нужно беспокоиться о их повторном включении.

Вам нужно будет включить enable_irq () в конце вашей процедуры, но вам не нужно ничего отключать в начале. Я бы не подумал, что вызов disable_irq_nosync (irqno) в программном обеспечении после того, как он был вызван на оборудовании, повлияет на что-нибудь. Поскольку вызов оборудования наиболее определенно вызывается до того, как вызов программного обеспечения получит шанс принять его. Но, вероятно, лучше удалить его из кода, чтобы следовать соглашению и не сбивать с толку следующего программиста, который взглянет на него.

Больше информации здесь:

Информационный центр Arm

person Jimmy Johnson    schedule 12.01.2013
comment
ISR OP вызывается основной ISR ядра Linux; помните, что есть единственная линия прерывания. - person marko; 12.01.2013
comment
Другие варианты: использовать отладчик и проверить регистры, чтобы увидеть, что на самом деле происходит. Посмотрите исходный код для реализации ваших вызовов (если вы используете Linux, он должен быть доступен в репозитории). Когда вы имеете дело с абстракцией с помощью C на этом низком уровне, где реализации могут быть очень тонкими от чипа к чипу, иногда просто лучше немного покопаться в базовом ассемблерном коде и убедиться в этом сам. - person Jimmy Johnson; 12.01.2013
comment
Привет, Марко - Когда в документации ARM говорится, что процессор автоматически отключает одиночное прерывание Normal IRQ, это тот случай, когда все прерывания, сопоставленные (через контроллер прерываний ARM) с одним IRQ, отключаются, или только одно прерывание, связанное с вывод GPIO? - Спасибо - Джим - person Jim Luby; 12.01.2013
comment
Спасибо за совет, Марко и BeenCoding2Long. - Джим - person Jim Luby; 13.01.2013
comment
Если процессор ARM автоматически отключает локальные прерывания при обработке прерываний, как реализовать вложение прерываний? - person Jams.Liu; 11.06.2019