Маскировать аппаратное прерывание
#include <sys/neutrino.h>int InterruptMask( int intr,int id );
-1
, если требуется указать ядру не отслеживать количество маскирований и размаскирований для каждого обработчика.
Идентификатор id игнорируется, если не использовался флаг _NTO_INTR_FLAGS_TRK_MSK при подключении обработчика. |
libc
Системный вызов InterruptMask() маскирует аппаратное прерывание intr для обработчика с идентификатором id. Может вызваться из потока или из обработчика прерывания. Перед вызовом этой функции поток должен запросить привилегии ввода-вывода, вызвав:
ThreadCtl( _NTO_TCTL_IO, 0 );
Если поток этого не сделает, он может получить SIGSEGV
при вызове InterruptMask().
Для размаскирования прерывания вызвавается InterruptUnmask().
Ядро автоматически размаскирует прерывание, когда к нему с помощью InterruptAttach() подключается первый обработчик, и маскирует его, когда отключается последний обработчик.
Этот вызов обычно используется для прерываний, срабатывающих по уровню, и/или когда простого обработчика прерывания недостатчно для его сброса. Поскольку прерывание срабатывает по уровню, нельзя выйти из обработчика с активной и незамаскированной линией прерывания (это приведёт к зацикливанию). InterruptMask() позволяет замаскировать прерывание в обработчике и запланировать выполнение оставшейся работы по обмену данными с устройством и очистке источника прерывания в потоке. После сброса прерывания поток должен вызвать InterruptUnmask(), чтобы размаскировать прерывание.
Чтобы отключить все аппаратные прерывания, используется функция InterruptLock().
Чтобы обеспечить совместимость, используйте InterruptMask() вместо самостоятельного взаимодействия с контроллером прерываний напрямую. |
Вызовы InterruptMask() вложенные; прерывание не размаскируется до тех пор, пока InterruptUnmask() не будет вызвана столько же раз, сколько была вызвана InterruptMask().
Счётчик текущего количества маскирований.
Если возникла ошибка, функция возвращает -1
, код ошибки записывается в errno.
-1
. ЗОСРВ «Нейтрино»
InterruptAttach(), InterruptAttachEvent(), InterruptDisable(), InterruptEnable(), InterruptLock(), InterruptUnlock(), InterruptUnmask(), ThreadCtl()
Предыдущий раздел: Описание API системной библиотеки