Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Labs / 7_IO / Lab7

.pdf
Скачиваний:
17
Добавлен:
16.04.2013
Размер:
277.23 Кб
Скачать

1

Лабораторная работа по курсу "Организация ЭВМ и систем"

Система прерываний

Цель работы: Познакомиться с обработкой прерываний в реальном режиме работы МП Pentium.

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

Сигналы прерываний от устройств поступают на вход маскируемых прерываний INTR процессора не непосредственно, а через программируемый контроллер прерываний. Для увеличения количества обслуживаемых внешних устройств он состоит из двух контроллеров, соединенных каскадно: ведущего и ведомого (см. рис. 1, а). Сигналы запросов прерываний поступают на входы IRQ0 -IRQ15. Номер входной линии каждого контроллера определяет приоритет каждого прерывания. После начальной загрузки системы более приоритетным является вход с меньшим номером, хотя возможно программирование контроллеров на другие режимы работы. Выход INT ведущего подключен ко входу INTR процессора, выход ведомого - на вход IRQ2 ведущего. Таким образом, два контроллера могут обслуживать до 15 устройств. Основная функция контроллеров - формирование номера вектора прерывания и передача сигналов запросов прерываний от устройств на единственный вход INTR микропроцессора, а также контроль приоритетов.

IRQ8

 

 

IRQ0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ9

 

 

IRQ1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Ведомый

Ведущий

 

INT

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ10

контроллер

 

 

 

контроллер

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ11

 

 

IRQ3

 

 

 

 

 

В МП

 

IRQ0

0

 

 

 

 

0

 

 

 

 

 

 

 

 

 

IRQ1

1

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

0

 

Базовый

 

 

Базовый

IRQ12

 

IRQ4

 

 

 

 

 

 

 

вектор 70h

 

 

вектор 8h

 

 

 

 

 

 

IRQ2

0

 

 

 

 

0

 

IRQ13

Порты A0h,

 

IRQ5

 

Порты 20h,

 

 

 

 

 

 

IRQ3

0

 

 

 

 

1

 

IRQ14

A1h

 

IRQ6

 

21h

 

 

 

 

 

 

IRQ4

0

 

 

 

 

0

 

IRQ15

 

IRQ7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ5

0

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ6

0

 

 

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

IRQ7

0

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(а)

 

 

 

 

 

 

 

 

 

Регистр

Регистр

 

 

 

 

 

 

 

 

 

 

 

 

запросов

 

маски

 

 

 

 

 

 

 

 

 

 

 

 

 

Порт 20h

Порт 21h

Процессор

 

Сигнал INT

 

IF

ISR

INTA

 

х0

1 0 EOI

х0

хБлокировка 0

х0

х0

х0

х0

Схема анализа

Регистр обслужи-

приоритетов

ваемых запросов

Порт 20h

Порт 20h

(б)

 

Рис. 1. Программируемый контроллер прерываний: а) каскадное соединение двух контроллеров; б) логическая структура контроллера

Кроме сигнала INT, контроллеры передают номер вектора прерывания, который образуется сложением номера входной линии (0…7) и базового вектора - числа, загруженного в контроллер при его программировании. Значения базового вектора для ведомого контроллера - 70h, для ведущего - 8h, этими значениями контроллеры инициализируются при загрузке системы. Поэтому номера векторов, закрепленных за аппаратными прерываниями, лежат в диапазонах 08h...0Fh и 70h...77h. В таблице приведен перечень прерываний, их векторов и закрепленных за ними устройств в порядке убывания приоритетов.

Таблица

Список аппаратных прерываний

Уровень приоритета

Вектор

Устройство

прерывания

 

 

IRQ0

08h

Канал 0 системного таймера

IRQ1

09h

Клавиатура

IRQ2 (каскад)

0Ah

IRQ8-IRQ15 от ведомого

IRQ8

70h

CMOS-память и часы реального времени

IRQ9

71h

Своб. для доп. устройств или перенаправлен на IRQ2

IRQ10

72h

Свободно для доп. устройств

IRQ11

73h

Свободно для доп. устройств

IRQ12

74h

Мышь PS/2 или свободно для доп. устройств

IRQ13

75h

Исключение математического сопроцессора

2

Уровень приоритета

Вектор

Устройство

прерывания

 

 

IRQ14

76h

Контроллер НЖМД

IRQ15

77h

Свободно для доп. устройств

IRQ3

0Bh

COM2, COM4

IRQ4

0Ch

COM1, COM3

IRQ5

0Dh

LPT2, звуковая карта

IRQ6

0Eh

Контроллер НГМД

IRQ7

0Fh

LPT1

Во внутренней структуре контроллера прерываний можно выделить четыре 8-битных узла: регистр входных запросов; регистр маски; схема анализа приоритетов; регистр обслуживаемых запросов (см. рис. 1, б).

При возбуждении прерывания внешним устройством сигнал поступает на вход регистра запросов, устанавливая соответствующий ему бит в единицу. Далее он фильтруется регистром мас-

ки и проходит только если соответствующий бит в регистре маски сброшен в ноль. Схема анализа приоритетов определяет приоритет сигнала (согласно таблице 1 приоритет убывает сверху вниз). Далее сигнал поступает на вход регистра обслуживаемых прерываний и дает разрешение на установку в 1 его бита (однако не устанавливает его). Одновременно сигнал INT от контроллера поступает на вход INTR процессора. Процессор регистрирует поступление сигнала лишь в том случае, если установлен флаг разрешения прерываний IF в регистре флагов. Когда МП готов к прерыванию, он отвечает сигналом подтверждения прерывания INTA (INTerrupt Acknowledge), который поступает в контроллер прерываний и устанавливает бит регистра обслуживаемых запросов, а также сбрасывает бит регистра запросов. Таким образом, поступивший запрос переводится в разряд обслуживаемых.

Одновременно с посылкой сигнала INTA процессор сбрасывает флаг IF, запрещая новые аппаратные прерывания по входу INTR. Установка единицы в бите регистра обслуживаемых прерываний воздействует на схему анализа приоритетов. Запрещаются все прерывания с приоритетом ниже обрабатываемого.

Сброс битов регистра обслуживаемых прерываний осуществляется в процедуре обработки прерывания (чаще всего при ее завершении) записью в порт 20h (для ведущего) и A0h (для ведомого) кода 20h. Этот код называют командой "конец прерывания" EOI (End Of Interrupt). Если контроллер не получит эту команду, дальнейшая обработка внешних прерываний данного и более низких уровней приоритета окажется невозможной. Процедура обработки внешнего прерывания должна выдать команду EOI контроллеру сама либо передать управление системному (или прежнему) обработчику, который это сделает.

Обработчик аппаратного прерывания.

Когда ISR получит управление, все аппаратные прерывания будут запрещены, так как процессор перед этим сбросил флаг IF (этот флаг способен запретить/разрешить только немаскируемые аппаратные прерывания). Это нежелательно, так как могут поступить прерывания с приоритетом более высоким, чем наше, и они должны быть обработаны "вне очереди". В связи с этим наш ISR должен в самом начале разрешать прерывания:

STI

;разрешаем прерывания

...

;код обработчика

...

...

;запрещаем все прерывания

CLI

MOV AL, 20h

;готовимся к обработке следующего

OUT 20h, AL

;прерывания - формируем EOI

IRET

;выход из обработчика

Команда STI устанавливает флаг IF, но схема анализа приоритетов (см. рис. 1, а) до получения команды EOI будет пропускать только прерывания с приоритетом выше обрабатываемого. Перед выполнением команды EOI все прерывания следует запрещать, так как если в этот момент

3

поступит сигнал прерывания равного приоритета, это может вызвать некорректную работу программы (наш ISR, не завершив обработку одного прерывания, будет вызван вновь).

Команда IRET восстановит сохраненный в стеке регистр флагов (включая и флаг IF), поэтому после возврата из ISR все прерывания будут разрешены, хотя мы явно и не дали команду STI.

При написании ISR для всех трех типов прерываний может возникнуть надобность либо полностью заменить системный ISR, либо только дополнить его. При инициализации прикладного ISR, сцепляемого с системным, следует сохранить (например, в двухсловной ячейке OldInt) адрес системного ISR, чтобы обеспечить возможность перехода на него, и поместить в вектор прерывания адрес (например, NewInt) прикладного ISR.

Пример: системный таймер

Системный таймер является одним из двух аппаратных средств отсчета времени в архитектуре IBM-совместимых ПК. Он присоединен ко входу IRQ0 контроллера прерываний. Таймер содержит 3 программируемых счетных канала и логику управления режимами работы каналов. Для отсчета времени используется канал 0.

В канале имеется 16-разрядный счетчик, 16-разрядный регистр константы пересчета и некоторые элементы управления режимами счета и загрузки констант. Счетчик подсчитывает количество тактовых импульсов частотой 1.19318 МГц, поступающих на вход канала. В циклическом режиме счета на каждые N непрерывно поступающих импульсов формируется 1 выходной импульс. Число N есть константа пересчета (коэффициент деления частоты), загружаемый в регистр константы канала при его программировании. Накопленное количество импульсов также программно доступно и может быть считано микропроцессором.

При начальной загрузке системы канал 0 системного таймера инициализируется константой пересчета 65535, устанавливается режим непрерывного счета, поэтому на выходе канала генерируется непрерывная последовательность импульсов с частотой примерно 18.2 Гц (период повторения 55 мс). Импульсы с выхода канала 0, воздействуя на вход IRQ0 контроллера прерываний, вызывают прерывание с номером 08h, которое изначально обрабатывается программой BIOS, осуществляющей отсчет текущего времени и контролирующей, например, длительность включенного состояния приводов дисков.

Обработчик прерывания 08h содержит вызов INT 1Ch, называемого "пользовательским". Прерывание с номером 1Ch специально предназначено для прикладных ISR прерываний от таймера, чтобы прикладная программа могла организовать свою обработку сигналов таймера, не нарушая работы системных часов. Изначально INT 1Ch передает управление на программузаглушку BIOS, содержащую единственную команду IRET. Можно использовать вектор 1Ch, "повесив" на него свой обработчик или сцепив с имеющимся. Второй вариант предпочтительнее, поскольку некоторые системные резидентные программы могут использовать обработчик с номером 1Ch. Сцепляя наш ISR с уже имеющимся, мы не нарушаем работу других программ.

Допустимо перехватывание любого из векторов прерываний 08h, 1Ch для использования в своей программе средств таймера, но, если не планируется передача управления прежнему обработчику прерывания 08h, необходимо позаботиться о своевременной выдаче своим ISR команды EOI контроллеру прерываний.

Ниже приведен текст программы timer.asm, которая содержит обработчик прерывания от таймера. Данный обработчик записывает в переменную MSEC миллисекунды, в переменную TIMER - секунды. Прерывание от таймера поступает 1 раз в 55 мсек. Поэтому наш ISR каждый раз прибавляет 55 к MSEC; когда значение MSEC превысит 1000, он прибавляет 1 к числу секунд

вTIMER, а MSEC уменьшает на 1000 мсек. Главная программа в начале работы записывает в вектор 1Ch адрес нашего ISR, в конце работы - восстанавливает адрес системного ISR. Программа

вцикле выводит на экран содержимое переменной TIMER при помощи вызова DOS 02h; как только переменная TIMER достигает величины 10 секунд, программа завершается.

4

 

 

 

Программа timer.asm:

 

sseg

segment

para stack 'stack'

 

stk db

1024 dup (?)

 

 

sseg

ends

 

 

 

dseg

segment

0

 

 

MSEC

dw

 

 

TIMER

dw

0

 

 

dseg

ends

 

 

 

cseg

segment

 

 

 

assume

cs:cseg, ds:dseg

 

OldInt1C

dd

?

;Для сохранения адреса системного ISR

TimerISR

proc

near

;------------Начало нашего ISR

push

ds

 

 

 

push

ax

 

 

 

mov

ax, dseg

 

 

 

mov

ds, ax

 

 

 

mov

ax, MSEC

 

;Прерывание поступает каждые 55 мс

add

ax, 55

 

cmp

ax, 1000

 

 

 

jb

SetMSEC

 

;Секунда прошла, увеличить TIMER

inc

Timer

 

sub

ax, 1000

 

;Скорректировать MSEC

 

SetMSEC:

MSEC, ax

 

 

 

mov

 

 

 

pop

ax

 

 

 

pop

ds

 

; Вызвать старый ISR

 

jmp

cs:OldInt1C

 

TimerISR

endp

 

;--------------Конец нашего ISR

Main proc

ax, dseg

 

 

 

mov

 

 

 

mov

ds, ax

 

;Сохранить адрес старого ISR

mov

ax, 0

 

mov

es, ax

 

 

 

mov

ax, es:[1ch*4]

 

 

mov

word ptr OldInt1C, ax

 

mov

ax, es:[1ch*4 + 2]

 

mov

word ptr OldInt1C+2, ax

 

cli

 

 

;Записать в вектор адрес нашего ISR

mov

word ptr es:[1Ch*4], offset TimerISR

 

mov

es:[1Ch*4 + 2], cs

 

sti

;-------------------------------------

Основной цикл программы

TimerLoop:

mov

dl,byte ptr Timer

 

or

dl,30h

 

;преобразовать число секунд (0..9) в ASCII

mov

ah,02h

 

;Вывести число секунд на экран

int

21h

 

;Прошло 10 секунд?

 

cmp

Timer, 10

Конец основного цикла

jb

TimerLoop

;Нет, повторять --------

mov

ax, 0

 

;Да, восстановим в векторе старый ISR

mov

es, ax

 

 

 

cli

ax, word ptr OldInt1C

 

mov

 

mov

es:[1Ch*4], ax

 

 

mov

ax, word ptr OldInt1C+2

 

mov

es:[1Ch*4+2], ax

 

sti

ax,4C00h

 

;Завершить программу

 

mov

 

 

int

21h

 

 

 

Main endp

 

 

 

 

cseg ends

Main

 

 

 

end

 

 

 

5

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

Задания 1, 2, 3 и 4 выполняяются до лабораторной работы (дома).

1. Поясните в отчете:

-Какой номер прерывания обрабатывает ISR в программе timer.asm?

-Почему в программе используются команды cli и sti при замене вектора аппаратного прерывания? Нужны ли эти команды при замене вектора программного прерывания?

-Как в программе реализовано сцепление прикладного и системного обработчиков прерываний?

-Где в программе выдается команда EOI?

2.Чтение, запись нового и восстановление старого вектора прерывания реализованы в программе непосредственно, при помощи команд mov. Замените соответствующие фрагменты программы, используя вызов DOS 21h:

-Получить адрес обработчика прерывания: При вызове: AH=35h; AL=номер вектора прерывания. При возврате: ES:BX=адрес ISR.

-Заполнить вектор прерывания адресом ISR: При вызове: AH=25h; AL=номер вектора прерывания; DS:DX=адрес ISR.

Запишите в отчете измененный Вами текст программы с комментариями.

3.Придумайте и запишите в отчете альтернативу команде cli, замаскировав все аппаратные прерывания в регистре маски контроллера прерываний.

4.Ответьте в отчете на следующие вопросы:

-Почему нельзя заменить свой системный обработчик прерываний от таймера?

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

вания BIOS и DOS?

-В каких случаях и почему перед выходом из обработчика запрещают прерывания?

-Почему прерывания разрешены после выхода из обработчика, несмотря на то, что в обработчике их запретили?

5.Отладьте и выполните программу. Пользуясь отладчиком, запишите в отчет содержимое векторов прерываний с номерами 8, 9, 1Ch в начале и в середине работы программы. В каких областях памяти находятся обработчики этих прерываний? Каково назначение прерываний с этими номерами векторов? Какие номера прерываний соответствуют этим номерам векторов?

6.Установите маску в контроллере прерываний, запрещающую прерывания от таймера. Выполните Вашу программу. Объясните в отчете, как изменилась работа программы и почему? ПОЯСНЕНИЕ: Для изменения маски сначала прочитайте ее из порта 21h, установите нужный бит, затем запишите ее обратно в порт 21h. После эксперимента постарайтесь восстановить старое значение маски программным способом! Примите во внимание, что при перезагрузке компьютера маска также будет восстановлена.

7.* (Дополнительное задание) Обратите внимание, что ячейка OldInt1C для сохранения адреса системного вектора находится не в сегменте данных, а в сегменте кода нашего ISR, и команда передачи управления на системный ISR выглядит как jmp cs:OldInt1C. Перенесите ячейку OldInt1C в сегмент данных (не забудьте убрать в команде jmp префикс замены сегмента). Выполните программу. Поясните в отчете, почему теперь программа завершается аварийно.

Требования

1.При подготовке к лабораторной работе (дома) выполните пп. 1 - 4.

2.Во время лабораторной работы выполните пп. 5 и 6. Отчет должен содержать описание всех экспериментов с ответами на заданные в них вопросы.

Вопросы

1.Как работают команды int и iret ? В чем их отличие от команд call и ret?

2.Какие существуют типы прерываний?

3.Почему аппаратные прерывания асинхронны по отношению к выполняемой программе, а программные прерывания и исключения - синхронны?

4.Для чего нужен контроллер прерываний?

---------------------------------------------------------------------------------------------------

©Лабораторная работа подготовлена Л.В.Илюшечкиной.

Пример адаптирован из R.Hyde. The Art of Assembly Language Programming. - http://webster.cs.ucr.edu

Соседние файлы в папке 7_IO