Я знаю, что могу использовать IRQ0, то есть системный таймер, но он основан на тактовой частоте 14,31818 МГц, верно? Есть ли что-нибудь более точное?
Спасибо.
Изменить: кто-нибудь знает, что использует функция Windows QueryPerformanceCounter?
Я знаю, что могу использовать IRQ0, то есть системный таймер, но он основан на тактовой частоте 14,31818 МГц, верно? Есть ли что-нибудь более точное?
Спасибо.
Изменить: кто-нибудь знает, что использует функция Windows QueryPerformanceCounter?
«Точность» и «аккуратность» означают разные вещи. «Окружность Земли составляет 40000,000000000 км» - это точно, но неточно. С часами немного сложнее:
Хотя "системный таймер" (PIT согласно Википедии) работает на частоте 1 МГц, вы Обычно IRQ0 находится между 100 и 1000 Гц. По-видимому, вы также можете дважды читать с порта 0x40, чтобы получить текущее значение счетчика, но я не уверен, какая у этого задержка (а затем вы получаете количество отсчетов до следующего прерывания, поэтому вам нужно выполнить некоторую математику). Он также не работает на более современных ядрах без тиков.
Есть еще несколько высокочастотных таймеров:
Дарвин (т.е. OS X), по-видимому, предполагает, что частота TSC не изменяется, и регулирует базовое значение, добавленное к ней, при пробуждении из состояния сна, когда TSC не работает (очевидно, C4 и выше). Существует другое базовое значение для каждого ЦП, потому что TSC не нужно синхронизировать между ЦП. Вы должны приложить разумные усилия, чтобы получить разумную временную метку.
IIRC, Linux просто выбирает один источник синхронизации (TSC, если он вменяемый, а затем HPET, а затем ACPI PM, я думаю).
IIRC, QueryPerformanceCounter () использует то, что Windows считает лучшим. Это также в некоторой степени зависит от версии Windows (XP предположительно не поддерживает HPET для прерываний, поэтому, по-видимому, не поддерживает и временные метки). Вы можете вызвать QueryPerformanceFrequency (), чтобы сделать предположение (я получаю 1995030000, что, вероятно, означает, что это TSC).
В процессорах Intel информация таймера высокой точности обычно доступна с помощью инструкции rdtsc.
Его точность намного выше, чем 14 МГц. Предостережение заключается в том, что у него могут быть проблемы с многоядерными процессорами и процессорами со степпингом.
Изменить: Этот вопрос содержит гораздо больше деталей. по этому поводу.
1. Фактическая частота зависит от процессора, но часто это частота процессора. Судя по всему, на процессорах Nehalem TSC работает на частоте фронтальной шины (133 МГц).