2.14 Обработка прерываний.
Под прерыванием понимается некоторое событие, заставляющее МП прервать выполнение текущей программы и перейти к подпрограмме обработки (обработчику) этого события. После того, как обработчик завершает свою работу, МП возвращается к прерванной программе, в ту точку, где она была прервана.
Все прерывания в системе можно разделить на внутренние и внешние. Внешние прерывания вызываются событиями, внешними по отношению к МП, а внутренние – событиями, происходящими внутри МП.
Конечно, обработка прерываний в МП различных типов имеет свои особенности, однако общая схема действий для любых МП остается одной и той же.
При обработке внутреннего прерывания МП «известна» его причина, а следовательно известен источник запроса. Поэтому, укрупнено, при внутреннем прерывании МП выполняет следующие действия:
· запоминает в стеке адрес возврата в прерываемую программу;
· определяет начальный адрес обработчика для известного источника запроса и передает управление этому обработчику;
· когда обработчик завершает свою работу, достает из стека адрес возврата, возвращая тем самым управление прерванной программе.
Внешние прерывания отличаются от внутренних тем, что МП неизвестен источник запроса. Следовательно, для внешнего прерывания в приведенную выше схему действий добавляется еще один этап: прежде чем определить начальный адрес обработчика, МП должен определить источник запроса.
Существуют два метода определения внешнего источника запроса:
· метод опроса;
· векторные прерывания.
Метод опроса. Этот метод можно реализовать, например, следующим образом. В систему вводится специальный порт (или несколько портов, при большом числе внешних источников прерываний). Все внешние запросы заводятся на входы этого порта, причем для каждого запроса отводится один бит порта. Одновременно, все запросы через схему ИЛИ заводятся на вход INTR МП. на рис. 18 приводится подобная схема для восьми внешних источников прерываний (IR7 – IR0).
Восприняв запрос на входе INTR, МП выполняет следующий фрагмент программы:
in al, port_int ; читаем port_int
shl al, 1 ; сдвигаем содержимое al на один разряд влево
jc obr7 ; если флаг cf установлен, то это запрос по ли
; нии IR7, и мы переходим к бработчику этого
; прерывания
shl al, 1 ; сдвигаем al еще на один разряд влево
jc obr6 ; если cf установлен, это запрос по IR6
и. т. д.
![]() |
Рис. 18.
Возможна ситуация, когда МП получает сразу несколько запросов на прерывание от разных внешних источников. Чтобы МП мог в такой ситуации функционировать, всем источникам запросов присваиваются приоритеты. При одновременном поступлении нескольких запросов, обслужен будет запрос с наивысшим приоритетом. Для нашего примера старший приоритет будет у IR7, а младший – у IR0. Для того чтобы изменить приоритеты в нашем примере на противоположные, достаточно использовать команду сдвига вправо.
Достоинством метода опроса являются небольшие аппаратурные затраты, а недостатком – медленная реакция МП на запросы с низким приоритетом.
Векторные прерывания. Под вектором прерывания обычно понимают начальный адрес обработчика данного прерывания. При данном методе в систему вводится специальная схема, называемая контроллером прерываний. Когда МП выставляет сигнал подтверждения прерывания, контроллер прерываний выдает МП вектор данного прерывания или информацию, позволяющую определить этот вектор. Более подробно векторные прерывания будут рассмотрены ниже при рассмотрении контроллера прерываний.
2.15 Система прерываний ВМ86.
В МП ВМ86 каждому источнику запроса на прерывание ставится в соответствие так называемый тип (номер) прерывания. Тип имеет формат 1 байт. То есть всего возможно 256 различных источников запросов. Для того чтобы МП по известному типу мог определить начальный адрес обработчика, в ОП создается таблица векторов прерываний. Каждый вектор представляет собой пару сегмент:смещение и однозначно задает начальный адрес обработчика прерывания данного типа. В ОП вектор занимает 4 байта. Таблица прерываний ВМ86 всегда располагается в младшем Кбайте ОП. Ее формат приведен на рис. 19.
Здесь displ и disph – соответственно младший и старший байт смещения, а segl и segh – младший и старший байт сегмента. Из рис.20 видно, что для определения адреса вектора достаточно взять тип и умножить его на 4. Именно так и вычисляет адрес вектора МП.
При восприятии любого прерывания ВМ86 выполняет следующую последовательность действий:
· запоминает в стеке содержимое регистра флагов f и адрес возврата (содержимое регистров cs и ip);
· по известному типу находит в таблице соответствующий вектор и загружает disp в ip, а seg – в cs, тем самым, передавая управление обработчику.
![]() |
Рис. 19
Этот процесс можно формально описать следующим образом:
sp ← (sp)-2 Аф = (ss)×16 + (sp) Аф ← (f) sp ← (sp)-2 Аф = (ss)×16 + (sp) Аф ← (cs) sp ← (sp)-2 Аф = (ss)×16 + (sp) Аф ← (ip) Аф = тип × 4 ip ← (Аф) Аф = тип × 4 + 2 cs ← (Аф) |
Так как таблица прерываний располагается по младшим адресам ОП, никакие сегментные регистры в формировании адреса вектора участия не принимают.
Помимо рассмотренных выше двух пунктов, МП также сбрасывает в ноль флаги if и tf, маскируя внешние прерывания и запрещая пошаговое выполнение обработчика.
Источники запросов для ВМ86 показаны в таблице 5.
Таблица 5
Источник запроса (вид прерывания) | Тип | Приоритет |
Прерывание по ошибке деления | 0 | 1 |
Прерывание по флагу tf | 1 | 4 |
Прерывание по входу NMI | 2 | 2 |
Прерывание по команде int3 | 3 | 1 |
Прерывание по команде into | 4 | 1 |
Программные прерывания (по команде int n, где n = 0 – 255) | 1 | |
Прерывания по входу INTR | 3 |
Здесь 1 – старший приоритет, 4 – младший.
Далее рассмотрим кратко имеющиеся виды прерываний.
Прерывание по ошибке деления (divided overflow). Это прерывание возникает при выполнении команд деления div и idiv, если формат результата (частного) превышает формат регистра-приемника. То есть, с точки зрения МП, результат деления равен бесконечности. В частности такая ситуация возникает при попытке деления на ноль.
Прерывание по флагу tf. Это прерывание возникает после выполнения любой очередной команды программы, если флаг tf установлен в единицу. При переходе к обработчику МП сбрасывает tf в ноль, поэтому обработчик выполняется не в пошаговом, а в автоматическом режиме. При возврате из обработчика по команде iret МП восстанавливает (выталкивает из стека) старое содержимое регистра флагов f. Флаг tf при этом снова устанавливается в единицу и МП возвращается в пошаговый режим. Обработчик этого прерывания обычно выводит на экран содержимое внутренних регистров МП.
Прерывание по команде int3. Это однобайтовая команда «прерывание в контрольной точке». Используется при отладке программы. Располагаются эти команды в критических местах программы (например, их туда может вставлять debugger). Обработчик этого прерывания также обычно выводит на экран содержимое регистров МП.
Прерывание по команде into. Команда проверяет состояние флага переполнения of, и если он установлен в единицу происходит прерывание.
Прерывание по команде int n. Это двухбайтная команда, в которой n задает тип прерывания и может принимать значение от 0 до 255. Таким образом с помощью такой команды мы можем вызвать любой обработчик. Собственно говоря, команда int n представляет из себя команду межсегментного вызова подпрограммы и в этом смысле подобна команде call far. Разница между этими командами в том, что int n занимает в памяти два байта, а call far – пять, int n сохраняет в стеке содержимое регистра флагов f, а call far не сохраняет. Команды int n используются для обращения к системным библиотечным подпрограммам (например, к средствам DOS и BIOS).
Прерывания по входам INTR и NMI были рассмотрены ранее.
2.16 Контроллер прерываний К1810ВН59 (i8259).
Данная микросхема предназначена для обслуживания двух различных групп МП. К первой группе относятся МП 580 и 8085, ко второй – 8086, 8088, 80286, 80386 и. т. д. Мы рассмотрим работу ВН59 при обслуживании МП второй группы. Подключение ВН59 к системной шине показано на рис. 20.

Рис. 20
Контроллер имеет восемь входов запросов на прерывание (IR7 – IR0). Восприняв запрос на одном из этих входов ВН59, формирует сигнал на выходе INT. Этот сигнал подается на вход INTR ВМ86. Если внешние прерывания не замаскированы, МП подтверждает прерывание, выставляя два сигнала на выходе INTA. Эти сигналы поступают на одноименный вход контроллера, и по второму из них ВН59 выставляет на ШД тип прерывания. Этот тип он формирует следующим образом: старшие пять разрядов типа задает программист при настройке контроллера, а на место младших трех разрядов ВН59 подставляет двоичный номер линии, по которой пришел запрос.
Несмотря на то, что внутренняя архитектура ВН59 включает в себя довольно много различных регистров, с точки зрения программиста, контроллер содержит всего два адресуемых устройства, выбор между которыми определяет сигнал на линии А0.
В системе могут использоваться несколько ВН59, соединенных каскадно. При этом один контроллер является ведущим, а все остальные ведомыми. Выходы INT ведомых контроллеров заводятся на входы IRi ведущего контроллера. Таким образом, максимальное число контроллеров в системе равно девяти, а максимально возможное число источников внешних прерываний равно 64. На рис. 21 показан пример каскадного соединения контроллеров.
Перед началом работы все контроллеры должны быть настроены. Для этого на каждый ВН59 надо подать три или четыре команды инициализации (ICW1 – ICW4). Три команды подаются, если в системе один контроллер прерываний,
Рис. 21
четыре – если несколько. Далее рассмотрим упрощенные форматы этих команд для второй группы процессоров.

