Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

Решение.

MOV DX,ОЗFD ;DX := 3FD — адрес порта В ;

IN AL,DX. ; ввести в AL МП из порта В байт данных.

2) Вывод.

а) Ассемблер: OUT DX,AL; комментарий: вывести из регистра AL МП байт данных в порт, адрес которого взять из DX.

б) машинный код состоит только из КОП: КОП = ЕЕ.

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

13Обслуживание прерываний. Контроллер прерываний

13.1Процедура прерываний и команды прерываний

Что должен делать микропроцессор, обнаружив на своем входе INT сигнал «1» (смотрите рисунок 3 в главе 2)? Он должен:

во-первых, закончить текущую команду, на которой его «прихватил» запрос: INT = 1;

во-вторых, если флаг IF был равен «1» (разрешение аппаратного прерывания), то вместо сигналов чтения -MEMRD или -IORD микропроцессор вырабатывает сигнал чтения: -INTA.

Что должен прочитать МП этим сигналом с шины данных системной магистрали? По логике событий — КОП следующей команды. Но он вырабатывает не сигнал чтения ячейки ЗУ –MEMRD, а сигнал - INTA. Вместе с тем, МП посредством этого сигнала будет загружать КОП следующей команды, и это должна быть первая команда подпрограммы, которая обслуживает прерывание. Следовательно, источником этой команды должен быть необычный интерфейсный элемент, для которого сигнал –INTA является сигналом чтения (ввода). Вот этим элементом и является контроллер прерываний. Именно он обслуживает аппаратную часть процедуры прерывания. Но прежде, чем рассмотреть контроллер, давайте еще раз вернемся к процедуре прерывания.

МП 8086 поддерживает (как и все другие микропроцессоры) программное и аппаратное прерывание.

Программное прерывание инициируется по команде прерывания. а) Ассемблер: INT n, где n — однобайтовый вектор перехода,

указывается в H-коде.

б) Машинный код — 2 байта: 1-й байт — КОП, 2-й байт — вектор.

КОП = CD. Вектор = 0...FF (0...25510).

Что делает микропроцессор, обнаружив команду INT n?

1)Запрещает дальнейшее аппаратное прерывание: IF = 0 (то есть, выполняет скрытую команду CLI).

2)Загружает последовательно в стек:

69

Stack:=<F> -

загружает в стек PSW (содержимое регистра флагов);

Stack:=<CS> -

загружает в стек содержимое сегментного регистра

CS; Stack:=<IP> - загружает в стек текущий адрес, то есть адрес следующей команды прерванной программы.

3) Начиная с адреса CS:EA, где CS = 0000, EA = 4×n — считывает 2 слова, (4 байта), первое (младшее) из которых попадает в IP, а второе (старшее) — в CS.

Таким образом, следующая команда будет выбираться, начиная с адреса CS:IP, который установило программное прерывание INT n .

Следовательно, в задачу пользователя входит:

а) знать, в каком сегменте и с какого адреса расположена подпрограмма, которая вызывается прерыванием INT n;

б) загрузить в ячейки памяти в нулевом сегменте, начиная с EA = 4×n, слово адреса и слово сегмента начала подпрограммы.

Пример 1 – пусть подпрограмма должна вызываться прерыванием INT 2F, и эта подпрограмма располагается в ОЗУ, начиная с адреса: CS=1570, IP = 0100.

Ответ:

Вычисляем адрес вектора : EA = 2F×4=BC.

Располагаем адрес начала подпрограммы по адресу вектора:

Адрес

IP

 

CS

00BC

 

00BD

00BE

00BF

Данные

00

 

01

70

15

Естественный вопрос: как вернуться из программного прерывания? Команду безадресного перехода RET FAR здесь можно использовать, но к ней необходимо добавлять команду POPF, чтоб восстановить и регистр флагов F, и указатель стека. Такой возврат обеспечивается специальной командой безадресного перехода, которая поглощает в себя эти две команды:

а) Ассемблер: IRET; б) КОП = CF. Действие команды:

IP := <Stack> ;возврат адреса из стека; CS := <Stack> ;возврат сегмента из стека; F := <Stack> ;возврат флагов из стека.

Следовательно, если подпрограмма вызывается программным прерыванием, а не командой CALL, то она должна заканчиваться командой IRET.

Теперь снова вернемся к аппаратному прерыванию. Итак, микропроцессор сигналом чтения -INTA требует у контроллера прерываний КОП следующей команды. По всей видимости, это должна быть команда программного прерывания INT n с кодом операции CD.

70

Этот код «зашит» технологически в контроллере прерываний 8259. А вектор n программируется при инициализации контроллера прерываний (ПКП) . Ознакомимся с архитектурой ПКП 8259, приведенной на рисунке 10. При этом опустим разъяснения относительно сигналов системной магистрали, считая, что это уже пройденный этап.

Шинный формирователь осуществляет двунаправленное движение данных:

-при -IORD=0: T=0 и шинный формирователь осуществляет направление справа налево;

-при -IOWR=0: T=1 и шинный формирователь осуществляет

направление слева направо.

Таким образом коммутируется внутренняя шина данных (ВШД) с шиной данных системной магистрали. Но это при условии, что -CS = 0, что приводит к ОЕ = 1; а иначе шинный формирователь вообще отключен от системной шины. Это общий принцип управления встроенным в интерфейсные контроллеры шинным формирователем.

Схема управления записью-чтением осуществляет генерацию необходимых для внутренних элементов ПКП управляющих сигналов.

