InterruptMask()

Маскировать аппаратное прерывание

Прототип:

#include <sys/neutrino.h>
int InterruptMask( int intr,
int id );

Аргументы:

intr
Прерывание, которое необходимо замаскировать.
id
Идентификатор, возвращаемый InterruptAttach() или InterruptAttachEvent(), либо -1, если требуется указать ядру не отслеживать количество маскирований и размаскирований для каждого обработчика.


Note: Идентификатор id игнорируется, если не использовался флаг _NTO_INTR_FLAGS_TRK_MSK при подключении обработчика.

Библиотека:

libc

Описание:

Системный вызов InterruptMask() маскирует аппаратное прерывание intr для обработчика с идентификатором id. Может вызваться из потока или из обработчика прерывания. Перед вызовом этой функции поток должен запросить привилегии ввода-вывода, вызвав:

ThreadCtl( _NTO_TCTL_IO, 0 );

Если поток этого не сделает, он может получить SIGSEGV при вызове InterruptMask().

Для размаскирования прерывания вызвавается InterruptUnmask().

Ядро автоматически размаскирует прерывание, когда к нему с помощью InterruptAttach() подключается первый обработчик, и маскирует его, когда отключается последний обработчик.

Этот вызов обычно используется для прерываний, срабатывающих по уровню, и/или когда простого обработчика прерывания недостатчно для его сброса. Поскольку прерывание срабатывает по уровню, нельзя выйти из обработчика с активной и незамаскированной линией прерывания (это приведёт к зацикливанию). InterruptMask() позволяет замаскировать прерывание в обработчике и запланировать выполнение оставшейся работы по обмену данными с устройством и очистке источника прерывания в потоке. После сброса прерывания поток должен вызвать InterruptUnmask(), чтобы размаскировать прерывание.

Чтобы отключить все аппаратные прерывания, используется функция InterruptLock().


Note: Чтобы обеспечить совместимость, используйте InterruptMask() вместо самостоятельного взаимодействия с контроллером прерываний напрямую.

Вызовы InterruptMask() вложенные; прерывание не размаскируется до тех пор, пока InterruptUnmask() не будет вызвана столько же раз, сколько была вызвана InterruptMask().

Возвращаемое значение:

Счётчик текущего количества маскирований.

Если возникла ошибка, функция возвращает -1, код ошибки записывается в errno.

Коды ошибок:

EINVAL
Недопустимый номер прерывания intr.
ESRCH
Параметр id не является идентификатором, возвращаемым InterruptAttach(), InterruptAttachEvent() или -1.

Классификация:

ЗОСРВ «Нейтрино»

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Да
Обработчик сигналов
Да
В потоке
Да

Тематические ссылки:

InterruptAttach(), InterruptAttachEvent(), InterruptDisable(), InterruptEnable(), InterruptLock(), InterruptUnlock(), InterruptUnmask(), ThreadCtl()




Предыдущий раздел: Описание API системной библиотеки