Контроллер прерываний (PIC) 8259A является периферийным устройством, которое связано с процессором через ту или иную шину расширения ввода-вывода. По этой шине процессор может обращаться к регистрам контроллера, программируя его режимы и управляя им, а также получать от контроллера 8-битный вектор прерывания, для чего в интерфейсе системной шины процессора и шины расширения имеется специальная команда подтверждения прерывания (INTA). Контроллер 8259А имеет 8 входов запросов от источников и один выход общего запроса. Каждому из входов соответствует свой вектор; программированием регистров контроллера задается номер вектора для входа 0, остальным входам соответствуют последующие номера векторов. Каждый вход может быть программно замаскирован — тогда он не вызывает сигнал общего запроса. Контроллер занимает два адреса в пространстве ввода-вывода, программное обращение позволяет управлять режимами работы контроллера, а также приоритетами и масками запросов. Кроме того, контроллер позволяет работать в режиме опроса (poll mode), или полита (polling), обеспечивая идентификацию источника прерывания (с учетом приоритетов) без выработки общего запроса.
С каждым входом запроса в контроллере связано по одному биту в регистрах IRR, IMR и ISR; бит 0 каждого из этих регистров относится ко входу 0, бит 1 — ко входу 1, бит 7 — ко входу 7:
♦ IRR (Interrupt Request Register) — регистр запросов прерываний. В этом ре гистре бит устанавливается при обнаружении сигнала прерывания на соот ветствующем входе, независимо от маски.
♦ IMR (Interrupt Mask Register) — регистр масок прерываний. Единичное зна чение бита означает замаскированность данного входа — по запросу с замас кированного входа общий запрос прерывания не генерируется.
♦ ISR (Interrupt Service Register) — регистр обслуживаемого прерывания.
Контроллер прерываний позволяет программировать свои входы на чувствительность к уровню или перепаду сигнала.
♦ Чувствительность к уровню (level sensitive) означает, что контроллер пре рываний вырабатывает запрос прерывания процессора по факту обнаруже ния определенного уровня на входе IRQx. Если к моменту завершения обра ботки этого запроса (после записи команды EOI в регистр контроллера прерываний) контроллер снова обнаруживает активный уровень на том же входе DRQx, то он снова формирует запрос на прерывание процессора.
♦ Чувствительность к перепаду (edge sensitive) означает, что контроллер пре рываний вырабатывает запрос прерывания процессора только по факту об наружения перепада (на ISA — положительного) на входе IRQx. Повторно за прос по этому входу возможен только по следующему такому же перепаду, то есть сигнал предварительно должен вернуться в исходное состояние.
В любом случае сигнал запроса аппаратного прерывания IRQx должен удерживаться генерирующей его схемой, по крайней мере, до цикла подтверждения прерывания процессором — именно в этот момент PIC определяет самый приоритетный незамаскированный запрос и по нему формирует вектор. Если к этому моменту запрос окажется снятым, источник прерывания корректно идентифицирован не будет, и контроллер сообщит ложный вектор прерывания (spurious interrupt), соответствующий его входу с максимальным номером (IRQ7 для первого контроллера и IRQ15 для второго). Обычно периферийные устройства строят так, что сигнал запроса сбрасывается при обращении программы обслуживания прерывания к соответствующим регистрам адаптера, так что ложных прерываний возникать не должно.
Один контроллер PIC 8259A позволяет обслуживать 8 запросов прерываний; в PC/AT применяется каскадное соединение двух контроллеров, один из которых является ведущим, другой — ведомым. Ведущий контроллер 8259А#1 обслуживает запросы 0, 1, 3-7; его выход подключается ко входу запроса прерываний процессора. К его входу 2 подключен ведомый контроллер 8259А#2, который обслуживает запросы 8-15. При этом поддерживается вложенность приоритетов — запросы 8-15 со своим рядом убывающих приоритетов вклиниваются между запросами 1 и 3 ведущего контроллера, приоритеты запросов которого также убывают с ростом номера. В XT каскадирование не применялось, и один контроллер 8259 А обслуживал все 8 линий запросов.
В IBM PC/XT/AT используется специальный режим вложенных прерываний с фиксированным приоритетом и автоматическим неспецифическим завершением. После инициализации (процедурой POST и при загрузке ОС) все неиспользуемые входы контроллеров замаскированы (на запросы прерываний не реагируют), а их векторы прерываний указывают на «заглушку» — процедуру с единственной инструкцией IRET. Для подключения обработчика прерывания от устройства первым делом следует загрузить обработчик в память и установить указатель на него в таблице прерываний. Далее следует демаскировать соответствующий ему вход в контроллере прерываний. Если обработчик прерывания удаляется из памяти, предварительно должен быть замаскирован соответствующий ему вход контроллера. Все изменения в таблице прерываний должны выполняться при замаскированных прерываниях, чтобы избежать попытки использования вектора в процессе его модификации (это приведет к «вылету» программы — обращению по некорректному адресу).
В современных системных платах функции контроллеров прерываний возлагаются на чипсет, который может иметь и более гибкие средства управления, чем пара контроллеров 8259А. Процедура инициализации контроллеров может и отличаться от традиционной, но ею занимается тест POST, который «знает» особенности системной платы. Однако в операционном режиме всегда сохраняется программная совместимость с 8259А. При работе с контроллером прерываний от программы требуется лишь управлять маской своего запроса (при инициализации программы нужно обнулить маску требуемого запроса) и корректно завершать обработку прерываний. Каждая процедура обработки аппаратного прерывания должна завершаться командой EOI (End Of Interruption), посылаемой контроллеру:
♦ для 1-го контроллера — посылка байта 20h по адресу 020h;
♦ для 2-го контроллера — посылка байта 20h по адресу OAOh; программный вызов прерывания OAh — завершение для ведущего контроллера; для неко торых старых версий BIOS был необходим явный сброс маски запроса в ре гистре 2-го контроллера.
Некорректно завершенная процедура не позволит повторно использовать данный или другие запросы прерываний.