Главная » Ассемблер, Железо » Контроллер прерываний

0

Устройства ввода информации сообщают центральному процессору о поступлении новых данных с помощью сигналов прерываний. Прерывания от клавиатуры, мыши PS/2-типа и других периферийных устройств, прежде чем поступить в процессор, проходят через контроллер прерываний, где подвергаются предварительной обработке. Контроллер позволяет управлять приоритетами, прохождением сигналов и адресами векторов прерываний.

IBM AT состоял из двух микросхем Intel 8259, включенных в режиме каскадирования (рис. 1.4). Первая микросхема была ведущей, а вторая — ведомой (ведомый контроллер подключен к входу IRQ2 ведущего). На входы IRQO, IRQ1, IRQ3-IRQ7 ведущей микросхемы и на входы IRQ8-IRQ15 ведомой поступают запросы прерываний, из которых выбирается немаскированный запрос с наивысшим приоритетом, после чего контроллер вырабатывает сигнал INT и передает в процессор вектор прерывания.

Рис. 1.4. Традиционный порядок подключения внешних устройств к контроллеру прерываний

Вектор формируется путем сложения базового значения (записанного в соответствующий регистр микросхемы) и номера линии, на которую поступил запрос (ведущей микросхеме IRQ0 соответствует линия О, IRQ7 — линия номер 7; ведомой микросхеме IRQ8 соответствует линия О, IRQ15 — линия 7). Базовый вектор ведущей микросхемы в реальном режиме DOS имеет значение 08h, базовый вектор ведомой — 70h. Соответственно, ведущая схема вырабатывает вектора с номерами 08h-0Fh, ведомая — с номерами 70h-77h (табл. 1.7). Приоритеты запросов прерывания (по убыванию) располагаются в следующем порядке: IRQO, IRQ.1, IRQ8-IRQ15, IRQ3-IRQ7.

Таблица 1.7. Аппаратные прерывания АТ-совместимых компьютеров

Преры

Номер

Адрес

Источник сигнала

вание

вектора

вектора

прерывания

IRQ0

Q8h

0000:0020h

Системный таймер

IRQ1

09h

0000:0024h

Клавиатура

IRQ2

OAh

0000:0028h

Ведомая микросхема контроллера

IRQ3

OBh

0000:002Ch

Последовательный порт COM2

IRQ4

OCh

0000:0030h

Последовательный порт СОМ 1

IRQ5

ODh

0000:0034h

Параллельный порт LPT2

IRQ6

OEh

0000:0038h

Контроллер дисководов гибких дисков

IRQ7

OFh

0000:003Ch

Параллельный порт LPT1

IRQ8

70h

0000:01 COh

Часы реального времени

IRQ9

71h

0000:01C4h

Любое устройство РпР

IRQ 10

72h

0000:01C8h

Любое устройство РпР

IRQ11

73h

0000:01 CCh

Любое устройство РпР

IRQ12

74h

0000:01 DOh

Мышь PS/2-типа

IRQ13

75h

0000:01 D4h

Математический сопроцессор

IRQ14

76h

0000:01 D8h

Контроллер жесткого диска № 1

IRQ15

77h

0000:01 DCh

Контроллер жесткого диска № 2

Все последующие модели АТ-совместимых компьютеров вынуждены имитировать работу микросхем 18259 с целью сохранения совместимости со старым программным обеспечением. Большая часть возможностей указанных микросхем, к счастью для программистов, не используется в АТ-совместимых персональных компьютерах: приоритеты прерываний, поступающих от периферийных устройств, и адреса соответствующих векторов жестко зафиксированы (устанавливаются BIOS в процессе начальной загрузки). Полностью перепрограммировать контроллер приходится только при переключении процессора в защищенный режим, так как при этом необходимо изменить номера векторов прерываний, а работа с контроллером в обычном реальном режиме DOS требует выполнения только двух типов операций:

• маскирование и размаскирование прерываний по отдельным линиям;

• посылка сигнала завершения обработки прерывания контроллеру.

