Когда мы используем irq_set_chained_handler, линия irq будет отключена или нет?

Когда мы используем irq_set_chained_handler, линия irq не будет отключена или нет, когда мы обслуживаем связанный обработчик, как в случае с request_irq.


person valmiki    schedule 21.12.2015    source источник
comment
Это продолжение этого вопрос.   -  person Sam Protsenko    schedule 23.12.2015


Ответы (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 с помощью этот коммит. Подробнее об этом можно узнать здесь.

person Sam Protsenko    schedule 22.12.2015

См. 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 вызовет что-то вроде этой последовательности в своем обработчике прерываний:

person Punit Vara    schedule 22.12.2015