Внешние прерывания. Программы обработки прерываний (или попросту обработчики прерываний) относятся к важнейшим программным средствам персональных компьютеров

Программы обработки прерываний (или попросту обработчики прерываний) относятся к важнейшим программным средствам персональных компьютеров. Можно выделить три типа прерываний:

1) внутренние;

2) внешние;

3) программные.

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

Организация обмена с внешними устройствами по прерываниям является наиболее эффективной. Но при этом перед проектировщиком компьютера возникает ряд проблем:

- как центральный процессор (ЦП) узнает, что внешнее устройство (ВУ) требует прерывание?

- как ЦП выяснит, какое ВУ требует прерывание?

- как разрешить конфликт, если одновременно придет несколько запросов на прерывания?

- как подавить эти запросы, если процессор выполняет какую-либо настолько важную работу, что прервать ее никак нельзя?

- как ЦП осуществит переход к нужной программе обработки прерывания?

- как вернуться к продолжению исходной программы?

Эти вопросы в различных микропроцессорах решаются по-разному.

У ЦП 80x86 имеется два входа для приема сигнала о прерываниях.

1) NMI – Nonmascable interrupt (немаскируемые прерывания)

Сигнал на вход NMI поступает, если возникает падение напряжения или ошибка в памяти. Процессор прекращает выполнение текущей программы и выполняет прерывание int 2.

2) INTR (interrupt). Этот сигнал можно замаскировать командой CLI. При этом флаг IF сбрасывается и сигнал INTR процессор игнорирует (сигнал по входу NMI сбросом IF не запретить). Установка IF выполняется командой STI. Это - ответ на вопрос 4.

Сигнал от ВУ поступает на вход INTR. Но перед этим сигнал поступает на программируемый контроллер прерываний – микросхему 8259A, которая носит название PIC (Programmable Interrupt Controller – программируемый контроллер прерываний).

Сначала рассмотрим более простую схему, принятую для IBM PC/XT. Контроллер имеет 8 входов для сигналов от ВУ – IR0-IR7 (IR-Interrupt Request – запрос прерывания) На вход IRn поступает сигнал от устройства IRQn (Interrupt ReQuest).


PIC (Programmable Interrupt Controller) – программируемый контроллер прерываний.


Эти 8 входов распределяются так:

IR0 – таймер (высший приоритет)

IR1 – клавиатура

IR2 – зарезервирован

IR3 – синхронный последовательный интерфейс

IR4 – асинхронный последовательный интерфейс

IR5 – жесткий диск

IR6 – гибкий диск

IR7 – принтер (низший приоритет)

Приоритеты перечисленных устройств расположены в порядке убывания. Таймер обладает наивысшим приоритетом.

В PIC имеется 8 битовый регистр ICW2 (Initialization Control Word) – слово приказов инициализации.

Запросы IRQ0 - IRQ7 обслуживаются векторами int 08h – int 0Fh, поэтому его структура такова:

 
 

Посмотрим, что происходит внутри контроллера, когда поступает сигнал IRQ 1 (клавиатура). 8-битовый регистр запроса на прерывание (IRR -Interrupt Request Register) устанавливает свой 1-й бит, т. е. фиксирует запрос. Далее установленный бит сравнивает с соответствующим битом маски из другого регистра IMR (Interrupt Mask Register – регистр маски прерываний). Если бит маски содержит 1, то прерывание замаскировано и сигнал блокируется. Если бит сброшен, то прерывание от устройства разрешено. Как запрещать и разрешать прерывания от конкретных устройств, мы узнаем позже.

Внутри PIC имеется схема-шифратор приоритетов. В момент поступления прерывания IR1 может обрабатываться другое прерывание. Номер обрабатываемого прерывания хранится в ISR (Interrupt Service Register – регистр обслуживаемых прерываний). Если шифратор приоритетов «видит», что поступил запрос более низкого уровня, чем обрабатываемый, он игнорирует его. В нашем примере, если обрабатывается прерывание от таймера, то прерывание от клавиатуры прерывания не вызывает. Тогда устройство ждет, когда будет сброшен соответствующий бит ISR. Если же обрабатывается низшее по уровню прерывание, то его выполнение прерывается.

Итак, пусть IR 1 может быть отработано. Тогда PIC выдает сигнал INT, и он попадает на вход INTR ЦП. Если флаг IF=1, то процессор выдает подряд 2 сигнала (Interrupt Acknowledge – подтверждение прерывания, черта означает, что логическому ДА соответствует низкий уровень сигнала). Эти сигналы устанавливают первый бит в ISR и сбрасывают первый бит IRR. Для IRQ1 полный байт 00001001B=09h. 2-й сигнал вынуждает PIC поместить на шину данных содержание ICW2. Это и есть номер вектора прерываний. Его читает ЦП и по содержимому вектора переходит на выполнение соответствующей программы обработки прерывания (ISR), по уже известной схеме.

Итак, запросы IRQ0 –IRQ7 спроецированы на прерывания INT 08h – INT 0Fh, INT 08h – прерывание таймера, INT 09h – прерывание клавиатуры и т. д.

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

EOI = 20h; End of interrupt

INTA00 = 20h; адрес порта PIC

сli

mov al, EOI

out INTA00, al

<восстановление регистров>

IRET

В частности, восстанавливается регистр флагов и тогда IF=1.

Посылка сигнала EOI вынуждает PIC очистить ISR (регистр обслуживаемых прерываний) и тогда может обрабатываться новый запрос. Если не выполнить команду CLI, то сразу вслед за out может последовать новое прерывание, еще до выполнения IRET. При многократных прерываниях это может привести к переполнению стека и порче кода. Разрешение прерываний будет выполнено командой IRET.

Как запретить прерывания от отдельных устройств.

Мы видели, что если бит IMR, соответствующий номеру запроса, установлен, то прерывание от устройства запрещено. Чтобы изменить IMR, надо записать в порт 21h новое содержимое.

Пример. Запретим прерывания от накопителя на гибких дисках.

INTA01 = 21h

mov al,01000000b; 6-й бит

out INTA01, al

После выполнения этих команд попытки работать с гибким диском не приведут к успеху. Вновь разрешить работу можно командами

xor al, al

out INTA01, al

Порт 20h предназначен для управления PIC.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: