Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы СПО-new.docx
Скачиваний:
7
Добавлен:
14.11.2019
Размер:
239.58 Кб
Скачать

Аппаратные прерывания в ibm pc

Для управления аппаратными прерываниями в IBM PC используются два ПКП типа К580ВН59А. К каждому из ПКП можно подключить до 8 устройств и, таким образом, в системе можно использовать до 16 аппаратных прерываний (

Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0 – IRQ7 соответствуют векторам прерываний - 8H -0FH, а IRQ8 - IRQ15 – 70H - 77H.). Одна часть аппаратных прерываний IBM PC жестко закреплена за стандартными устройствами (таймер, клавиатура и т.д.), другая - зарезервирована и может использоваться системой для дополнительных устройств (звуковая карта и т.д.).

Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0IRQ7 соответствуют векторам прерываний - 8H -0FH, а IRQ8 - IRQ1570H - 77H.

табл. 6

Номер прерывания (IRQ)

Устройство

0

таймер

1

клавиатура

2

ПКП

3

COM1

4

COM2

5

фиксированный диск

6

контроллер гибких дисков

7

LPT1

8

CMOS и часы реального времени

9

-

10-12

резерв

13

математический сопроцессор

14

контроллер фиксированных дисков

15

резерв

В адресном пространстве ввода-вывода МП ПКП занимают два адреса: 20Н и 21Н.

Выполнение работы

К п. 1. Текст основной программы на языке Turbo Pascal может выглядеть следующим образом:

Begin

{сохранение старых и установка новых векторов прерываний в п.3,4}

Repeat

Repeat

Until Keypressed; {ожидание нажатия клавиши}

Ch:=ReadKey; {чтение кода нажатой клавиши}

Case Ch of

...{обработка нажатия клавиши }

End; {Case}

Until Ch=’E’; {выход из программы при нажатии клавиши ‘E’}

{восстановление ‘старых’ векторов прерываний в п.3,4}

End.

В приведенной программе используются функции стандартного модуля Crt.

К п. 2. Turbo Pascal предусматривает возможность использования стандартных функций ОС MS DOS. Единственным механизмом обращения к функциям DOS является вызов программного прерывания. При возникновении программного прерывания, в большинстве случаев необходимо передать процедуре обработки прерывания некоторые параметры, в которых конкретизируется запрос нужной функции. Эти параметры, а также выходная информация (результат обработки прерывания) передаются из программы в процедуру и обратно через регистры ЦП. В составе модуля Dos Турбо-Паскаля для этих целей определен специальный тип данных:

Type

Registers=record

Case integer of

0: (Ax,bx,cx,dx,bp,si,di,ds,es,Flags: Word); {16-ти разр. Регистры}

1: (Al,ah,bl,bh,cl,ch,dl,dh); {8-ми разр. Регистры}

End; {Case}

End;

Этот тип имитирует регистры ЦП и дает возможность обращаться к ним как к 16-ти и 8-ми разрядным регистрам.

Для обращения к функциям DOS в Турбо-Паскале используются следующие процедуры:

процедура Intr -вызывает программное прерывание с заданным номером:

Intr( <№ прерывания: Byte>,<регистры: Registers>);

процедура MSDOS -инициирует прерывание с номером 33 ($21):

MSDOS(<регистры: Registers>).

Программное прерывание $21 дает доступ к большому количеству функций DOS (85 функций). Процедура MSDOS эквивалентна вызову Intr с номером $21.

Пример программы:

Uses dos;

Var r: Registers;

Begin

r.AH:=$30; {в AH заносится номер функции прерывания $21}

MSDOS(r); {вызов программного прерывания $21} или {Intr($21,r)}

Writeln (‘версия DOS:’, r.AL,’.’,r.AH);

End.

К п.3. Для использования собственных подпрограмм обработки прерываний необходимо выполнить следующие действия:

  • разработать подпрограмму обслуживания прерывания;

  • в начале работы программы сохранить старый вектор прерывания в переменной типа Pointer;

  • задать новый вектор прерывания, указывающий на разработанную подпрограмму;

  • вызывать программное прерывание нужно в соответствии с правилами, описанными в п.2 лабораторной работы;

  • при завершении работы программы восстановить “старый” вектор прерывания.

