Контроллер прерываний 8259A

Анотация

Здесь приводятся описание аппаратной части контроллера прерываний 8259A, команд контроллера и макросов для программирования на ассемблере.

Описание аппаратуры (кроме PS/2 устройств) и команд контроллера прерываний взято из книги «Руководство по архитектуре IBM PС AT» / Ж.К. Голенкова, А.В. Заболоцкий, М.Л. Мархасин и др.; Под общ. ред. М.Л. Мархасина. — Минск: ООО «Консул», 1992. — 949 c.: ил.

Авторская часть состоит в разработке макросов для работы с контроллером. Сами тексты макросов приведены в irq.def.

Оглавление

Описание подсистемы аппаратных прерываний

Порядок настройки контроллера прерываний

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

Командное слово OCW1

Командное слово OCW2

Макросы высокого уровня


Описание подсистемы аппаратных прерываний

В архитектуре IBM AT все запросы на аппаратные прерывания из системной шины поступают через два контроллера прерываний (КП) 8259A на вход процессора (ЦП) INTR. Процессор подаёт через выход INTA сигнал на подтверждение прерывания и получает по локальной шине D0–D7 от КП номер вектора прерывания. После чего, он приостанавливает исполнение текущей программы и начинает обрабатывать прерывание. Обработчик прерывания, выполнив заданную последовательность действий, посылает в КП команду окончания обработки прерывания.

Контроллер прерываний (8259A) имеет следующие регистры

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

Контроллер прерываний может воспринимать запросы на прерывания от устройств как по уровню, так и по фронту сигнала. Это программируется в процедуре настройки контроллера прерываний.

Когда устройство подаёт запрос на прерывание, в регистре запросов на прерывание IRR устанавливается соответствующий ему бит. Если в регистре обслуживаемых прерываний ISR нет необслуженных прерываний с бóльшим приоритетом, и прерывание от данного устройства незамаскировано, то выдаётся запрос на вход INTR ЦП. После получения подтверждения прерывания от ЦП по входу INTA в ISR устанавливается соответствующий ему бит. Сброс бита в ISR осуществляется подачей в КП соответствующей команды из ЦП обработчиком прерывания.

Микросхема 8259A позволяет подключать к себе до восьми устройств. Чтобы расширить количество обрабатываемых прерываний, в IBM PC/AT контроллеры прерываний включены каскадом. Один из КП играет роль ведущего (Master), а второй — ведомого (Slave). Выход INTR ведомого контроллера подключён к одному из входов ведущего, а выход INTR ведущего — к соответствующему входу ЦП (см. структуру подключений). Получив от ЦП подтверждение прерывания (по общей для обоих КП шине INTA), если оно относится в ведомому КП, ведущий по локальной шине cas0–cas2 сообщает ведомому, что ведомый должен выдавать вектор прерываний на шину D0–D7.

Перед использованием контроллеров прерываний необходимо выполнить их настройку вначале ведущего КП, а затем ведомого. В процессе настройки ИС 8259A ведущего КП нужно, в частности, указать к каким его входам подключены ведомые КП, а ИС 8259A ведомого — к какому входу ведущего КП она подключена. К ИС 8259A, настроенной как ведущий КП, может подключаться до восьми ведомых ИС 8259A (в IBM PC используется только один), что в принципе позволяет обрабатывать до 64 запросов прерываний. После того, как ведущий КП передаёт в ЦП запрос на прерывание от ведомого КП и получает подтверждение, он выдаёт на локальную шину cas0–cas2 номер входа, к которому подключён ведомый контроллер. Ведомый контроллер отслеживает состояние входов на шине cas0–cas2, и когда обнаруживает свой номер, обрабатывает подтверждение своего запроса прерывания.

Структура подключения контроллеров прерываний в IBM AT

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

Из первого порта можно прочитать регистры ISR и IRR. А из второго — IMR.

