Шрифт:
Первое, что бросается в глаза, — что все переменные, к которым обращается ISR, должны быть объявлены как
С помощью ключевого слова
Следующее, на что мы обращаем внимание — это прототип самого обработчика прерывания. Он обозначен как
Наконец, обратите внимание на то, что решение, передавать или не передавать событие потоку, принимает сам обработчик. Здесь мы генерируем событие только в случае прерывания по изменению регистра состояния модема (MSR) (событие определяется переменной event, которая передается обработчику прерывания в момент его подключения). Во всех других случаях мы игнорируем прерывание (и обновляем кое-какие глобальные переменные); однако, источник прерывания мы очищаем во всех случаях. Это выполняется считыванием порта ввода/вывода с помощью вызова in8.
Если бы мы должны были переписать вышеприведенную программу с применением функции InterruptAttachEvent, это бы выглядело так: