Цитата:
Сообщение от Dikoy
Я когда-то для первого пня писал на асме перехватчик прерывания клока таймера
(уж не помню какого) для точного измерения временных промежутков.
|
Таймер для точного измерения времени на Pentium? У него интервалы ~55 мс.
В Pentium уже была команда RDTSC, кот. считывала 64-битный счетчик тиков.
При 100 МГц один тик = 10 нс. Частоту процессора можно определить заранее.
P.S. Таймер 8254 (когда-то c 1981 шел отдельной микросхемой, а потом он был
интегрирован в состав микросхемы южного моста). Таймер 8254 тактируются
импульсами частотой = 1.193181 MHz (14.31818 MHz / 12). Прерывания IRQ0 от
таймера поступают с выхода OUT 0 с частотой = 18.2 Hz (1.193181 MHz / 65536).
Базовая частота 14.31818 MHz пришла в компы из системы телевидения NTSC.
Первые компы IBM PC шли на базе 8088 на частоте 4.77 MHz (14.31818 MHz / 3).
На фото легендарный кварцевый резонатор, который используется по сей день.
1) В 2004-2005 Intel начала внедрять дополнительные высокоточные таймеры (HPET)
в свои южные мосты. Но в отличие от 8254, которые программируется через порты
ввода-вывода 40-43h, HPET программируются через проецируемые на физическое
адресное пространство адреса начинающиеся с FED00000h и FED80000h - доступны
только в защищенном режиме процессора. В винде, если она видит и поддерживает
HPET, то в диспетчере устройств появляется соответствующее устройство, и в user-
режиме ими можно пользоваться через Win32 API функцию QueryPerformanceCounter.
Функция QueryPerformanceFrequency возвращает частоту таймера. Если HPET не под-
держивается, то эта функция возвращает частоту 3.579545 MHz (14.31818 MHz / 4),
на которой работает PM (Power Management) Timer. В принципе тоже вполне ничего.
2) При работе с командой RDTSC на современных многоядерных процессорах нужно
следить, чтобы исполняемый поток, из которого вызывается команда, назначался на
одно и то же ядро, а не на усмотрение ОС, дабы избежать бардака при измерениях.
В винде для этого есть соответствующая Win32 API функция - SetThreadAffinityMask.