Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 3000544.doc
Скачиваний:
26
Добавлен:
30.04.2022
Размер:
14.75 Mб
Скачать

10.4. Отсчёт реального времени в эвм

При написании программ на языках высокого уровня для отсчета интервалов времени в ЭВМ обычно используют специальные процедуры. Так на языке PASCAL имеется две процедуры работы со временем:

Procedure Delay(MS:Word) – ожидание в течении заданного числа миллисекунд;

Procedure GetTime(var hour, min, sec, ssec:Word)-возвращает установленное в системе время в часах, минутах, секундах и сотых долях секунды.

Однако, организовать эффективную работу в реальном масштабе времени с использованием таких процедур не удается.

Для реализации работы в реальном масштабе времени используется прерывание от таймера с частотой 18.2 гц, которое поступает с нулевого выхода таймера на вход IRQ0 запроса прерывания первого контроллера прерываний. Прерывание от таймера имеет высший приоритет и с частотой 18.2 гц контроллер вырабатывает сигналы требования прерывания. При каждом сигнале предоставления прерывания ПКП передает в процессор вектор прерывания от таймера (установленный BIOS) 8h.

Каждое прерывание от таймера INT 8h вызывает обращение к программе обработки прерывания TIMER_INT (F000: FEA5). Эта программа обработки имеет 32 разрядный счётчик для регистрации времени дня. Счётчик расположен в 2 ячейках TIMER_LOW (0040:006С) и TIMER_HIGH (0040:006E). Программа TIMER_INT вызывает перед своим завершением прерывание с вектором 1Ch. Система BIOS делает вектор прерывания 1Ch указателем на команду IRET. Прерывание с вектором 1Ch сделано для того, чтобы пользователь мог встроить собственную программу обработки прерывания. Связь аппаратных и программных средств при реализации прерывания от таймера представлена на рис 10.4.

Таким образом, прерывание ICh вызывается с частотой 18,2 Гц и ничего не выполняет, кроме возврата. Поэтому это прерывание можно использовать в пользовательских программах для отсчёта реального времени поместив в вектор 1Ch указатель на новую программу обработки.

Программа обработки прерывания завершается командой очистки бита обслуживания прерывания с наивысшим приоритетом в регистре ISR ПКП. Для этого необходимо перед выходом занести число 20h в порт 20h ПКП (рис.10.2). При этом будут разрешены все прерывания с низшим или равным приоритетом (в том числе и следующие прерывания от таймера).

Для включения пользовательской программы в качестве дополнения к прерыванию INT8h необходимо написать дополнительную процедуру обработки прерывания и поместить ее указатель (дальний адрес) в вектор 1Ch на место прежнего, предварительно его запомнив. В этом случае обращения к дополнительной программе обработки прерывания будут идти с частотой 18,2 Гц.

Если необходима более высокая частота, требуется перепрограммировать таймер. Но при этом будут неправильно работать часы реального времени и могут возникнуть проблемы с дисководами, т. к. в них предусмотрены временные задержки.

При написании программ следует использовать возможности операционной системы, языков высокого уровня, функций DOS и BIOS.

10.5. Процедуры и функции для работы с прерываниями

Программы, работающие с прерываниями могут быть написаны на языке высокого уровня (Pascal) или низкого (Assembler). Приведем часто используемые процедуры и функции.

На языке PASCAL заголовок процедуры обработки прерывания имеет вид:

Procedure Int(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:word); INTERRUPT; где Int- имя программы обработки прерывания. Список параметров обязательно должен иметь указанный вид. Некоторые параметры в заголовке программы могут быть опущены. Но они могут опускаться только подряд, начиная с первого элемента списка. Опускать промежуточные элементы списка запрещено. Параметры передаются в подпрограмму через новые значения регистров. При вызове подпрограммы обработки прерывания старое содержимое регистров помещается в стек, из которого восстанавливается при возврате. В регистры загружаются новые значения. Ошибки, связанные с передачей параметров в прерываниях, часто не отмечаются при трансляции.

Можно использовать процедуру без указания списка параметров, назначая переменным процедуры абсолютные адреса, совпадающие с адресами переменных в основной программе. В этом случае переменная подпрограммы и переменная основной программы, которые должны быть одного типа, будут располагаться в одном месте оперативной памяти. Они будут тождественны. Для этого в разделе описания переменных подпрограммы используют следующее описание переменных:

Var A: T absolute B; , где: A и B – переменные соответственно подпрограммы и основной программы, T – тип переменной.

Тело процедуры обработки прерывания должно содержать все операции, которые необходимо выполнить в процедуре. В конце программы обработки должна быть команда разрешения контроллеру прерывания вновь реагировать на очередное прерывание: port[$20]:=$20;.

Определение дальнего адреса процедуры или переменной производится с помощью функции add(Arg), которая возвращает дальний адрес переменной или процедуры, указанной в ее аргументе. Для определения адреса программы обработки прерывания (например Int) в теле основной программы необходимо присвоить некоторой переменной An типа pointer (указатель) значение функции addr, возвращающей адрес процедуры. Например, An:=addr(Int);

Переменная An будет иметь значение дальнего адреса программы обработки прерывания и, следовательно, размещена в векторе прерывания.

Процедура GetIntVec($1C, A_old);. используется для определения дальнего адреса программы обработки прерывания заданного вектора и его запоминания. Первый параметр процедуры – шестнадцатеричный номер вектора прерывания, адрес программы обработки которого мы сохраняем. Знак $ указывает на шестнадцатеричную систему счисления при указании номера вектора. В примере сохраняется адрес программы обработки прерывания с вектором $1C. Второй параметр – имя переменной типа Pointer, в которой будет храниться адрес найденной программы обработки

Установить новый адрес программы обработки прерывания заданного вектора можно используя процедуру SetIntVec($1C,An);. Первый параметр процедуры -номер вектора прерывания, адрес программы обработки которого мы устанавливаем. Второй параметр – имя переменной типа Pointer, в которой содержится адрес новой программы обработки. При выполнении смены программ обработки процедура автоматически запрещает прерывания.

11. 32-РАЗРЯДНЫЕ ПРОЦЕССОРЫ И PENTIUM

11.1. Архитектура 32-разрядных процессоров

11.2. Страничное управление памятью

11.3. Кэширование памяти

Процессор Intel386 является первым из семейства 32-разрядных процессоров фирмы Intel. Процессор имел 32-разрядные раздельные шины адреса и данных и внутреннюю очередь команд размером 16 байт для организации конвейерной обработки данных. Процессор Intel386 открывает ряд 32-разрядных процессоров, которые, наряду с повышением разрядности регистров, имеют новые общие элементы архитектуры, позволившие существенно повысить производительность ЭВМ.

Цель главы – ознакомление с основными элементами архитектуры 32-разрядных процессоров.