ICW1 передается при А0=0 и имеет формат, приведенный на рис. 22.
Рис. 22
Если D1=0 – в системе несколько контроллеров и, следовательно, будет команда инициализации ICW3. При D1=1 – в системе один контроллер и ICW3 передаваться не будет.
ICW2 передается при А0=1 и имеет формат, приведенный на рис.23. Здесь Т7-Т3 – старшие пять разрядов типа прерывания.
Формат ICW3 различается для ведущего и ведомых контроллеров. Для ведущего: если в i-ом разряде ICW3 стоит единица, значит к линии IRi подключен ведущий контроллер. Для ведомого ICW3 имеет формат, приведенный на рис 24. Передается ICW3 при А0 = 1.
ICW4 передается при А0=1 и обычно имеет формат, приведенный на рис. 25.
Рис. 23
0 | 0 | 0 | 0 | 0 | N2 | N1 | N0 |
· Здесь N 2-0 – двоичный номер линии IR ведущего контроллера, к которой подключен данный ведомый.
Рис. 24
Рис. 25
В IBM PC/XT стоит один контроллер ВН59. Ему назначены системные адреса 20h (А0=0) и 21h (А0=1). Настройка ВН59 в XT производится следующей последовательностью команд:
mov al, 13h ; передаем ICW1, ICW3 не будет
out 20h, al
mov al, 8 ; передаем ICW2. Старшие разряды типа задаем
out 21h, al ; равными 00001. Таким образом, для линии IR0
; (прерывание от канала 0 таймера) контроллер
; будет вырабатывать тип = 08h, для линии IR1
; (прерывание от клавиатуры) – тип = 09h, и. т. д.
mov al,1 ; передаем ICW4
out 21h, al
Начиная с PC/AT, в системе стоит два ВН59. При этом все вышесказанное для ВН59 в ХТ является справедливым для ведущего в АТ.
После того как ВН59 настроен, все остальные настроечные слова он воспринимает как команды управления. Всего имеется три таких команды. Обычно их обозначают OCW1, OCW2 и OCW3.
OCW1 передается при А0 = 1. Если в i-ом разряде OCW1 стоит единица, вход IRi контроллера маскируется и запросы на этом входе ВН59 восприниматься не будут до тех пор, пока программист его не размаскирует.
Во избежание конфликтов всем входам IR контроллера присваиваются приоритет. Если программист не задает приоритеты линий IR, по умолчанию линии IR0 присваивается старший, а линии IR7 – младший приоритет. Команда OCW2 (передается при А0 = 0) позволяет менять приоритеты линий IR.
Пользователь должен знать о следующей важной особенности работы контроллера ВН59. Если контроллер настроен на «обычный конец прерывания», то восприняв запрос на линии IRi он автоматически маскирует эту линию и все линии IR с более низкими приоритетами. Иногда говорят что контроллер «ставит штору». Снимать штору самостоятельно контроллер не умеет. Это должен делать программист передав в контроллер команду управления OCW2 формата: 20h. Как правило штора снимается в конце обработчика. Например в конце обработчика прерывания от клавиатуры должны стоять две команды:
mov al,20h out 20h, al | ; снимаем штору в ХТ или у ведущего ; в АТ |
Если эти команды не поставить, клавиатура будет заблокирована.
OCW3 передается при А0 = 0 и на практике используется редко.




