Контроллеры прерываний
Внешние устройства, включенные в подсистему прерываний, должны реализовать несколько функций, связанных с работой в этой подсистеме - формирование запроса, анализ ответа процессора, выдачу вектора прерывания. Кроме того, в подсистеме необходимо обеспечить дисциплину обслуживания запросов. Перечисленные функции могут быть реализованы на специальных устройствах - контроллерах прерываний, которые выпускаются в виде БИС в составе многих микропроцессорных комплектов.
7.3.1. На Рис. 7.2 приведена структурная схема простого контроллера прерываний К589ИК14, применяемого совместно с МП К580ВМ80 (на схеме показаны лишь основные блоки и выводы контроллера).
Рис. 7.2. Контроллер К589ИК14
Контроллер включает в себя следующие блоки:
Ø РгЗП - регистр запросов, на который поступают запросы на прерывание z0..z7 от внешних источников;
Ø ПШ - приоритетный шифратор, формирующий на выходе трехразрядный код номера возбужденного входа (соответствующего разряда РгЗП), причем, если на входе ПШ присутствуют несколько единиц, то на выходе будет сформирован код большего номера;
Ø Буф. - буферная схема, подключающая выход ПШ к линиям системной шины данных при подаче на управляющий вход сигнала подтверждения прерывания INTA;
Ø РгТП - регистр текущего приоритета, программно-доступный в пространстве ввода/вывода и хранящий трехразрядный код приоритета текущей программы;
Ø СС - схема сравнения, формирующая запрос на прерывание INT процессору при условии, что код наибольшего из поступивших запросов больше кода текущего приоритета.
МП проверяет состояние входа INT в конце каждого командного цикла при условии установки в "1" триггера разрешения прерывания TI. Если INT = 1, то МП вместо машинного цикла M1 следующего командного цикла выполняет цикл обслуживания прерывания, который отличается от M1 только тем, что вместо сигнала RDM\ вырабатывается сигнал INTA\ и программный счетчик PC не инкрементируется. Поэтому не происходит чтение команды из памяти (хотя ее адрес и выставлен на AB[15:0]), а по сигналу INTA\ контроллер выставляет на DB[5:3] трехразрядный номер запроса. На остальных линиях DB сохраняются лог. "1" (высокоимпедансное состояние). В такте T3 цикла обслуживания прерывания код с DB[7:0] записывается в регистр команд МП.
Код 11nnn111 представляет собой код одной из восьми команд RST 0. . RST 7, которые выполняются аналогично командам CALL, но с фиксированными адресами вызываемых подпрограмм:
RST 0 = CALL 0000h
RST 1 = CALL 0008h
RST 2 = CALL 0010h
.. . . . .
RST 7 = CALL 0038h
Таким образом, каждому запросу соответствует фиксированный адрес обслуживаемой его подпрограммы.
К недостаткам рассмотренного выше контроллера прерываний К589ИК14 относится жесткая система приоритетов запросов, не позволяющая обеспечить равновероятное обслуживание источников прерываний. Кроме того, контроллер не позволяет выделить произвольное подмножество разрешенных в данный момент прерываний из множества поступающих на его входы запросов. Возможно лишь задать определенный уровень, начиная с которого запросы будут разрешены.
Использование ..ИК14 накладывает ограничение на расположение обслуживающих прерывания подпрограмм или указателей на них в адресном пространстве памяти. Команды RST вызывают подпрограммы из начальной области адресов памяти (0000..0038), что не всегда удобно при организации МПС.
7.3.2. Программируемый контроллер прерываний К580ВН59 позволяет организовать более гибкую и эффективную подсистему прерываний в МПС.
Отличительной особенностью контроллера ..ВН59 является то, что он генерирует код команды CALL, поэтому область векторов прерываний (по-прежнему компактная) может располагаться по произвольным адресам памяти. Структурная схема контроллера прерываний представлена на Рис. 7.3.
Рис. 7.3. Структура контроллера прерываний К580ВН59
Программируемый контроллер прерываний включает в себя блоки связи с системной шиной, управления и запросов. Блок запросов содержит три 8-разрядных регистра - регистр запросов РгЗ, в котором фиксируются запросы от источников прерываний, регистр маски РгМ, определяющий подмножество источников, которым разрешены прерывания и регистр состояний РгС, в котором фиксируются запросы, принятые на обслуживание.
Состав управляющих линий контроллера включает стандартные линии подключения к системной шине : D[7:0], A0, WR\, RD\, CS\; линии, передающие запрос на прерывания процессору и ответ МП INT и INTA\ соответственно.
Линии запросов z7..z0 соединяют контроллер с источниками прерываний. Контроллер может обслуживать до 8 источников прерываний. При большем числе источников возможно каскадное включение ..ВН59, причем один из контроллеров будет ведущим, а остальные (не более 8) - ведомыми. Для назначения роли контроллера в системе предназначен вход SP
(H - уровень соответствует ведущему контроллеру). Для организации взаимодействия каскадированных контроллеров прерываний предназначены линии CAS[2:0].
Программирование контроллера осуществляется путем загрузки в специальные регистры двух или трех управляющих слов, форматы которых показаны на Рис. 7.4. Загрузка этих слов осуществляется командами инициализации в начале работы системы.
Команда | A0 | |||||||||
КИ1 | А7 | А6 | А5 | F | S | |||||
КИ2 | A15 | A14 | A13 | A12 | A11 | A10 | A9 | A8 | ||
КИ3-1 | z7 | z6 | z5 | z4 | z3 | z2 | z1 | z0 | ||
КИ3-2 | x | x | x | x | x | n | n | n |
Рис. 7.4. Форматы команд инициализации контроллера ..ВН59
В команде КИ1 разряд S определяет количество контроллеров прерываний в системе : "1" - один контроллер, "0" - более одного (имеет место каскадирование). Разряд F задает шаг между соседними адресами подпрограмм, обслуживающих прерывания : "1" - 4 байта, "0" - 8 байт.
Разряды A7, A6, A5 вместе со всеми разрядами КИ2 образуют старшие 11 бит адреса подпрограммы. При значении F = 1 вектор прерывания (адресная часть команды CALL) формируется следующим образом :
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 n n n 0 0,
где nnn - номер обслуживаемого запроса на прерывание (номер входа z). Если задан шаг между адресами 8 байт (F = 0), то разряд A5 игнорируется и вектор генерируется след. образом :
A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 n n n 0 0 0.
Третья команда инициализации подается (и принимается контроллером) только при наличии нескольких контроллеров в системе (S = 0), причем формат этой команды различен для ведущего и ведомых контроллеров.
Ведущему контроллеру командой КИ3-1 указывается, к каким его входам z подключены ведомые контроллеры (в соответствующем разряде КИ3-1 установлена "1"). "0" в разряде КИ3-1 означает, что на соответствующий вход z подключен обычный источник прерываний.
Каждому ведомому контроллеру в трех младших разрядах КИ3-2 указывается номер входа ведущего контроллера, к которому подключен данный ведомый. Состояние разрядов КИ3-1[7:3] безразлично.
Помимо команд инициализации, выполняемых один раз в начале работы МПС, контроллер в любое время может выполнить команды управления, позволяющие установить маску запросов (КУ1), задать режим приоритета запросов (КУ2) или определить будущую операцию. Форматы команд управления приведены на рис. 7.5.
Команда КУ1 устанавливает новое значение в регистр маски, причем если разряд РгМ установлен в "1", то соответствующий вход z считается замаскированным и прерывание от этого источника запрещено.
Команда | A0 | ||||||||||
КУ1 | m7 | m6 | m5 | m4 | m3 | m2 | m1 | m0 | |||
КУ2 | ЦП | К | СВ | k2 | k1 | k0 | |||||
КУ3 | x | СМ1 | СМ0 | СП | Р1 | Р0 | |||||
Рис. 7.5. Форматы команд управления контроллера. .ВН59
КУ2 задает тип приоритета запросов (ЦП = 0 - фиксированный приоритет, z0 -высший, z7 -низший; ЦП = 1 - циклический приоритет). При циклическом приоритете этой же командой задается номер входа (в разрядах k[2:0]), которому присвоен низший приоритет. После обслуживания любого запроса приоритеты входов циклически меняются на одну позицию. Разряд СВ КУ2 позволяет сбросить бит регистра РгС, номер которого задан битами k[2:0] КУ2. Разряд К определяет, используется ли в команде поле k[2:0].
Команда КУ3 позволяет установить или сбросить режим спецмаскирования, при котором на обслуживание принимаются запросы с приоритетом, ниже текущего. КУ3[6:5] = 11 - установить режим спецмаскирования, КУ3[6:5] = 10 - снять режим спецмаскирования, КУ3[6:5] = 0x - не воздействует.
Эта же команда подготавливает в следующем такте один из допустимых к чтению объектов: регистр запросов при КУ3[1:0] = 10; регистр состояний при КУ3[1:0] = 11; номер запроса с наивысшим приоритетом по формату Рис. 7.6 при КУ3[2:0] = 10x. Считывание осуществляется командой IN при A0 = 0, WR = 0. Признак INT отмечает наличие запроса, а код w[2:0] определяет номер незамаскированного запроса с наивысшим приоритетом. Результатом чтения информации по формату Рис. 7.6 можно воспользоваться при организации программной идентификации источника прерывания.
INT | x | x | x | x | w2 | w1 | w0 |
Рис. 7.6. Формат слова номера запроса с наивысшим приоритетом
Считывание содержимого регистра маски может осуществляться командой IN при
A0 = 1 без предварительной загрузки команды КУ3.
При организации векторных прерываний контроллер, получив запросы на входах z0..z7, фиксирует их в соответствующих разрядах РгЗ. При наличии незамаскированных запросов контроллер формирует для МП сигнал INT, а, получив ответ INTA\, принимает на обслуживание наиболее приоритетный из незамаскированных запросов, для чего
(1) устанавливает в "1" соответствующий разряд РгС;
(2) выдает на шину данных DB код команды CALL (константу CDh);
(3) по второму и третьему сигналу INTA\ выдает на DB адрес подпрограммы обслуживающей выбранное прерывание, сгенерированный по правилам, описанным выше.
Если необходимо обслуживать в МПС более 8 источников прерываний, то можно использовать несколько контроллеров ..ВН59, причем один из них будет ведущим (для него SP = 1), а остальные (до 8) - ведомые (SP = 0). Все контроллеры связываются линиями каскадирования CAS[2:0] по принципу общей шины, причем линии CAS ведущего контроллера являются выходами, а ведомых – входами (Рис. 7.7).
Все контроллеры подключаются к системной шине одинаковым образом, только выходной сигнал INT используется по не одинаково: INT ведущего контроллера подается по системной магистрали на вход INT МП, а INT ведомых подключаются на входы запросов z ведущего контроллера. Некоторые входы z ведущего контроллера и все входы ведомых могут использоваться для приема запросов на прерывание. Максимальное число контроллеров в системе - 9, т.к. к входам ведомых нельзя подключать третий "слой" контроллеров. Максимальное число обслуживаемых запросов - 64.
Все контроллеры инициализируются тремя командами, как было пояснено выше. Если запрос поступает на ведущий контроллер, то он обслуживается так же, как и при единственном контроллере в МПС. Запрос, поступивший на ведомый контроллер, обрабатывается по стандартным правилам и преобразуется в сигнал INT, который в качестве запроса поступает на ведущий контроллер.
Ведущий контроллер обрабатывает все поступившие на его входы запросы согласно заданным приоритетам и формирует сигнал INT для МП. Если запрос, принятый ведущим на обслуживание, поступил от ведомого контроллера (ведущий "знает" об этом из информации, содержащейся в КИ3-1), то ведущий в ответ на первый сигнал INTA\ выдает на DB константу CDh (код команды CALL) и на линии каскадирования CAS[2:0] - номер обслуживаемого входа. Все ведомые контроллеры сравнивают состояние линий CAS со своим номером, заданным командой КИ3-2. Ведомый контроллер, опознавший свой номер на линиях CAS, в ответ на второй и третий сигналы INTA\ выдает соответственно младший и старший байт команды CALL - адрес подпрограммы, обслуживающей выбранное прерывание.
Рис. 7.7. Каскадирование контроллеров прерывания
Дата добавления: 2019-02-07; просмотров: 577;