Турбо-Паскаль предоставляет возможность разработки процедур обработки прерывания на языке высокого уровня. Процедура обработки прерывания должна содержать служебную директиву Interrupt (прерывание), например:

Procedure ProcInt (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); Interrupt;

Begin

{действия по обработке прерывания}

End;

Директива Interrupt обеспечивает автоматическое сохранение содержимого регистров ЦП в стеке при вызове процедуры обработки прерывания и извлечение их из стека перед выходом из процедуры. Это необходимо для того, чтобы процедура обработки прерывания не искажала работу прерванной программы.

Формальные параметры в заголовке процедуры должны перечисляться в указанном порядке. Количество перечисляемых параметров - не должно превышать 12. Если в списке пропущен какой-либо параметр, то должны быть пропущены и все предшествующие ему параметры.

Для связи с процедурами прерываний используются векторы прерываний. Следующие процедуры модуля Dos позволяют прочитать содержимое вектора или установить его новое значение.

Процедура GetIntVec - возвращает вектор прерывания с указанным номером:

GetIntVec (<№ прерывания: Byte>,<вектор прерывания: Pointer>);

Процедура SetIntVec - устанавливает новое значение вектора прерывания:

SetIntVec (<№ прерывания: Byte>,<адрес входа в процедуру: Pointer>;

Для получения адреса входа в процедуру обработки прерывания необходимо использовать функцию Addr, например:

SetIntVec($61,Addr(ProcInt));

К п.4. Часто в программах для отсчета временных интервалов удобно использовать системный таймер, прерывание от которого формируется 18,2 раза в секунду. Перекрытие стандартного прерывания от таймера нецелесообразно, т.к. таймер в системе играет важную роль.

Для добавления своего кода к прерыванию от таймера удобно использовать пустое специальное прерывание BIOS $1C, которое вызывается прерыванием от таймера и ничего не делает, пока вы не напишете для него свой код. Вы должны изменить вектор прерывания $1C так, чтобы он указывал на процедуру в вашей программе. При завершении работы программы, вы должны восстановить исходное значение вектора (см. п.3.).

Любая процедура обработки прерывания (и особенно от таймера) должна выполняться быстро и не содержать длительных операций ввода-вывода. Поэтому основное назначение разработанного дополнения к прерыванию должно заключаться в подсчете и/или контроле числа обработанных прерываний от таймера. Прерывание от таймера обрабатывается каждые 0,055с. Таким образом, интервал времени в 1с, можно получить, обработав 18 прерываний от таймера. Например, используя глобальную переменную и изменяя ее значение при обработке прерывания (число обработанных прерываний от таймера), можно контролировать ее текущее значение в основной программе и там же выполнять необходимые действия (менять цвет фона, символов и т.д.).

К п.5. Значения векторов прерывания хранятся в оперативной памяти компьютера, т.е. представляют собой последовательность байтов. В языке Pascal для прямого доступа к любому участку оперативной памяти предварительно объявлены массивы Mem, MemW и MemL. Компоненты массива Mem – значения типа Byte; массива MemW – типа Word; массива MemL – типа Longint. Для обращения к элементам этих массивов необходимо указать индекс, который представляет собой абсолютный адрес ячейки памяти. Абсолютный адрес состоит из двух выражений типа Word; первое дает адрес начала сегмента, а второе задает смещение внутри этого сегмента. Эти выражения разделяются двоеточием. Например:

S:= Mem [$0000:$FFFF];

MemW [$4000:$0001]:=3578;

Начальные адреса процедур можно получить, как отмечалось выше, с помощью функции Addr, которая возвращает значение типа Pointer. Но тип Pointer нельзя распечатать с помощью стандартных процедур. Для преобразования типа Pointer используют функции Seg(X) и Ofs(X), которые возвращают значения типа Word соответственно для начального адреса сегмента и смещения в сегменте для объекта Х (переменной, процедуры или функции).