Состояние системы обработки прерываний

We use cookies. Read the Privacy and Cookie Policy

Состояние системы обработки прерываний

Часто необходимо знать состояние системы обработки прерываний (например, прерывания запрещены или разрешены, выполняется ли текущий код в контексте прерывания или в контексте процесса).

Макрос irq_disabled(), который определен в файле <asm/system.h>, возвращает ненулевое значение, если обработка прерываний на локальном процессоре запрещена. В противном случае возвращается нуль. Два следующих макроса позволяют определить контекст, в котором в данный момент выполняется ядро.

in_interrupt()

in_irq()

Наиболее полезный из них — это первый макрос. Он возвращает ненулевое значение, если ядро выполняется в контексте прерывания. Это включает выполнение как обработчика прерывания, так и обработчика нижней половины. Макрос in_irq() возвращает ненулевое значение, только если ядро выполняет обработчик прерывания.

Наиболее часто необходимо проверять, выполняется ли код в контексте процесса, т.е. необходимо проверить, что код выполняется не в контексте прерывания. Это требуется достаточно часто, когда коду необходимо выполнять что-то, что может быть выполнено только из контекста процесса, например переход в приостановленное состояние. Если макрос in_interrupt() возвращает нулевое значение, то ядро выполняется в контексте процесса.

Таблица 6.2. Список функций управления прерываниями

Функция Описание local_irq_disable() Запретить доставку прерываний на локальном процессоре local_irq_enable() Разрешить доставку прерываний на локальном процессоре local_irq_save(unsigned long flags) Сохранить текущее состояние системы обработки прерываний на локальном процессоре и запретить прерывания local_irq_restore(unsigned long flags) Восстановить указанное состояние системы прерываний на локальном процессоре disable_irq(unsigned int irq) Запретить указанную линию прерывания с гарантией, что после возврата из этой функции не выполняется ни один обработчик данной линии disable_irq_nosync(unsigned int irq) Запретить указанную линию прерывания enable_irq(unsigned int irq) Разрешить указанную линию прерываний irqs_disabled() Возвратить ненулевое значение, если запрещена доставка прерываний на локальном процессоре, в противном случае возвращается нуль in_interrupt() Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — если в контексте процесса in_irq() Возвратить ненулевое значение, если выполнение производится в контексте прерывания, и нуль — в противном случае