Чтобы маскировать (запретить) прерывание, необходимо установить в 1 соответствующий ему бит в регистре маски (номера разрядов маски соответствуют номерам линий сигналов прерывания). Поскольку в маске должен быть изменен только один разряд, а остальные нужно сохранить в исходном состоянии, то вначале требуется прочитать содержимое регистра маски, выполнить операцию изменения соответствующего разряда, а затем записать полученное значение обратно в регистр маски. Между двумя последовательными обращениями к одному и тому же порту рекомендуется вставлять циклы задержки, поскольку контроллер по сравнению с процессором работает слишком медленно. Регистр маски прерываний ведущего контроллера доступен для записи и считывания через порт 21h, ведомого контроллера — через порт Alh.

Например, чтобы запретить прохождение сигнала прерывания от клавиатуры IRQ1 (ведущий контроллер, линия № 1), нужно выполнить следующий ряд команд:

: Прочитать регистр маски ведущего контроллера

in AL,21h

; Установить второй разряд маски

or AL.lOb

; Вставить задержку

jmp short $+2

jmp short $+2

; Записать маску обратно в регистр out 21h,AL

Когда программист устанавливает собственный обработчик прерывания, он должен проделать обратную операцию — размаскировать линию сигнала запроса от соответствующего устройства. Например, для драйвера мыши PS/2-типа, обрабатывающего прерывание IRQ12 (ведомый контроллер, линия № 4), участок кода, в котором выполняется размаскирование, выглядит следующим образом:

; Прочитать регистр маски ведомого контроллера

in AL.OAlh

; Обнулить четвертый разряд маски

and AL,11101111b

; Вставить задержку

jmp short $+2

jmp short $+2

; Записать маску обратно в регистр out OAlh.AL

Обработка сигнала прерывания выполняется контроллером следующим образом. Вначале выполняется проверка маски, и если сигнал не запрещен, то происходит проверка его приоритета. Если нет других сигналов или данный запрос имеет наивысший приоритет, то контроллер посылает микропроцессору сигнал запроса INT. Если маскируемые прерывания разрешены (установлен флаг IF в регистре флагов процессора), то процессор выдает контроллеру сигнал подтверждения прерывания INTA. После получения сигнала INTA контроллер выдает процессору номер вектора прерывания и переводит запрос в разряд обслуживаемых (соответствующий бит в регистре поступивших запросов контроллера сбрасывается, а бит в регистре обслуживаемых запросов устанавливается). Процессор начинает обработку прерывания с того, что записывает в стек содержимое регистра флагов и сбрасывает флаг IF. В результате перечисленных выше действий в момент начала обработки прерывания все маскируемые прерывания в процессоре запрещены, а контроллер не пропускает запросы прерываний, приоритеты которых ниже, чем у запроса, обрабатываемого процессором. Кроме того, следующие прерывания от устройства, запрос которого поступил на обработку, также будут заблокированы контроллером. Процессор должен разрешить обработку маскируемых прерываний (установить флаг IF командой STI), как только будет выполнен критический участок кода процедуры обработки прерывания, то есть группа операций, которую прерывать нельзя. Часто процедура вообще не содержит критических участков, и тогда команду STI следует установить в самом начале обработчика прерывания. С другой стороны, весь код процедуры может не допускать прерывания: в этом случае команда STI не используется, а флаг прерываний автоматически восстанавливается при выходе из процедуры по команде IRET. Разрешить контроллеру обрабатывать прерывания с таким же или более низким приоритетом следует как можно раньше, чтобы не возникала угроза потери информации от низкоприоритетных устройств. Как только будет завершен участок кода, не допускающий повторного прерывания от того же устройства, необходимо послать контроллеру команду EOI (End Of Interrupt). Регистр команд ведущей микросхемы доступен для записи через порт 20h, регистр команд ведомой — через порт AOh. Например, в процедуру обработчика прерывания от клавиатуры обязательно должна быть включена последовательность команд:

: Записать в регистр AL код команды E0I

mov AL,20h

: Послать команду E0I в ведущую микросхему out 20h,AL

Прерывание, поступившее через ведомую микросхему, блокирует также и обработку всех прерываний с более низкими приоритетами в ведущей. Поэтому процедура обработки такого прерывания должна посылать команду E0I не только в ведомую, но и в ведущую микросхему:

; Записать в регистр AL код команды E0I

mov AL,20h : Послать команду E0I в ведомую микросхему

out OAOh.AL

; Послать команду E0I в ведущую микросхему out 20h.AL

Источник: Кулаков В. К90 Программирование на аппаратном уровне: специальный справочник (+дискета). 2-е издание. — СПб.: Питер, 2003. — 847 е.: ил.

По теме:

  • Комментарии