Функции, возвращающие стандартное время Windows




Введение

 

Фиксация времени выполнения программ является одной из ключевых функций в широком классе задач. К таким задачам относятся: выполнение процессов реального времени, задачи управления, профилирования, выполнение мультимедиа - приложений, организация сетевого обмена и так далее.

Различные задачи требуют различных параметров от систем измерения, зачастую входя в противоречия друг с другом. Так, например, при профилировании программ требуется чрезвычайно высокая разрешающая способность таймера (не ниже 1 миллисекунды) и в то же время нет необходимости в измерении больших промежутков времени (минуты, часы, дни). Для многих же систем наблюдения и сбора статистики наоборот требуется возможность измерения длительных интервалов с достаточно низкой разрешающей способностью. Задачи экспериментальных измерений требуют достаточно высокой точности и зачастую некритичны к скорости выполнения функций таймера. Напротив, мультимедиа-приложения требуют высокого быстродействия.

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


Аппаратные решения

 

Для решения задач, требующих измерения времени, в компьютерах IBM-PC и совместимых начиная с первых версий (XT) устанавливается специальный таймер. Программируемый интервальный таймер - весьма сложная система, включающая в себя целых три устройства - три канала таймера, каждый из которых можно запрограммировать для работы в одном из шести режимов. И более того, на большинстве современных материнских плат располагаются два таких таймера, так что число каналов оказывается равным шести. В пространстве портов ввода-вывода для таймера выделена область от 40h до 5Fh:

порт 40h - канал 0 (генерирует IRQ0)

порт 41h - канал 1 (поддерживает обновление памяти)

порт 42h - канал 2 (управляет динамиком)

порт 43h - управляющий регистр первого таймера

порты 44h - 47h - второй таймер компьютеров с шиной MicroChannel

порты 48h - 4Bh - второй таймер компьютеров с шиной EISA

Таймер можно использовать для управления динамиком, для точных измерений отрезков времени, для создания задержек, для управления переключением процессов и даже для выбора случайного числа с целью запуска генератора случайных чисел - текущее значение счетчика канала 0 представляет собой идеальный вариант такого начального числа для большинства приложений.

Для таймера найдется много применений, единственное ограничение здесь: таймер - это глобальный ресурс, и перепрограммировать его в многозадачных системах можно только с ведома операционной системы, если она вообще это позволяет. Так, прямое программирование возможно только в однозадачных операционных системах (таких как DOS, например).

В операционных системах семейства Windows прямое программирование таймера запрещено, так как таймер используется для внутренних нужд системы (в частности переключение процессов), изменение его работы может привести к выходу из строя всей системы. Надо заметить, что в системах Windows 9x возможен перехват прерывания таймера, что дает возможность для измерения времени с малой точностью (прерывание вызывается 18,2 раза в секунду), однако изменение периода в больших пределах невозможно.

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

В каждом компьютере есть микросхема, отвечающая за поддержку текущей даты и времени. Для того чтобы они не сбрасывались при каждом выключении питания, на микросхеме расположена небольшая область памяти (от 64 до 128 байт), выполненная по технологии CMOS, позволяющей снизить энергопотребление до минимума (фактически энергия в таких схемах затрачивается только на зарядку паразитных емкостей при изменении состояния ячеек памяти). Вся эта микросхема получает питание от аккумулятора, расположенного на материнской плате, и не отключается при выключении компьютера. Для хранения собственно времени достаточно всего четырнадцати байт такой энергонезависимой памяти, и остальная ее часть используется BIOS для хранения различной информации, необходимой для корректного запуска компьютера. Для общения с CMOS и регистрами RTC выделяются порты ввода-вывода от 70h до 7Fh.

Кроме того, процессоры, начиная с процессоров Pentium, содержат в себе специальный 64 разрядный регистр. При старте компьютера он принимает нулевое значение. Далее, при каждом такте работы значение регистра инкрементируется. Таким образом, регистр содержит номер текущего такта со старта компьютера. При использовании этого значения возможно наиболее точное измерение интервалов времени, но необходимо также иметь точное значение тактовой частоты работы процессора, что не всегда возможно без использования других методов измерения времени. Кроме того, метод неприменим для процессоров с функцией динамического изменения тактовой частоты и многоядерных процессоров.

 

Программные методы

 

Программные решения всегда базируются на аппаратных, но сильно отличаются от одной операционной системы к другой. Так, если в системе DOS полностью разрешен доступ непосредственно к регистрам таймера и часов реального времени, то в Windows подобная работа запрещена, и измерение интервалов времени должно вестись исключительно с помощью функций самой системы.

Будем рассматривать операционную систему Windows и средства, ею предоставляемые (в частности структуры и функции API 32).

 

Таймеры

 

Таймер в WinAPI рассматривается как стандартное устройство ввода. Подобно остальным устройствам он посылает сообщения оконной процедуре того окна, для которого назначен (сообщение WM_TIMER).

Для присоединения таймера к программе используется процедура SetTimer. Функция содержит целый параметр, задающий интервал, который может находиться (теоретически) в пределах от 1 до 4294967295, что составляет примерно 50 дней. Это значение определяет темп, с которым Windows посылает программе сообщение WM_PAINT. Каждая единица соответствует 1 мс, то есть значению 1000 соответствует интервал в секунду.

Для остановки потока сообщений от таймера необходимо вызвать процедуру KillTimer. Процедура также очищает очередь от сообщений WM_PAINT.

Необходимо заметить, что аппаратно таймер Windows опирается на системный таймер, а значит получить разрешение выше 55мс от него получить нельзя. Кроме того, использование системы сообщений Windows приводит к значительному снижению быстродействия и увеличению времени реакции приложения на прерывание таймера. Также вследствие округления интервалов до кратных частоте срабатывания системного таймера происходит дополнительное внесение погрешностей.

К достоинствам таймера можно отнести простоту его использования и возможность работы «по прерыванию». Для приложений и задач не чувствительных к точности и разрешающей способности применение таймера достаточно.

 

Функции, возвращающие стандартное время Windows



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-03-12 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: