После программирования 8259A командными словами
инициализации микросхема готова принимать запросы на
прерывания по входным линиям. Однако, с помощью командных
слов операции ( OCW ) во время работы 8259A можно выбирать
алгоритмы, которые укажут 8259A в каком режиме следует
оперировать.
OCW1 устанавливает и сбрасывает маскировочные биты в
регистре масок прерываний (IMR). M7-M0 представляют восемь
битов маски. М=1 указывает, что канал маскирован (запрещен),
а М=0, что канал разрешен.
R, SL, EOI - эти три бита управляют режимами ротации и
завершения прерываний, а также их комбинациями. Описание
этих комбинаций находится на блок-схеме.
L2, L1, L0 - эти биты определяют уровень активного
прерывания, если установлен бит SL
ESMM - разрешает режим специальных масок. Когда он
установлен в 1, он позволяет устанавливать или
сбрасывать биту SMM режим специальных масок. Если
ESMM=0, бит SMM становится не используемым.
SMM - режим специальных масок. Если ESMM=1 и SMM=1 8259A
войдет в режим специальных масок, если ESMM=1 и SMM=0
8259A вернется в режим обычных масок. Когда ESMM=0, бит
SMM не эффективен.
Полностью вложенный режим
Данный режим устанавливается после инициализации
если не запрограммирован другой режим. Запросы на прерывания
упорядочены по приоритетам от 0 до 7 ( 0 - высший). Когда
прерывание подтверждается, определяется запрос с наивысшим
проритетом и его вектор размещается на шине. Кроме того,
устанавливается бит (IS0-7) регистра обслуживания
прерывания. Этот бит останется до тех пор, пока
микропроцессор не выдаст команду EOI - "конец прерывания"
непосредственно перед возвратом из рутины обслуживания,
либо, если установлен бит AEOI (автоматический конец
прерывания), пока не будет заднего фронта последнего сигнала
INTA. Пока установлен бит в IS все последующие прерывания
того же или более низкого приоритета запрещаются, в то время
как более высокие уровнибудут генерировать прерывания
(которые будут подтверждаться только если внутренний триггер
разрешения прерываний в микропроцессоре был восстановлен
программой).
После инициализирующей последовательности IR0 имеет
наивысший приоритет, IR7 - самый низкий. Ниже, в описании
режима ротации приоритетов, поясняется, как можно изменять
приоритеты.
Конец прерывания (EOI)
Бит обслуживания (IS - In Service) может
сбрасываться либо автоматически по заднему фронту
последнего в последовательности импульса INTA, (когда
установлен бит AEOI в ICW1), либо командным словом, которое
должно быть выдано в 8259A перед выходом из рутины
обслуживания (команда EOI). В каскадном режиме команда EOI
должна выдаваться дважды, первый раз для ведущего и другой
для соответствующего ведомого.
Существует две формы команды EOI: специфичная и
неспецифичная. Если 8259A работает в режимах, которые
сохраняют структуру полностью вложенного режима, то можно
определить какой бит IS нужно сбросить по EOI. По
неспецифичной EOI в 8259A автоматически сбрасывается бит IS
с наивысшим приоритетом из тех, что установлены, поскольку
при полностью вложенном режиме самый высокий подтвержденный
и обслуженный уровень IS всегда последний.
Неспецифичный EOI может быть выдан в OCW2 (EOI=1, SL=0, R=0).
Если же используемый режим вызывает беспокойство о
целостности вложенной структуры, 8259A не может определять
последний подтвержденный уровень. В этом случае должен быть
выдан специфичный "конец прерывания", в команду которого
включен и номер сбрасываемого уровня. Специфичный EOI может
быть выдан в OCW2 (EOI=1, SL=1, R=0,а L0-L2 являются
двоичным номером сбрасываемого бита IS).
Необходимо отметить, что бит IS, который
замаскирован битом IMR, не будет очищен неспецифичным EOI6
tckb 8259A находится в режиме специальной маски.
Автоматический конец прерывания (AEOI)
Если в ICW4 бит AEOI=1, 8259A будет оперировать в
режиме AEOI постоянно, пока не будет перепрограммирована
новым ICW4. В данном режиме 8259A автоматически выполняет
операцию неспецифичного EOI по заднему фронту последнего из
импульсов подтверждения прерывания (третий в MCS-80/85,
второй в iAPX86). Заметим, что с точки зрения системы этот
режим должен использоваться только, когда вложенная
многоуровневая структура прерываний не требуется внутри
единственной 8259A.
Режим AEOI может использоваться только в ведущей
8259A, но не в ведомой.
Автоматическая ротация (равноприоритетные устройства).
В некоторых приложениях встречаются устройства с
равным приоритетом. В этом режиме устройство после
обслуживания получает самый низкий приоритет, так что
устройство запрашивающее прерывание должно будет ждать в
худшем случае пока каждое из 7 других устройств не будет
обслужено по крайней мере однажды. Например, если состояния
приоритетов и обслуживание перед ротацией было такое:
IS7 IS6 IS5 IS4 IS3 IS2 IS1 IS0
состояние IS: 0 1 0 1 0 0 0 0
состояние приоритета: 7 6 5 4 3 2 1 0
\младший старший/
(здесь IR4 самый высокий приоритет, требующий обслуживания),
то после ротации, когда IR4 обслужен и все другие приоритеты
ротируются соответственно:
IS7 IS6 IS5 IS4 IS3 IS2 IS1 IS0
состояние IS: 0 1 0 1 0 0 0 0
состояние приоритета: 2 1 0 7 6 5 4 3
старший/ \младший
Существует два способа выполнения автоматической
ротации с использованием OCW2, ротация по команде
неспецифичного EOI (R=1, SL=0, EOI=1) и ротация в режиме
автоматического EOI, который устанавливается по (R=1, SL=0,
EOI=0) и сбрасывается по (R=0, SL=0, EOI=0).
Специфичная ротация ( специфичный приоритет)
Программист может изменять приоритеты программируя
младший приоритет и фиксируя тем самым все остальные. Т.е.
если IR5 запрограммирован как самый младшее по приоритету
устройство, то IR6 будет иметь самый высокий приоритет.
Команда установки приоритета выдается в в OCW2 при
R=1, SL=1, EOI=0 и в L0-L2 двоичный код приоритетного уровня
младшего по приоритету устройства.
Видно, что в этом режиме внутреннее состояние изменяется под
программным управлением по OCW2. Однако, оно не зависит от
команды EOI (также выполняемой с помощью OCW2). Замена
приоритетов может быть выполнена и во время команды EOI,
используя OCW2 с командой ротации по специфичному EOI (R=1,
SL=1, EOI=1, а L0-L2 = уровню IR, который получает низший
приоритет).
Маски прерываний
Каждый запрос на прерывание может быть отдельно
замаскирован регистром масок прерываний (IMR)
программируемым через OCW1. Каждый бит в IMR маскирует один
канал прерывания, если он установлен (1). Бит 0 маскирует
IR0, бит 1 маскирует IR1 и т.д. Маскирование канала IR не
влияет на операции по другим каналам.
Режим специальной маски.
Некоторые приложения могут потребовать рутину
обслуживания для динамического выбора структуры приоритетов
системы во время своего выполнения под управлением
программного обеспечения. Например, желательно, чтобы рутина
запретила запросы младших приоритетов для одной группы своих
операторов, но разрешила некоторые из них для другой группы.
Трудность здесь в том, что если запрос на прерывание
подтвержден, а команда "конец прерывания" не сбросила его IS
бит (т.е. рутина обслуживания пока выполняется) 8259A
запрещает все запросы с младшими приоритетами при отсутствии
простого программного способа разрешить их.
Здесь вполне пригодится режим специальной маски. В
этом режиме бит маски, установленный по OCW1, запрещает все
прерывания по данному уровню и разрешает прерывания по всем
другим уровням, как старшим,так и младшим, которые не
маскированы.
Следовательно, прерывания могут быть выборочно
разрешены, путем загрузки в регистр масок.
Режим специальной маски устанавливается в OCW3, в
котором SSMM=1, SMM=1 и сбрасывается при SSMM=1, SMM=0.
Команда опроса
В этом режиме выход INT не используется, или в
микропроцессоре сброшен триггер разрешающий прерывания.
Обслуживание устройств обеспечивается программно с
использованием команды опроса.
Команда опроса выдается при установке P=1 в OCW3.
8259A трактует следующий импульс RD на 8259A (т.е. RD=0,
CS=0) как подтверждение прерывания устанавливая
соответствующий бит IS если запрос существует и считывает
приоритетный уровень. Прерывания замораживаются между WR и
RD.
В течение RD на шину данных выдается слово:
+D7-D6-D5-D4-D3-D2-D1-D0+ W0-W2 двоичный код высшего
приоритетного уровня
I - - - - W2 W1 W0 затребовшего обслуживание
+-----------------------+ I =1, если существует
прерывание
Этот режим полезен, если существует общая для
нескольких уровней рутина, так что не требуется
последовательность INTA (экономия памяти ПЗУ). С другой
стороны режим опроса полезен для расширения приоритетных
уровней до более чем 64.
Считывание состояние 8259A
Для обновления пользовательской информации по
системе можно прочитать входное состояние нескольких
внутренних регистров. С помощью OCW3 можно прочитать IRR и
ISR, а OCW1 читается IMR.
Регистр запросов на прерывание IRR: 8-битовый
регистр, который содержит уровни с неподтвержденными
запросами на прерывание. Старший уровень запроса сброшен в
IRR, когда прерывание подтверждено (не изменяется IMR).
Регистр обслуживания ISR: 8-битовый регистр, который
содержит обслуживаемые уровни приоритетов. ISR обновляется
по команде "конец прерывания".
Регистр масок прерывания IMR: 8-битовый регистр,
который содержит замаскированные линии запросов на
прерывание.
IRR можно прочитать, если перед импульсом RD выдать
команду чтения регистра с OCW3 (RR=1, RIS=0).
ISR можно прочитать, если перед импульсом RD выдать
команду чтения регистра с OCW3 (RR=1, RIS=1).
Нет необходимостизаписывать OCW3 перед каждой
операции чтения, поскольку состояние чтения соответствует
предыдущему, т.е. 8259A "помнит", что было прочитано, IRR
или ISR, ранее выбранным OCW3. Это недействительно при
использовании опроса.
После инициализации 8259A устанавливается на IRR.
Для считывания IMR OCW3 не нужен. Шина выходных
данных будет содержать IMR как только активизируется RD, а
A0=1 (OCW1). Опрос перекрывает статус чтения когда
P=1, RR=1 в OCW3.