При загрузке ЭВМ BIOS настраивает контроллеры прерываний так, что ведущий выдаёт номера векторов прерываний в диапазоне от 08h до 0fh, а ведомый — в диапазоне от 70h до 77h.

Команды контроллера делятся на: команды настройки (ICW) и рабочие команды (OCW). Вначале рассмотрим команды настройки (командные слова ICW1, ICW2, ICW3 и ICW4). Слово ICW1 начинает процесс настройки КП. Оно задаёт по фронту или по уровню сигнала на входе КП нужно генерировать запрос на прерывание; работает ли контроллер в каскадном режиме (Master или Slave) или самостоятельно, а также имеется ли слово ICW4.

Бит A0 в команде задаётся адресом порта в который она посылается.

Слово ICW1 должно выводиться в порт 20h для ведущего контроллера и в порт 0A0h для ведомого

Слово ICW2 указывает первый номер вектора прерываний, с которого генерируются все остальные. Этот номер должен быть кратен восьми. Векторы располагаются подряд, начиная с указанного, соответствующего IRQ0, и кончая "указанный+7", соответствующим вектору IRQ7.

Слово ICW2 должно выводиться в порт 21h для ведущего контроллера или в порт 0A1h для ведомого.

Слово ICW3 должно выводиться в порт 21h для ведущего контроллера в порт 0A1h для ведомого.

В полновложенном режиме пока установлен бит в ISR, все последующие запросы с тем же или более низким приоритетом не вызывают выработку сигнала INTR для ЦП. При этом возможен следующий случай. Когда ведомый КП получает запрос на прерывание, он выдаёт сигнал на вход IRQ2 ведущего. Ведущий КП подаёт его на вход ЦП и устанавливает соответствующий бит в своём ISR. Когда ведомый КП получает запрос на прерывание с более высоким приоритетом, он снова выдаёт запрос на вход IRQ2 в ведущий КП, но в ISR ведущего КП бит, соответствующий IRQ2, уже установлен. Поэтому ведущий КП запрос на прерывание не выдаст. Преодолеть это можно, запрограммировав ведущий КП на использование специального полновложенного режима.

В специальном полновложенном режиме игнорируются только запросы на прерывание с более низким приоритетом.

// Буферный режим -- ? (о нём нет сведений) //

В обычном режиме КП после подтверждения прерывания по входу INTA ждёт команду EOI, после которой осуществляется сброс одного из битов в ISR, соответствующего подтверждённому прерыванию. Установкой AEOI КП можно настроить на автоматический сброс соответствующего бита ISR после получения сигнала INTA. Заметим, что при этом, запрос на прерывание с меньшим приоритетом может поступить до того, как ЦП обработает запрос на прерывание с бóльшим приоритетом. Более того, возможен случай, когда следующий запрос на k-ое прерывание происходит до того как был обработан предыдущий запрос на то же k-ое прерывание. Такой случай называется «сверхвложением».

Слово ICW4 должно выводиться в порт 21h ведущего КП и в порт 0A1h ведомого.

Разряд A0 определяется по номеру порта процессора в который производится запись команды.

Порядок настройки контроллера прерываний

Чтобы изменить одно из ICWn, нужно перепрограммировать всю последовательность.

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

Регистр IMR доступен для чтения всегда, ISR и IRR — только после выдачи соответствующих команд.

Теперь рассмотрим рабочие команды (OCW1, OCW2 и OCW3).

Командное слово OCW1

Для управления регистром маски IMR контроллера прерываний используется командное слово OCW1

Команда OCW1 маскирует отдельные запросы на прерывания. Единичные значения битов указывают, что поступающие запросы на прерывание с соответствующими им номерами игнорируются.

Порт, в который Слово OCW1 должно выводиться в порт 21h ведущего КП и 0A1h ведомого.

Макрос IRQMaskN macro MS, N, SCRV устанавливает, сбрасывает, инвертирует или тестирует один бит регистра маски прерываний контроллера.

