Книга: Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform
Подключение обработчиков прерываний
Разделы на этой странице:
Подключение обработчиков прерываний
Для подключения к источнику прерывания воспользуйтесь функцией InterruptAttach() или InterruptAttachEvent().
#include <sys/neutrino.h>
int InterruptAttachEvent(int intr,
const struct sigevent *event, unsigned flags);
int InterruptAttach(int intr,
const struct sigevent* (*handler)(void *area, int id),
const void *area, int size, unsigned flags);
Параметр intr определяет, к какому прерыванию вы хотите подключить обработчик.
Передаваемые значения определяются стартовым кодом, который перед запуском QNX/Neutrino, среди прочего, инициализирует контроллер обработки прерываний. (В документации по QNX/ Neutrino приводится подробная информация о стартовом коде; см. Справочник по утилитам, главы startup-*
, например, startup-p5064
.)
Уже здесь функции InterruptAttach() и InterruptAttachEvent() различаются. Рассмотрим сначала функцию InterruptAttachEvent(), как более простую. Затем вернемся к рассмотрению функции InterruptAttach().
Подключение с помощью функции InterruptAttachEvent()
Функция InterruptAttachEvent() принимает два дополнительных аргумента: event, который является указателем на структуру struct sigevent
, описывающую генерируемое событие, а также flags. Функция InterruptAttachEvent() сообщает ядру, что при обнаружении прерывания должно быть сгенерировано событие event, после чего данный уровень прерываний должен быть демаскирован. Отметьте, что за то, как интерпретировать событие и какой поток перевести в состояние READY, отвечает ядро, при обнаружении прерывания.
Подключение с помощью функции InterruptAttach()
При использовании функции InterruptAttach() мы определяем другой набор параметров. Параметр handler — это адрес функции, которую надо вызвать. Как видно из прототипа, функция handler() возвращает структуру struct sigevent
(указывающую на тип события, которое следует сгенерировать) и принимает два параметра. Первый передаваемый параметр — area, тот самый, который передается функции InterruptAttach(). Второй параметр, id, — идентификатор прерывания, его также возвращает InterruptAttach(). Он применяется для идентификации прерывания, а также для маскирования, демаскирования, блокировки и деблокировки прерывания. Четвертый параметр InterruptAttach(), size, указывает размер (в байтах) области данных, которая передается в параметре area. И, наконец, пятый параметр — flags — тот же самый параметр flags, что и у InterruptAttachEvent(); мы скоро к нему вернемся.
Теперь, когда вы подключились к прерыванию
Допустим, что вы уже вызвали функцию InterruptAttachEvent() или InterruptAttach().
Ниже приведен фрагмент программы, в котором реализовано подключение ISR к вектору аппаратного прерывания, идентифицируемого константой HW_SERIAL_IRQ:
#include <sys/neutrino.h>
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 %dn",
progname, W_SERIAL_IRQ);
perror(NULL);
exit(EXIT_FAILURE);
}
...
return (EXIT_SUCCESS);
}
Теперь, если по данному вектору произойдет прерывание, наш обработчик будет подвергнут диспетчеризации. При вызове функции InterruptAttach() ядро демаскирует указанный источник прерываний на уровне контроллера (если это прерывание еще не демаскировано, что имело бы место в случае многочисленных обработчиков одного и то же прерывания).
- Глава 6 Прерывания и обработка прерываний
- 5.4 Команда trap: обработка прерываний
- Задняя панель компьютера. Подключение нового компьютера
- Часть II Компьютерные сети и подключение к Интернету
- Подключение к Интернету
- Как осуществляется подключение новых устройств к компьютеру?
- Подключение к персональному компьютеру
- Как в Сетевых подключениях создать значок Подключение по локальной сети?
- 3.7. Подключение к сети Интернет
- Рис. 201. Выберите "Через высокоскоростное подключение, запрашивающее имя пользователя и пароль"
- Урок 3.1. Подключение к Интернету
- Подключение принтера