Наша группа использует специальный драйвер для взаимодействия четырех 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())
?