Контроллер прерываний и его программирование 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Контроллер прерываний и его программирование



 

Если необходимо написать обработчик аппаратного прерывания – то нужно выполнить все необходимые действия:

во-первых: аппаратура, от которой пришло прерывание;

во-вторых: микросхемы контроллера прерываний.

Рассмотрим особенности функционирования и программирования контроллера прерываний. Сигналы прерываний поступают от ВУ через контроллер прерываний – микросхема Intel 8259A.

Организация аппаратных прерываний в IBM РС/ХТ

 

   
 

 


Баз. вектор – 8 IRQ - Interrupt Request

Порты 20h, 21h Запрос прерывания

 

Основное назначение контроллера – направление сигналов запросов прерываний от восьми устройств на единств.вход прерываний процессора, кроме этого контроллер передает в процессор номер вектора по линиям данных. Сигнал INT поступающий на одноименный вход СРИ инициирует процедуру прерывания. Номер вектора образуется из базового вектора следующим образом:

 

 

о о о о     о о о

 

номер IRQ IRQ0 08h Таймер

т.о. 08h – это вектор IRQ0 1 09h Клавиатура

Æ9h -«- IRQ1 2 OAh Резерв

… 3 Obh Сом2

ÆFh – это вектор IRQ7 4 Och Сом1

5 ODh Жесткий диск

6 OEh Гибкий диск

7 Ofh LPT1

 

Компьютеры IBM PC/AT комплектуются большим количеством устройств. Для обслуживания большего количества устройств контроллеры можно объединять, создавая веерообразную структуру (max к каждому входу. ведущего контроллера можно подключить свой ведомый контроллер и получить систему с 64 входами запросов прерываний).

В АТ устанавливается 2 контроллера.


 

 


Баз.вектор – 70h Базовый вектор - 8

Порты А0h, А1h Порты 20h, 21h

 

Т.о. возможное число устройств Æ до 15 (7 у ведущего и 8 у ведомого контроллера).

Выход INT ведомого контроллера подключается к входу IRQ2 ведущего,

а выход ведущего к CPU.

 

Базовый вектор у ведомого 70h:

 

7 0


                 

Номер IRQ

 

Соответствие векторов прерываний устройствам компьютера

 

Уровень Вектор Устройство
IRQ Æ IRQ1 IRQ2 IRQ8 IRQ9   IRQ10 IRQ11 IRQ12 IRQ13 IRQ14 IRQ15   IRQ3 IRQ4 IRQ5 IRQ6 IRQ7 Æ8h Æ9h ÆAh 70h 71h   72h 73h 74h 75h 76h 77h   ÆBh ÆCh ÆDh ÆEh ÆFh Таймер Клавиатура Вход от ведомого Клапан микросхемы часы realtime Программно перенапр. на IRQ2 (int Oah)   Резерв -«- Мышь (PS/2) Сопроцессор Жесткий диск Резерв   Сом 2 Сом 1 Принтер LPT2 Гибкий диск LPT1

 

Рассмотрим внутреннюю структуру контроллера. В нем можно выделить четыре основные узла: (все 8 бит)

- регистр входных запросов

- регистр маски

- схема приоритетов

- регистр обслуживаемых запросов


 

  CPU
IF ®Проц. прер.
 

INTA

 

IRQÆ 1-0       Х   Х Х Х Х Х Х   1-0   EOI

 

 

Регистр Регистр Схема Регистр

запросов маски анализа обслуживаемых

IRR IMR приоритетов запросов

Порт 20h Порт 21h Порт 20h ISR, порт 20h

 

Сигнал запроса прерывания IRQ от устройства поступает на вход регистра запросов, например, от клавиатуры сигнал поступает на IRQ1 и устанавливается в 11-ый бит этого регистра. Далее на пути сигнала стоит регистр маски. Значение Æ в бите маски разрешает прохождение сигнала. Значение 1 – запрещает. Пройдя через маску, сигнал поступает на схему анализа приоритетов. Пройдя схему анализа приоритетов, сигнал запроса прерывания поступает на вход регистра обслуживаемых запросов и дает разрешение на установку в 1 его бита, однако не устанавливает его. Одновременно сигнал поступает на вход INT МП. МП регистрирует поступление INT, если установлен флаг IF разрешения прерывания в регистре флагов. Получив INT, МП отвечает сигналом INTA – Interrupt Acknolege - подтверждение прерывания, который поступает в контроллер и выполняет 2 действия:

1) Устанавливает бит регистра обслуживаемых запросов.

2) Сбрасывает бит регистра запросов.

Т.о. запрос начал обслуживаться МП и, начиная с этого момента, на

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

МП одновременно с посылкой сигнала INTA сбрасывает флаг IF, запрещая

все аппаратные прерывания. Прерывания останутся запрещенными до выполнения пользователем команды sti.

Установка 1 в бите регистра обслуживаемых запросов воздействует на схему анализа приоритетов. Установленный бит блокирует в схему анализа приоритетов все уровни прерываний, начиная с текущего и ниже. Т.о., чтобы разблокировать все прерывания данного и более низких приоритетов необходимо сбросить бит регистра обслуживаемых запросов засылкой кода 20h в порт 20h для ведущего контроллера и в порт Aoh ведомого. Этот код получил название команды EOI - End Of Interrupt – конец прерывания. Приказ конца прерывания должен возбуждаться в любом обработчике прерываний.

Т.о. в программе обработки аппаратного прерывания можно выделить три участка:


 

(cli)

IRQ1   Запрещены все вложенные прерывания, независимо от их приоритетов (IRQ Æ - IRQ7)
  sti  
    Разрешены только вложенные прерывания с более высокими приоритетами IRQÆ
  EOI  
      iret Разрешены все вложенные прерывания, независимо от их приоритетов (IRQ0 - IRQ7)

 

Поскольку, получив сигнал INT и ответив сигналом INTA, CPU сбрасывает флаг IF, все прерывания оказываются запрещенными, и программа не может быть прервана внешними сигналами. Команда sti – устанавливает IF и разрешает прохождение запросов прерываний в процессор, причем все уровни с текущего оказываются заблокированными, т.е. работа обработки может быть прервана только при поступлении запроса более высокого приоритета (IRQÆ). Приказ EOI – снимает блокировку в контроллере и, начиная с этого момента, запрос прерывания любого уровня прервет выполнение обработки. Если обработчик прерывания IRQ1 прерывается этим же запросом – это приводит к тому, что программа обработка, не дойдя до конца, опять начинаться сначала и происходит повторный вход в программу. Т.о. обработчик должен быть реентабельным.

Структура обработки выбирается исходя из конкретных условий. Часто sti - ставят в самом начале, чтобы не задерживать обработку прерывания от более приоритетных устройств (в частности таймера). Приказ EОI посылается в контроллер в самом конце программы перед iret. Т.о. исключаются вложенные прерывания.

 

IRQ     MOV AL, 20h ОUT 20h, AL IRET   Команда EOI

 

Однако, сигнал прерывания от того же уровня может придти между командой Out 20h, AL и iret. Поскольку блокировка нижележащих уровней уже снята, возникнет вложенное прерывание и повторный вход в ту же программу. Чтобы избежать этого перед самым приказом EOI выполни cli

 

IRQ Sti     cli MOV AL, 20h ОUT 20h, AL IRET   EOI

 

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

из стека

(к = 0 не м.б., так и этого прерывания не произошло). Отсюда следует, что в обработчике вообще может отсутствовать sti. В этом случае обработчик будет выполняться при запрещенных прерываниях и разрешены прерывания будут только после выполнения команды iret.

Запросы на прерывания, поступающие в ведущий контроллер IRQÆ - IRQ7 – блокируют только ведущий контроллер. Однако запросы на прерывание, поступающие в ведомый контроллер, приоритет (IRQ8-IRQ15), блокируют уровни низших приоритетов в ведомом и IRQ2 - IRQ7 – в ведущем контроллере. Поэтому

в обработанных прер.уровней 8…15 следует предусматривать посылку команды

конца прерываний в оба контроллера:

mov AL, 20h

out 20h, AL

out A0h, AL

Рассмотрим несколько примеров программирования контроллера прерывания.

Существует возможность запретить не все, а лишь избранные аппаратные прерывания записью 1 в соответствующий разряд регистра маски прерываний (IMR) контроллера. Для разрешения прерываний нужно записать Æ в тот же разряд.

in AL, 21h; прочитать текущую маску

or AL, 1; установить добавочно бит Æ

out 21h, AL; вернуть в IMR

 

Выполнение этих команд приведет к остановке системного таймера. Это можно проверить с помощью часов Norton Commander.

 

После этого необходимо выполнить:

in AL, 21h; прочитать IMR

and AL, ÆFEh; сбросить бит Æ

оut 21h, AL; вернуть в IMR

 

или:

in AL, 21h; прочитать IMR

or AL, 00000010B; запрет прерывания от клав.

and 21h, AL

-«-

in AL, 21h

and AL, 11111101B; разрешает прерывание

out 21h, AL

 

Таким же образом можно запретить прерывания от контроллера гибких дисков и т.д.

Есть одно внешнее прерывание, которое не может быть замаскировано. Это так называемое немаскируемое прерывание NMI. Оно имеет номер 02h, обладает более высоким приоритетом, чем остальные аппаратные прерывания.

Для того чтобы прочитать состояние регистра обслуживаемых запросов, необходимо в порт 20h послать команду OBh – разрешение чтения ISR. Следующий пример иллюстрирует чтение регистра запросов до EOI и после EOI.

 

EOI EQU 20h

mov AL, Obh;Команда разрешения

out 20h, AL;Чтение регистра запросов

jmp $+2;Задержка для быстрых vfiby

jmp $+2;(иногда не нужна)

in AL, 20h;Читаем регистр ISR

 

; распечатка ISR

 

mov Al, EOI;Команд EOI в

out 20h, Al;ведущ.контрол.

jmp $+2

jmp $+2

in AL, 20h

 

; распечатка ISR

 

После команды OBh возможно неоднократное чтение ISR.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 477; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.22.242.141 (0.02 с.)