Читайте также: |
|
Эти 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.
Дата добавления: 2015-08-03; просмотров: 99 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Внешние прерывания | | | Пусть поступил сигнал от клавиатуры |