Рейтинг@Mail.ru
TMT Logo

Модуль 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.

Автор русского проекта:
Valery Votintsev

при поддержке
TMT Development Corporation.
All rights reserved.

[Новости]   [Продукты]   [Продажи]   [Скачать]   [Апдейты]   [Поддержка]
[Документация]   [FAQ]   [Contributions]   [Ссылки]   [Связь с TMT]   [Главная]