Теперь по существу функционирования ПКП. Относительно запросов на прерывание IRQi он представляет собой двухступенчатый регистр — систему со шлюзом. Всего реализовано IRQi для 8 запросов. Они неравнозначны: максимальный приоритет у IRQ 0, минимальный - у IRQ 7.

1-ый этап. Сначала передним фронтом (или потенциалом) IRQi устанавливается соответствующий разряд регистра запросов на прерывание (РЗП) — открылись 1-ые ворота шлюза. Сигнал с выхода РЗП этого разряда через это

Рисунок 10 —Архитектура ПКП 8259

71

своеобразное сито — логику маскирования и приоритета — попадает на вход INT МП (INT=1).

2-ой этап. МП первым сигналом чтения -INTA считывает из ПКП на шину данных КОП = CD и одновременно переписывает соответствующий запрос из РЗП в регистр обслуживаемых запросов на прерывание (РОЗП). Соответствующий выход РОЗП, установившись в «1», блокирует прохождение INT через логику маскирования и приоритетов как собственного запроса, так и более низких по приоритету. Резюме: 1-ые ворота закрылись, INT — исчез (INT=0).

3-ий этап. МП, распознав по КОПу, что команда двухбайтовая, вырабатывает еще один сигнал чтения -INTA, который считывает из ПКП на шину данных вектор и одновременно сбрасывает соответствующий разряд РЗП в «0», который вызвал прерывание INT. Итак, первая ступень — в исходное состояние. Можно зафиксировать: аппаратная часть прерывания закончилась, но в результате:

1)флаг IF = 0 , то есть аппаратное прерывание МП заблокировано (запрещено);

2)IRQi , вызвавший прерывание, тоже заблокирован по входу i и по всем остальным, которые ниже по приоритету.

4-ый этап. Разблокировка этой двойной блокировки всегда производится программно в конце подпрограммы, вызванной прерыванием.

Снятие блокировки со входа INT МП производится командой STI (IF = 1 — разрешение аппаратного прерывания).

Сброс соответствующего разряда РОЗП осуществляется записью в

ПКП при А0=0 (рисунок 10), например, кода «20» (20 — код команды сброса того разряда, который последним вызвал прерывание).

2-ые ворота шлюза открылись — процесс прерывания завершен. Пример 2 — Допустим, ПКП выбирается (с помощью дешифратора

адреса) следующими кодами :

OFO (AO=0) и OF1 (AO=1);

Тогда заключительная часть подпрограммы, вызванной прерыванием, будет выглядеть следующим образом:

. . . . . . . . . . . . . . . . . . . . . . . . .

STI

; разрешение прерываний микропроцессору;

MOV DX,OOFO ; адрес ПКП для А0=0 в DX;

MOV AL,20

; код завершения обработки прерывания ПКП —

в AL,

 

OUT DX,AL

; а оттуда в ПКП.

IRET

; возврат в программу.

На рисунке 10 (архитектура ПКП) имеется элемент, именуемый регистром маски. Маска устанавливается («1»—маскирование IRQi)

72

записью в ПКП при АО=1 соответствующего байта. Маску можно прочитать по тому же адресу, то есть при АО=1.

Пример 3 — составить маску для только что рассмотренного примера 2 таким образом, чтоб разрешить прерывание только по запросам IRQO и IRQ6:

Ответ: Составляем слово маски, «закрывая» все, кроме D6, D0:

 

D7

D6

D5

D4

D3

D2

D1

D0

 

┌───┬───┬───┬───┬───┬───┬───┬───┐

Маска: │ 1

0

1

1

1

1

1

0 │

 

└───┴───┴───┴───┴───┴───┴───┴───┘

 

└───────────┘

└───────────┘

Н-код

=

 

B

 

 

E

 

 

 

Составим фрагмент программы маскирования ПКП с адресами

выборки из примера 2:

 

 

 

 

 

MOV DX,00F1

; адрес ПКП для АО=1 в DX;

 

MOV AL,BE

; маску BE (IRQ 0, IRQ 6 — разрешить) в AL,

OVT DX,AL

; а затем оттуда в ПКП — в регистр маски.

 

Примечание – В начале работы, в момент подачи питания на ПКП

все IRQ демаскируются, все разряды РЗП и РОЗП сбрасываются в «0» и

устанавливается

исходный

приоритет: IRQ

0 —

высший, IRQ 7 —

низший (дно).

 

 

 

 

 

 

 

 

Следующий элемент архитектуры ПКП (рисунок 10) называется:

«Схема каскадирования». Он выполняет функции расширителя числа запросов на прерывание. Дело в том, что если не хватает 8 входов IRQ, то микросхемы можно каскадировать — до 8 штук, и число векторов довести до 8 x 8 = 64.

На практике такое редко встречается, а вот каскад из двух ПКП реализован в IBM PC/АТ. Как это делается — в данном пособии не рассматривается. Это совершенно не принципиальный вопрос, а скорее узкотехнический.

А теперь обратимся к программированию ПКП. Некоторые элементы этого процесса уже были представлены в примерах 2 и 3. Но в целом процесс программирования ПКП достаточно сложен и состоит из трех блоков.

1) блок инициализации (настройка режима и загрузка векторов и шага векторов);

2)блок команд окончания (завершения) прерывания;

3)блок команд обработки по опросу (без сигнала INT).

Чтобы иметь возможность работы с контроллером по минимуму, необходимо знать:

а) как накладывать маску (или прочитать ее); б) как завершать прерывание (частный случай: команда 20 при

А0=0).

73