Макрос IRQMaskMANY macro MS, msk, SCRV устанавливает, сбрасывает или инвертирует биты регистра маски прерываний контроллера, которые в переменной msk имеют единичное значение.

Макрос IRQMaskALL MS, msk записывает в регистр масок контроллера прерываний байт.

Командное слово OCW2

R=1 — управляет операциями, связанными с ротацией приоритетов;
SL=1 — указывает, что команда относится к конкретному прерыванию, а не к последнему, подтверждённому на обслуживание (специальное в смысле заданное);
EOI=1 — окончание прерывания (сброс разряда в ISR);
L0-L2 — номер запроса на прерывание, для которого выполняется команда, используется совместно с SL=1.

Изменение уровней приоритетов вступает в силу только по завершении обработки прерывания (после команды EOI, например).

Когда уровни приоритетов не изменяются, достаточно обычного EOI, когда используются команды ротации приоритетов в обработчике прерываний, нужно использовать специальную команду EOI, явно указывая номер завершаемого прерывания. На использование автоматического завершения прерывания можно программировать контроллер только тогда, когда частота прерываний не очень велика, иначе может возникнуть ситуация сверхвложения (когда одно и то же прерывание вызывается на столько часто, что обработчик не успевает его отработать, при этом оно блокирует вызов всех остальных, и может возникнуть переполнение стека). Если производится ротация приоритетов прерываний, во время обработки прерывания, то приоритеты будут только после окончания обработки (выдачи команды EOI). Т. е. если после ротации приоритетов если, вдруг оказался запрос с более высоким приоритетом, чем у обрабатываемого, то оно обрабатываться не будет до тех пор, пока текущий обработчик прерываний не выдаст команду EOI.

Все возможные варианты расположения уровней приоритетов при ротации
Вход
микросхемы
Статус уровня
приоритета
IRQ0 7 6 5 4 3 2 1 0
IRQ1 0 7 6 5 4 3 2 1
IRQ2 1 0 7 6 5 4 3 2
IRQ3 2 1 0 7 6 5 4 3
IRQ4 3 2 1 0 7 6 5 4
IRQ5 4 3 2 1 0 7 6 5
IRQ6 5 4 3 2 1 0 7 6
IRQ7 6 5 4 3 2 1 0 7

Слово OCW2 должно выводиться в порт 20h для ведущего КП и в порт 0A0h для ведомого.

Для окончания обработки запроса на прерывание служит макрос

_IRQeoi MS, IRQN

Команда OCW3 используется для выдачи различных режимов и команд в 8259A. OCW3 имеет две функции:

Назначение битов:

Режим опроса необходим, когда устройства имеют общую программу-обработчик прерываний, а также при количестве запросов больше 64. Инициатором опроса является команда, посылающая слово OCW3, по которой микропроцессор блокирует свой вход INTR и подготавливает цепи в КП (контроллере прерываний), необходимые для опроса. Затем в контроллер передаётся команда чтения порта 20h (для ведущего) или A0h (для ведомого КП), по которой по наиболее приоритетному запросу устанавливается соответствующий разряд ISR и сбрасывается одноимённый разряд IRR) и на шину X выдаётся слово опроса прерываний, структура которого следующая

По полученной информации программа либо перейдёт на программу-обработчик приоритетного прерывания, либо ликвидирует следы обслуживаемого прерывания командой EOI. При необходимости операции опроса может повторяться до тех пор, пока разряд I (D7) не станет равным нулю.

Слово OCW3 выводится в порт 20h ведущего контроллера и в порт 0A0h ведомого контроллера.

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

IRQSetRA MS, Reg, SM

Макрос IRQResetRA MS, Reg, SM сбрасывает режим опроса, а также может изменить состояние специального маскирования и читаемый регистр (IRR или ISR)

