
Лабораторные работы / Lab_spo4
.docCПГЭТУ
кафедра АиПУ
ЛАБОРАТОРНАЯ РАБОТА N 4
“Программирование системных часов и измерение
скорости выполнения операций ввода-вывода”
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
1996 год
Цель работы:
Изучить способы программирования системного таймера для измерения временных интервалов. Измерить скорость выполнения операций ввода - вывода.
Общие сведения:
При проектировании систем реального времени часто возникает потребность в оценке скорости выполнения программ, их фрагментов, отдельных операций ввода - вывода. Для измерения протяженных временных интервалов (от десятых долей секунды и выше) можно воспользоваться программными средствами, которые предоставляет система BIOS. Для измерения коротких интервалов времени, например времени реакции системы на прерывание, необходимо специальным образом программировать системные часы.
Системные часы реализуются на микросхеме 8254, которая содержит три независимых програмно-управляемых таймерных канала. Системными часами используется канал 0. Аппаратную поддержку системных часов также выполняет контроллер прерываний 8259, который реагируя на периодические запросы от канала 0 таймера инициирует прерывание с номером 8 <INT 8h>. Программа обработки этого прерывания обеспечивает работу счетчика времени суток BIOS
Программная модель аппаратной части службы времени в ПЭВМ IBM PC показана на рисунке 1.
Port43h
Port40h OUT0 Port21h INT8
CLK0 RSW0 CE0 IRQ0 IMR
f=1.1931817мГц Контроллер
Таймер 8254 прерываний
Рис. 1.
По входу LCK0 в канал 0 поступают импульсы от кварцевого генератора с частотой f=1.1931817 мГц. Каждый импульс на входе CLK0 приводит к уменьшению значения 16-разрядного счетчика 0. Когда значение счетчика станет равным 0, на выходе OUT0 появиться импульс, который является сигналом запроса на прерывание от системных часов. После этого счетчик автоматически загрузиться своим начальным значением, и процесс счета продолжиться. В стандартном режиме работы канала 0 начальное значение счетчика равно FFFFh, и запрос на прерывание от системных часов формируется приблизительно 18.2 раза в секунду.
По запросу на прерывание от системных часов контроллер 8259 прерывает текущую программу и инициирует программу обработки прерывания, принадлежащую системе BIOS, которая в свою очередь увеличивает счетчик времени суток на единицу и выполняет ряд других действий. Среди этих действий следует выделить вызов пользовательского обработчика прерываний от системных часов, как показано на рис.2. Таким образом осуществляется возможность реализации программы обработки прерываний пользователя, в которую можно поместить все действия по согласованию выполнения операций процессором с масштабом реального времени.
Таблицы
векторов прерываний :
Адрес
Адрес ПОП
INT
8h 20h CS:IP
ПОП
INT 8h
INT
1Ch 70h CS:IP BIOS
.
. .
увеличение
сч-ка
времени
суток на1
Пользовательская по адресу 0040:6С
ПОП системных . . .
часов
INT 1Ch
.
. . MOV AL,20h
IRET
OUT 20h,AL
IRET
Рис.2
Распространение алгоритма функционирования системных часов позволяет сделать вывод о том, что для измерения коротких интервалов времени (от нескольких микросекунд и выше) можно использовать значение счетчика канала 0. Например, время t, прошедшее от момента загрузки счетчика до момента, когда значение счетчика станет равным CE0, в пределах одного цикла счета (длительность цикла примерно равна 50мс) определяется так (в микросекундах):
t=<FFFFh - CEO> / 1.1931817мкс.
Чтение значения счетчика CE0 можно выполнить по команде CLC в любой момент без остановки счета (см. формат управляющего слова на рис.3). Для этого в порт 43 загружается управляющее слово с командой CLC, затем из порта 40 считывается сначала младший, затем старший байт CE0.
Формат
управляющего слова:
SC1
SC0 RW1 RW0 M2 M1 M0 BCD
кан.0 - 0 0 0 - двоичный код
кан.1 - 0 1 1 - двоично-десятичный
кан.2 - 1 0 счет
RBC 1 1 0 0 0 - режим 0
0 0 1 - режим 1
* 1 0 - режим 2
* 1 1 - режим 3
1 0 0 - режим 4
1 0 1 - режим 5
0 0 - код команды CLC
0 1 - чтение/запись младшего байта
1 0 - чтение/запись старшего байта
1 1 - чтение/запись сначала младшего
затем старшего байта
Для измерения временных интервалов описанным способом необходимо программировать канал 0 таймера на режим 2:
Программа 1.
MOV AL,<RSW0>; RSW0 - управляющее слово установки
OUT [43],AL; канал 0 системного таймера в режиме 2
MOV AX , FFFFh
OUT [40],AL
XCHG AH,AL
OUT [40],AL
NOP; точка останова
Чтение счетчика канала 0 таймера можно выполнить с помощью следующего фрагмента программы:
Программа 2:
MOV AL,<CLC>; CLC - код команды CLC
OUT [43],AL
IN AL,[40]; младший байт CE0
NOT AL; AL=FF - AL
MOV CS:[01E0],AL
IN AL,[40]; старший байт CE0
NOT AL; AL=FF - AL
MOV CS:[01E1],AL; в [01E0] значение <FFFF - CE0>
NOP; точка останова
Порядок выполнения работы :
1. Запрограммировать режим 2 канала 0. Для этого в AFD в окне ассемблера ввести текст программы 1 и выполнить его в пошаговом режиме либо по команде G, предварительно установив точку останова.
1.1.Убедиться в правильности установки режима с помощью наблюдения изменения счетчика времени суток. Для этого в окне 1 открыть ячейку с адресом 0040:006C. Затем перевести курсор в окно 2. Нажать одну из клавиш движения курсора, удерживая ее наблюдать за изменением счетчика времени суток. Значение счетчика должно увеличиваться на единицу примерно 18 раз в секунду.
1.2. Ввести программу 2 с адреса команды NOP. Открыть в окне 1 ячейку с адресом CS:01E0. Установить точку останова на команде NOP. Выполнить программу несколько раз по команде G ( адрес). Контролировать значения счетчика канала 0 в открытой ячейке.
1.3. Получить методическую погрешность измерения временного интервала, выполнив программу, состоящую из программы 1 и программы 2. При этом должна быть установлена точка останова как в п.1.2. Запуск программы осуществляется по команде G 100.
2. Провести измерение времени реакции системы на прерывания от таймера INT 8h и пользовательское прерывание IBT 1Ch. Под временем реакции на прерывание понимать время, прошедшее с момента поступления запроса в контроллер прерываний до момента начала работы программы обработки прерывания.
2.1. Составить алгоритм и программу измерения реакции как программу обработки прерывания, учитывая что программа обработки пользовательского прерывания заканчивается командой IRET, а программа обработки аппаратного прерывания должна перед завершением выдавать команду EO1 в контроллер прерываний и заканчиваться командой IRET (см. рис.2).
2.2. Ввести составленную программу, показать ее преподавателю.
2.3. Установить новый вектор прерывания, старый записать для восстановления после окончания измерений. При замене вектора замаскировать прерывания от системных часов (регистр маски доступен через порт 21h, маска часов - бит 0).
2.4. Размаскировать прерывания, произвести несколько измерений времени реакции на запрос прерывания. Измерения скорректировать на величину методической погрешности. Результат записать в отчет.
2.5. Восстановить старое значение вектора прерывания.
Оформление результатов :
Отчет должен содержать:
1. Функциональную схему системы, поддерживающей службу времени в ПЭВМ.
2. Значения методической погрешности измерения временного интервала.
3. Программы для измерения времени реакции на прерывание INT 8h и INT 1Ch.
4. Данные измерений времени реакции.