Ниже приведен фрагмент программы, в котором реализовано подключение ISR к вектору аппаратного прерывания, идентифицируемого константой HW_SERIAL_IRQ:
#include
int InterruptID;
const struct sigevent* intHandler(void *arg, int id) {
...
}
int main (int argc, char **argv) {
interruptID =
InterruptAttach(HW_SERIAL_IRQ, intHandler, sevent,
sizeof(event), 0);
if (interruptID == -1 {
fprintf(stderr, "%s: ошибка подключения к IRQ %d\n",
progname, W_SERIAL_IRQ);
perror(NULL);
exit(EXIT_FAILURE);
}
...
return (EXIT_SUCCESS);
}
Теперь, если по данному вектору произойдет прерывание, наш обработчик будет подвергнут диспетчеризации. При вызове функции
Отключение обработчика прерывания
Когда вы закончили с обработчиком прерывания, вы можете пожелать уничтожить связь между ним и вектором:
int InterruptDetach(int id);
Я сказал «можете», потому что обрабатывающие прерывания потоки, как правило, используются в серверах, а серверы обычно не завершаются. Это часто ведет к предрассудку, что хорошо организованному серверу никогда не понадобится самостоятельно вызывать
Продолжая вышеприведенный пример, если бы мы захотели отключиться от прерывания, то мы использовали бы следующий код:
void terminateInterrupts(void) {
InterruptDetach(interruptID);
}
Если это последний ISR, связанный с данным вектором прерывания, то ядро автоматически произведет маскирование источника прерывания на уровне контроллера, чтобы таких прерываний больше не возникало.
Параметр
Последний параметр,
_NTO_INTR_FLAGS_END
Указывает, что данный обработчик должен сработать после всех других обработчиков данного прерывания (если они есть).
_NTO_INTR_FLAGS_PROCESS
Указывает на то, что данный обработчик связан с процессом, а не с потоком. Что из этого вытекает, так это условие автоматического отключения обработчика. Если вы определяете этот флаг, обработчик будет автоматически отключен от источника прерывания при завершении процесса. Если этот флаг не определен, обработчик прерывания будет отключен от источника, когда завершится поток, подключивший его.
_NTO_INTR_FLAGS_TRK_MSK