Модуль Zen Timer Pro
Версия 2.7
Автор: Вадим Бодров, TMT Development Corporation
Copyright (C) 1995-99 TMT Development Corporation
All rights reserved.
Original C/C++ Code by Kendall Bennett, SciTech Software
Portions Copyright (C) 1991-1997 SciTech Software, Inc.
All rights reserved.
Если вы заметили в документе
опечатки или неточности перевода,
просьба сообщить о них!
Перевод на русский язык и оформление: Валерий Вотинцев
СОДЕРЖАНИЕ:
Введение
Свойства
Системные требования
Язык программирования
Описание функций модуля ZenTimer
procedure LZDelay (Value: DWord)
function LZTimerCount: DWord
procedure ZTimerInit
function LZTimerLap: DWord
procedure LZTimerOff
procedure LZTimerOn
function LZTimerResolution: Double
procedure ULZDelay (Value: DWord)
function ULZElapsedTime(start, finish: DWord): DWord
function ULZReadTime: DWord
function ULZTimerCount: DWord
function ULZTimerLap: DWord
procedure ULZTimerOff
procedure ULZTimerOn
function ULZTimerResolution: Double
function CPU_getCPUIDFeatures: DWord
function CPU_getProcessorSpeed: DWord
function CPU_getProcessorType: DWord
function CPU_haveMMX: Boolean
ВВЕДЕНИЕ
ZTimer.pas - это полнофункциональный порт на TMT Pascal популярной библиотеки
ZTimer для С/С++, разработанной компанией SciTech Software.
СВОЙСТВА
- Таймер высокого разрешения,
в основу которого положен код из книги "Zen of Assembly Language" Volume 1,
Knowledge by Michael Abrash.
- Таймер длинных интервалов,
использующий тики таймера BIOS для обработки
временных интервалов вплоть до 24 часов).
- Поддержка RDTSC
(использование инструкции Intel RDTSC для высокоточного
определения временных интервалов).
- Процедуры для получения информации о процессоре.
- Объекты LZTimer и ULZTimer для работы с таймерами.
СИСТЕМНЫЕ ТРЕБОВАНИЯ
Для нормальной работы данного модуля требуется IBM PC совместимый компьютер
с процессором Intel 80386 или выше.
ЯЗЫК ПРОГРАММИРОВАНИЯ
Модуль ZenTimer может быть скомпилирован с помощью компилятора TMT Pascal
(Pascal компилятор для 32-битного защищенного режима DOS).
При этом могут быть использованы следующие DOS-экстендеры:
- DOS32 v3.3
- PMODE-based
- PMODE/W-based
- WDOSX-based
ОПИСАНИЕ ФУНКЦИЙ МОДУЛЯ ZENTIMER
В качестве основы для настоящего описания использовано описание библиотеки
MegaGraph Graphics Library (c) 1996 SciTech Software Inc.
procedure LZDelay (Value: DWord)
Обеспечивает задержку на указанное количество микросекунд.
function LZTimerCount: DWord
Возвращает текущее состояние счетчика таймера длинных интервалов
в микросекундах. Фактически вычисляет разность времени между моментом
запуска таймера (вызов LZTimerOn) и моментом остановки таймера
(вызов LZTimerOff).
procedure ZTimerInit
Инициализирует библиотеку Zen Timer.
Инициализация необходимо провести до того, как будут использованы любые
другие функции библиотеки.
function LZTimerLap: DWord
Возвращает текущее значение счетчика таймера длинных интервалов
в микросекундах, при этом таймер продолжает свою работу.
Фактически вычисляет разность между текущим состоянием и значением
LZTimerOn, когда таймер был запущен. Поскольку таймер при вызове функции
не останавливается, данная функции можно вызывать подряд необходимое
количество раз.
procedure LZTimerOff
Останавливает работу таймера длинных периодов.
После остановки таймера можно узнать с помощью функции LZTimerCount
количество микросекунд, прошедшее с момента запуска таймера,
до его остановки. Для получения ТОЧНЫХ ИНТЕРВАЛОВ времени необходимо
использовать именно старт и остановку таймера, а не функцию
чтения счетчика "на лету" LZTimerLap, которая не учитывает время
на передачу управления.
procedure LZTimerOn
Запуск таймера длинных периодов.
Процедура запускает счетчик таймера длинных периодов. После запуска таймера
Вы можете определить прошедшее с момента запуска время с помощью функции
LZTimerLap или, после остановки таймера, с помощью LZTimerCount.
Таймер длинных периодов использует ряд высокоточных механизмов измерения
времени для получения точности до 1 микросекунды (если только это возможно).
В зависимости от типа процессора и операционной среды используются следующие
приемы.
Если используется процессор типа Pentium, поддерживающий инструкцию RDRSC
(Read Time Stamp Counter), то библиотека Zen Timer будет использовать
эту возможность для получения максимально возможной точности измерения
временных интервалов.
Если же инструкция RDTSC процессором не поддерживается, то в качестве
тактового источника используется микросхема таймера 8253.
Процедуры, работающие с таймером 8253 могут обеспечивать высокую точность
при работе в чистом DOS, однако, в DOS окне под Windows
или другой операционной системой этот метод не позволяет добиться точных
отсчетов времени.
Примечание:
Поскольку ZenTimer для хранения основного счетчика использует
32-битное беззнаковое целое, Вы можете максимально накопить в нем не
более, чем 2^32 микросекунд, или примерно 1 час 20 минут.
Специально для измерения более длинных интервалов в библиотеке
Zen Timer предусмотрен таймер длинных периодов (LZTimer).
function LZTimerResolution: Double
Возвращает значение разрешения таймера длинных периодов.
Разрешение измеряется в секундах за 1 такт и представлено в виде
числа с плавающей точкой. Данная функция всегда возвращает значение
1e-6, т.е. 1 микросекунда.
procedure ULZDelay (Value: DWord)
Осуществляет задержку на 1 тик (0.054925 сек.)
function ULZElapsedTime(start, finish: DWord): DWord
Вычисляет длительность интервала времени между двумя измерениями времени.
Параметры:
start - Начальное значение счетчика
finish - конечное значение счетчика
Возвращаемое значение:
Интервал времени в единицах разрешения таймера длинных периодов (тики)
Описание:
Поскольку в таймере длинных периодов отсчет ведется "тиками"
(1/18-тая доля секунды или 0.054925 сек. под DOS),
данная функция возвращает результат именно в тиках.
Функция работает корректно даже тогда, когда внутрь измеряемого интервала
попадает граница суток.
function ULZReadTime: DWord
Считывает и возвращает текущее значение счетчика таймера длинных периодов
в тиках.
Для определения периода времени между двумя считываниями можно воспользоваться
функцией ULZElapsedTime.
function ULZTimerCount: DWord
Возвращает длительность интервала времени в тиках, прошедшего с момента
старта таймера длинных интервалов (вызов ULZTimerOn) до момента остановки
таймера (вызов ULZTimerOff).
function ULZTimerLap: DWord
Возвращает текущее значение счетчика таймера длинных периодов в тиках без
остановки работы таймера. Отсчет ведется с момента последнего запуска
ULZTimerOn.
procedure ULZTimerOff
Останавливает работу таймера длинных периодов.
После остановки таймера с помощью функции ULZTimerCount можно узнать,
сколько времени прошло с момента запуска таймера.
procedure ULZTimerOn
Запускает счетчик таймера длинных периодов.
После запуска таймера с помощью функции ULZTimerLap можно выяснить,
сколько времени прошло с момента запуска до текущего момента.
Таймер длинных периодов библиотеки Zen Timer использует существующий в
операционной системе механизм для точного отсчета времени с максимальной
точностью, обеспечиваемой самой операционной системой, что вполне
достаточно для задач, выполнемых данным таймером. Следует обратить внимание,
что разрешение одного тика не одинаково на различных платформах,
и поэтому рекомендуется пользоваться функцией ULZTimerResolution для
определения длительности одного тика времени, и потом использовать это
значение для перевода количества тиков в секунды.
В 32-битном режиме DOS для отсчета времени используется системный таймер,
срабатывающий 18.2 раза в секунду. Учитывая то, что значение счетчика
возвращается как 32-разрядное беззнаковое целое число, мы можем отсчитывать
временные интервалы, не превышающие значение максимум 2^32 тиков, или
примерно 65550 часов или 2731 день!
function ULZTimerResolution: Double
Возвращает разрешение таймера длинных периодов в секундах
в виде числа с плавающей точкой.
Функция всегда возвращает значение 0.054925.
function CPU_getCPUIDFeatures: DWord
Возвращает идентификатор процессора по команде CPUID
(семейство/модель/stepping/свойства).
function CPU_getProcessorSpeed: DWord
Возвращает частоту в Mhz, на которой работает процессор.
Если частоту определить не удается, то функция вернет нулевое значение.
function CPU_getProcessorType: DWord
Возвращает тип процессора.
Если процессор оказывается безымянным процессором семейства Pentium,
нумерацию которого определить невозможно, то возвращается значение,
большее или равное константе CPU_UnkPentium (в зависимости от результата,
полученного по команде CPUID).
Имеются следующие предопределенные константы типа процессора:
CPU_unknown = 0; -- Неизвестный процессор
CPU_i386 = 1; -- Intel 80386
CPU_i486 = 2; -- Intel 80486
CPU_Pentium = 3; -- Intel Pentium(R)
CPU_PentiumPro = 4; -- Intel PentiumPro(R)
CPU_PentiumII = 5; -- Intel PentiumII(R)
CPU_UnkPentium = 6; -- Неизвестный процессор
семейства Pentium
Кроме констант определены следующие текстовые строки:
CpuTypes: array [0..6] of string =
(
'Unknown',
'Intel 80386',
'Intel 80486',
'Intel Pentium(R)',
'Intel PentiumPro(R)',
'Intel PentiumII(R)',
'Unknown Pentium'
);
function CPU_haveMMX: Boolean
Определяет, поддерживает ли процессор подмножество инструкций Intel MMX.
Если MMX поддерживается, то возвращается TRUE.
Если процессор не поддерживает MMX, то возвращается FALSE.
|