Подробное исследование работы клавиатуры ПК и обслуживающих ее прерываний, страница 5

Однако стартовый бит не теряется. Он используется для установки триггера S74 в высокое состояние (2), что переводит линию запроса прерываний (IRQ1) INT 09H в высокое состояние (3). Этот триггер одновременно посылает низкий уровень процессору 8048 на клавиатуре, т.е. дает "красный свет" по той же самой линии данных, по которой был передан скан-код. Это запрещает любую передачу данных клавиатурой и переводит процессор 8048 в режим буферизации, описанный ранее.

Аббревиатура IRQ (дословно — "запрос на прерывание" — Interrupt Request) обозначает сигнал, посылаемый устройством, требующим обслуживания. Для разрешения конфликтов, неизбежно возникающих при одновременных запросах от нескольких устройств, каждому устройству присваивается некоторый уровень приоритета. Считается, что наиболее приоритетное устройство имеет уровень 0 (в IBM PC это системный таймер). Для простоты номер приоритета дописывается к "IRQ". Таким образом IRQ1 означает запрос на прерывание от клавиатуры, имеющей уровень приоритета 1. Для работы с поступающими сигналами IRQ в компьютере есть Программируемый Контроллер Прерываний (PIC) 8259, который и решает на приоритетной основе, какое из заданий обслуживать первым при одновременном поступлении нескольких запросов. PIC имеет восемь линий IRQ. (PIC однако не ограничен восемью запросами. Запросы можно соединять цепью, используя один PIC в качестве ведущего, а остальные в качестве ведомых. В AT и PS/2 используется дополнительный ведомый PIC для подключения дополнительных линий IRQ.) Когда PIC получает запрос, он устанавливает в Регистре Запросов Прерываний (IRR) бит, соответствующий этому запросу. IRR — это 8-разрядный регистр, каждый бит которого используется для отслеживания IRQ, нуждающегося в обслуживании. Арбитр приоритетов PIC использует этот регистр для выбора IRQ с наивысшим приоритетом.

Для примера допустим, что запрос от клавиатуры IRQ1 является единственным, требующим обслуживания. PIC устанавливает высокий уровень на линии INT, передающей запрос на обслуживание клавиатуры путем установки высокого уровня на линии Запроса Прерываний (INTR) ЦПУ. ЦПУ будет поддерживать запрос в том случае, если прерывания были перед этим разрешены инструкцией STI. Обычно прерывания разрешены, и запрещаются инструкцией CLI только тогда, когда программе необходимо выполнить критичное по времени задание, такое как изменение указателя стека (SP) или чтение из порта связи. Само прерывание, как уже говорилось ранее, также запрещает прерывания.

Предположим, что ЦПУ примет прерывание. Тогда оно закончит выполнение текущей инструкции, а затем подтвердит запрос прерывания PIC посылкой 3-битного кода Контроллеру Шины 8288 (ВС — Bus Controller), как показано в (5). Контроллер Шины обеспечивает проход данных к месту назначения. 3-битный код может управлять 7 типами прерываний ВС. Сюда входит и управление сигналом, используемым ЦПУ для приема или записи данных в память или порт. Таким образом происходит разделение между инструкциями IN и OUT, предназначенными для портов, и инструкцией MOV, относящейся к операциям с памятью.

В случае запроса на прерывание 3-битный код, посылаемый ЦПУ, является кодом сигнала подтверждения ("зеленым светом"), посылаемым контроллером шины 8288 назад в PIC 8259A по однобитной линии подтверждения прерываний (INTA) (б). Первый сигнал INTA, посылаемый в 8259A, используется для синхронизации, подобно стартовому биту при последовательной передаче. Следующее 3-битное подтверждение от ЦПУ к ВС посылает сигнал INTA в 8259 для начала обработки запроса. Далее 8259 устанавливает номер вектора прерываний для ЦПУ (в случае IRQ1 это INT 09H) (7). 8259 также устанавливает регистр ISR так, что PIC может отслеживать, какое прерывание в настоящий момент обслуживается.