Макрос IRQSRARead MS, Reg, IntFNOCHANGE устанавливает режим опроса и читает регистр КП. MS — master или slave. Reg — регистр, который потом можно будет прочитать (IRR или ISR), можно опустить, тогда не будет меняться читаемый регистр. Параметр IntFNOCHANGE — если указан (любое значение), то регистр флагов не сохраняется.

Т. к. в процессе чтения регистра может быть выработано прерывание, которое, в свою очередь, может попытаться прочитать другой регистр контроллера, что в свою очередь может привести к чтению первым обработчиком неправильного регистра, то лучше на время выполнения операции чтения запретить прерывания (вставить команду cli перед IRQSRARead).

Макрос IRQRRARead MS, Reg, IntFNOCHANGE сбрасывает режим опроса и читает регистр IRR или ISR.

Если запрос на прерывание снимается со входа до того, как он будет разрешён в IMR, то прерывание не вырабатывается.

Возможны следующие режимы работы контроллера

Последовательность действий при использовании специального маскирования

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

Для окончания обработки прерывания в специальном полновложенном режиме на подчинённых контроллерах используется макрос _IRQeoiSFNM IRQN. IRQN — необязательный параметр, указывает номер завершаемого прерывания. Если не указывать, то будет завершено последнее подтверждённое на обслуживание.

Макросы высокого уровня

Список устройств, подключённых к контроллерам прерываний, имена устройств указываются в макросах окончания обработки прерывания (IRQ_EOI), маскирования и размаскирования прерываний (IRQ_Des и IRQ_En)

Имена устройств для макросов «высокого уровня»
Timer таймер, канал 0
KBD клавиатура (выходной буфер полон)
IRQSlave каскад контроллера прерываний 2
Serial2 последовательный порт 2
Serial1 последовательный порт 1
Parallel2 параллельный порт 2
FDD контроллер накопителя на гибких дисках
Parallel1 параллельный порт 1
RTC часы реального времени
PS2Mouse мышь PS/2 *
Math исключение математического сопроцессора
HDDIDE1 контроллер жёстких дисков 1
HDDIDE2 контроллер жёстких дисков 2 *
* — устройства, не присутствовавшие в 286, 386, 486 компьютерах.

Примечание: .IRQSpecialFNM — переменная указывает, используется ли специальный полновложенный режим. Служит для указания генерируемого кода для обработки окончания прерывания, полученного от ведомого контроллера. Переменная вступает в силу после макроса настройки контроллера InitATIRQ. Если настройка контроллера не выполняется, то её можно установить явно. Если .IRQSpecialFNM не определена то IRQ_EOI для подчинённого контроллера генерируется так, если бы был настроен специальный режим полного вложения.

Стандартная инициализация контроллеров прерываний осуществляется с помощью макроса IRQ_Ini IRQ0Int1, IRQ0Int2, SpecFNM

  1. SpecFNM — указывает, следует ли использовать специальный полновложенный режим
  2. IRQ0Int1, IRQ0Int2 — номера прерываний первого и второго контроллера Макрос формирует переменную .IRQSpecialFNM, указывающую, следует ли использовать в последующих командах IRQ_EOI при обслуживании прерываний от ведомого контроллера последовательность команд, написанную для специального полновложенного режима или нет.

Если векторы прерываний задаются не константами, а регистрами, то правильность задаваемых номеров не выполняется.

Стандартное завершение прерывания выполняется макросом IRQ_EOI IRQName. В этом макросе неявно используется переменная .IRQSpecialFNM.

Маскировать прерывание можно макросом IRQ_Des IRQName, а размаскировать — IRQ_En IRQName. Здесь IRQName — одно из имён устройств, помещённое в начале файла.




©   Жуков И. Б.

e-mail:

При использовании материалов, пожалуйста,

ставьте индексируемую ссылку на сайт https://ibzh.eko3.ru/





Число посетителей


Яндекс.Метрика

Число посетителей