Аппаратные прерывания в IBM PC
Для управления аппаратными прерываниями в IBM PC используются два ПКП типа К580ВН59А. К каждому из ПКП можно подключить до 8 устройств и, таким образом, в системе можно использовать до 16 аппаратных прерываний (Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0 – IRQ7 соответствуют векторам прерываний - 8H - 0FH, а IRQ8 - IRQ15 – 70H - 77H. табл. 6). Одна часть аппаратных прерываний IBM PC жестко закреплена за стандартными устройствами (таймер, клавиатура и т.д.), другая - зарезервирована и может использоваться системой для дополнительных устройств (звуковая карта и т.д.). Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0 – IRQ7 соответствуют векторам прерываний - 8H - 0FH, а IRQ8 - IRQ15 – 70H - 77H. табл. 6
В адресном пространстве ввода-вывода МП ПКП занимают два адреса: 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 соответственно для начального адреса сегмента и смещения в сегменте для объекта Х (переменной, процедуры или функции). Контрольные вопросы 1. Что такое вектор прерывания? 2. Каким образом осуществляется обслуживание прерывания? 3. Каким образом используется стек при обслуживании прерывания? 4. Средства TP7.0, позволяющие использовать стандартные функции MSDOS. 5. Последовательность действий для задания собственного прерывания.
6. Расширение существующего прерывания. 7. Что такое таблица векторов прерываний? 8. Какие внешние прерывания МП 8086 вы знаете? 9. Какие внутренние прерывания МП 8086 вы знаете? 10. Что такое программируемый контроллер прерываний? 11. Какие и сколько аппаратных прерываний используется в IBM PC? Лабораторная работа № 2
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|