Показать сообщение отдельно
Старый 29.10.2013, 08:58   #57
Paul Kellerman
Gold Member
 
Регистрация: 25.06.2005
Адрес: F000:FFF0
Сообщений: 1,830
По умолчанию

Цитата:
Сообщение от 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.

Последний раз редактировалось Paul Kellerman; 29.10.2013 в 19:12.
Paul Kellerman вне форума   Ответить с цитированием
Реклама