Когда мы используем irq_set_chained_handler, линия irq не будет отключена или нет, когда мы обслуживаем связанный обработчик, как в случае с request_irq.
Когда мы используем irq_set_chained_handler, линия irq будет отключена или нет?
Ответы (2)
Неважно, как было настроено прерывание. При возникновении любого прерывания все прерывания (для этого ЦП) будут отключены во время обработчика прерывания. Например, в архитектуре ARM первое место в коде C, где находится обработка прерываний, — это функция asm_do_IRQ()
(определенная в arch/arm/kernel/irq.c
). Он вызывается из ассемблерного кода. Для любого прерывания (независимо от того, было ли оно запрошено request_irq()
или irq_set_chained_handler()
) вызывается одна и та же функция asm_do_IRQ()
, и прерывания автоматически отключаются процессором ARM. См. этот ответ для подробностей.
Исторические заметки
Также стоит отметить, что некоторое время назад ядро Linux предоставляло два типа прерываний: «быстрые» и «медленные». Быстрые прерывания (при использовании флага IRQF_DISABLED
или SA_INTERRUPT
) выполнялись с отключенными прерываниями, и эти обработчики должны были быть очень короткими и быстрыми. С другой стороны, медленные прерывания выполнялись с повторно включенными прерываниями, потому что обработка обработчиков медленных прерываний может занять много времени.
В современных версиях ядра Linux все прерывания считаются «быстрыми» и выполняются с отключенными прерываниями. Прерывания с огромными обработчиками должны быть реализованы как многопоточные (или включить прерывания вручную в ISR с помощью local_irq_enable_in_hardirq()
).
Это поведение было изменено в ядре Linux v2.6.35 с помощью этот коммит. Подробнее об этом можно узнать здесь.
См. https://www.kernel.org/doc/Documentation/gpio/driver.txt
Это означает, что irqchip GPIO регистрируется с помощью irq_set_chained_handler() или соответствующей вспомогательной функции gpiochip_set_chained_irqchip(), и обработчик irqchip GPIO будет вызываться немедленно из родительского irqchip, при этом IRQ будут отключены. Затем GPIO irqchip вызовет что-то вроде этой последовательности в своем обработчике прерываний: