Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASM_lectures.doc
Скачиваний:
27
Добавлен:
28.04.2019
Размер:
992.77 Кб
Скачать

Обработчик прерываний от таймера

В резидентной программе русификации принтера необходимо постоянно быть уверенным в том, что в принтер загружен новый шрифт. Поскольку новый шрифт загружается в оперативную память принтера используя часть буфера печати, то при выключении принтера содержимое этой памяти теряется. После выключения принтера шрифт необходимо вновь загрузить в принтер, т.о. TSR программы должно постоянно проверять включен принтер или нет и если принтер выключен, то устанавливать свой внутренний флажок – шрифт не загружен. Следовательно, когда возникает необходимость печати, TSR программа снова загрузит шрифт.

Подобным образом, большому кол-ву TSR программ необходимы постоянные по времени проверки ресурсов системы или активизации некоторых процессов.

Осуществить подобные действия м. с помощью обработчика прерываний от таймера.

Для того, чтобы прикладные программы могли использовать сигналы таймера, не нарушая при этом работу системных часов, в программе BIOS, обслуживающую аппаратные пред-я от таймера, поступающие через вектор 08, включен вызов int 1ch, передающий управление на программу-заглушку BIOS, которая содержит единственную команду iret.

Пример обработки прерывания от таймера из TSR прогр. prn-res.

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

Если необходимо написать обработчик аппаратного прерывания – то нужно выполнить все необходимые действия:

во-первых: аппаратура, от которой пришло прерывание;

во-вторых: микросхемы контроллера прерываний.

Рассмотрим особенности функционирования и программирования контроллера прерываний. Сигналы прерываний поступают от ВУ через контроллер прерываний – микросхема Intel 8259A.

Организация аппаратных прерываний в IBM РС/ХТ

Баз. вектор – 8 IRQ - Interrupt Request

Порты 20h, 21h Запрос прерывания

Основное назначение контроллера – направление сигналов запросов прерываний от восьми устройств на единств.вход прерываний процессора, кроме этого контроллер передает в процессор номер вектора по линиям данных. Сигнал INT поступающий на одноименный вход СРИ инициирует процедуру прерывания. Номер вектора образуется из базового вектора следующим образом:

о

о

о

о

1

о

о

о

номер IRQ IRQ0 08h Таймер

т.о. 08h – это вектор IRQ0 1 09h Клавиатура

9h -«- IRQ1 2 OAh Резерв

… 3 Obh Сом2

Fh – это вектор IRQ7 4 Och Сом1

5 ODh Жесткий диск

6 OEh Гибкий диск

7 Ofh LPT1

Компьютеры IBM PC/AT комплектуются большим количеством устройств. Для обслуживания большего количества устройств контроллеры можно объединять, создавая веерообразную структуру (max к каждому входу. ведущего контроллера можно подключить свой ведомый контроллер и получить систему с 64 входами запросов прерываний).

В АТ устанавливается 2 контроллера.

Баз.вектор – 70h Базовый вектор - 8

Порты А0h, А1h Порты 20h, 21h

Т.о. возможное число устройств  до 15 (7 у ведущего и 8 у ведомого контроллера).

Выход INT ведомого контроллера подключается к входу IRQ2 ведущего,

а выход ведущего к CPU.

Базовый вектор у ведомого 70h:

7 0

0

1

1

1

Номер IRQ

Соответствие векторов прерываний устройствам компьютера

Уровень

Вектор

Устройство

IRQ 

IRQ1

IRQ2

IRQ8

IRQ9

IRQ10

IRQ11

IRQ12

IRQ13

IRQ14

IRQ15

IRQ3

IRQ4

IRQ5

IRQ6

IRQ7

8h

9h

Ah

70h

71h

72h

73h

74h

75h

76h

77h

Bh

Ch

Dh

Eh

Fh

Таймер

Клавиатура

Вход от ведомого

Клапан микросхемы часы realtime

Программно перенапр. на IRQ2 (int Oah)

Резерв

-«-

Мышь (PS/2)

Сопроцессор

Жесткий диск

Резерв

Сом 2

Сом 1

Принтер LPT2

Гибкий диск

LPT1

Рассмотрим внутреннюю структуру контроллера. В нем можно выделить четыре основные узла: (все 8 бит)

  • регистр входных запросов

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

  • схема приоритетов

  • регистр обслуживаемых запросов

CPU

IF

Проц.

прер.

INTA

IRQ

1

2

3

4

5

6

7

0

1-0

0

0

0

0

0

0

0

0

1

0

1

0

0

0

Х

Х

Х

Х

Х

Х

Х

0

1-0

0

0

0

0

0

0

EOI

Регистр Регистр Схема Регистр

запросов маски анализа обслуживаемых

IRR IMR приоритетов запросов

Порт 20h Порт 21h Порт 20h ISR, порт 20h

Сигнал запроса прерывания IRQ от устройства поступает на вход регистра запросов, например, от клавиатуры сигнал поступает на IRQ1 и устанавливается в 11-ый бит этого регистра. Далее на пути сигнала стоит регистр маски. Значение  в бите маски разрешает прохождение сигнала. Значение 1 – запрещает. Пройдя через маску, сигнал поступает на схему анализа приоритетов. Пройдя схему анализа приоритетов, сигнал запроса прерывания поступает на вход регистра обслуживаемых запросов и дает разрешение на установку в 1 его бита, однако не устанавливает его. Одновременно сигнал поступает на вход INT МП. МП регистрирует поступление INT, если установлен флаг IF разрешения прерывания в регистре флагов. Получив INT, МП отвечает сигналом INTA – Interrupt Acknolege - подтверждение прерывания, который поступает в контроллер и выполняет 2 действия:

  1. Устанавливает бит регистра обслуживаемых запросов.

  2. Сбрасывает бит регистра запросов.

Т.о. запрос начал обслуживаться МП и, начиная с этого момента, на

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

МП одновременно с посылкой сигнала INTA сбрасывает флаг IF, запрещая

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

Установка 1 в бите регистра обслуживаемых запросов воздействует на схему анализа приоритетов. Установленный бит блокирует в схему анализа приоритетов все уровни прерываний, начиная с текущего и ниже. Т.о., чтобы разблокировать все прерывания данного и более низких приоритетов необходимо сбросить бит регистра обслуживаемых запросов засылкой кода 20h в порт 20h для ведущего контроллера и в порт Aoh ведомого. Этот код получил название команды EOI - End Of Interrupt – конец прерывания. Приказ конца прерывания должен возбуждаться в любом обработчике прерываний.

Т.о. в программе обработки аппаратного прерывания можно выделить три участка:

(cli)

IRQ1

Запрещены все вложенные прерывания,

независимо от их приоритетов

(IRQ  - IRQ7)

sti

Разрешены только вложенные прерывания

с более высокими приоритетами IRQ

EOI

iret

Разрешены все вложенные прерывания,

независимо от их приоритетов

(IRQ0 - IRQ7)

Поскольку, получив сигнал INT и ответив сигналом INTA, CPU сбрасывает флаг IF, все прерывания оказываются запрещенными, и программа не может быть прервана внешними сигналами. Команда sti – устанавливает IF и разрешает прохождение запросов прерываний в процессор, причем все уровни с текущего оказываются заблокированными, т.е. работа обработки может быть прервана только при поступлении запроса более высокого приоритета (IRQ). Приказ EOI – снимает блокировку в контроллере и, начиная с этого момента, запрос прерывания любого уровня прервет выполнение обработки. Если обработчик прерывания IRQ1 прерывается этим же запросом – это приводит к тому, что программа обработка, не дойдя до конца, опять начинаться сначала и происходит повторный вход в программу. Т.о. обработчик должен быть реентабельным.

Структура обработки выбирается исходя из конкретных условий. Часто sti - ставят в самом начале, чтобы не задерживать обработку прерывания от более приоритетных устройств (в частности таймера). Приказ EОI посылается в контроллер в самом конце программы перед iret. Т.о. исключаются вложенные прерывания.

IRQ

MOV AL, 20h

ОUT 20h, AL

IRET

Команда EOI

Однако, сигнал прерывания от того же уровня может придти между командой Out 20h, AL и iret. Поскольку блокировка нижележащих уровней уже снята, возникнет вложенное прерывание и повторный вход в ту же программу. Чтобы избежать этого перед самым приказом EOI выполни cli

IRQ

Sti

cli

MOV AL, 20h

ОUT 20h, AL

IRET

EOI

В результате вложенные прерывания запрещаются до выхода из обработчика. Однако, прерывания не останутся запрещенными навсегда – команда iret вернет

из стека

(к = 0 не м.б., так и этого прерывания не произошло). Отсюда следует, что в обработчике вообще может отсутствовать sti. В этом случае обработчик будет выполняться при запрещенных прерываниях и разрешены прерывания будут только после выполнения команды iret.

Запросы на прерывания, поступающие в ведущий контроллер IRQ - IRQ7 – блокируют только ведущий контроллер. Однако запросы на прерывание, поступающие в ведомый контроллер, приоритет (IRQ8-IRQ15) , блокируют уровни низших приоритетов в ведомом и IRQ2 - IRQ7 – в ведущем контроллере. Поэтому

в обработанных прер.уровней 8…15 следует предусматривать посылку команды

конца прерываний в оба контроллера:

mov AL, 20h

out 20h, AL

out A0h, AL

Рассмотрим несколько примеров программирования контроллера прерывания.

Существует возможность запретить не все, а лишь избранные аппаратные прерывания записью 1 в соответствующий разряд регистра маски прерываний (IMR) контроллера. Для разрешения прерываний нужно записать  в тот же разряд.

in AL, 21h ; прочитать текущую маску

or AL, 1 ; установить добавочно бит 

out 21h, AL ; вернуть в IMR

Выполнение этих команд приведет к остановке системного таймера. Это можно проверить с помощью часов Norton Commander.

После этого необходимо выполнить:

in AL, 21h ; прочитать IMR

and AL, FEh ; сбросить бит 

оut 21h, AL ; вернуть в IMR

или:

in AL, 21h ; прочитать IMR

or AL, 00000010B ; запрет прерывания от клав.

and 21h, AL

-«-

in AL, 21h

and AL, 11111101B ; разрешает прерывание

out 21h, AL

Таким же образом можно запретить прерывания от контроллера гибких дисков и т.д.

Есть одно внешнее прерывание, которое не может быть замаскировано. Это так называемое немаскируемое прерывание NMI. Оно имеет номер 02h, обладает более высоким приоритетом, чем остальные аппаратные прерывания.

Для того чтобы прочитать состояние регистра обслуживаемых запросов, необходимо в порт 20h послать команду OBh – разрешение чтения ISR. Следующий пример иллюстрирует чтение регистра запросов до EOI и после EOI.

EOI EQU 20h

mov AL, Obh ;Команда разрешения

out 20h, AL ;Чтение регистра запросов

jmp $+2 ;Задержка для быстрых vfiby

jmp $+2 ;(иногда не нужна)

in AL, 20h ;Читаем регистр ISR

; распечатка ISR

mov Al, EOI ;Команд EOI в

out 20h, Al ;ведущ.контрол.

jmp $+2

jmp $+2

in AL, 20h

; распечатка ISR

После команды OBh возможно неоднократное чтение ISR.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]