Здравствуйте, подскажите пожалуйста начинающему: Есть девайс, он посылает в ком-порт сигналы, нужно определить переод между сигналами в точности до миллисекунд, как можно это сделать?
N1k3R А как перевести такты процессора во время? Проще всего - выдать на COM-порт сигнал с известными параметрами и по нему откалиброваться.
На com-порт будут подаваться сигналы с не постоянным переодом, мне нужно фиксировать и выводить на экран переод между последними сигналами. То есть, например, определить переод между сигналами, задержка секунды на 2, и ещё раз определить переод и тд.
Период с такой точностью можно определять и в Windows (при этом правда, поток проверяющий никогда не будет спать - и соотв. нагрузка на проц будет 100%). Вполне хватит функций работающих с счетчиками производительности/мм-таймеров.
N1k3R С примером помочь не могу (страшно лень). Посмотри функции QueryPerformanceCounter и QueryPerformaceFrequency в MSDN - вроде бы все просто, касательно их использования...
Можно также использовать "комбинированный метод": QueryPerformanceFrequency для определения числа тактов в секунду, а вместо QueryPerformanceCounter использовать RDTSC - зачем лазить в ядро ради одной инструкции
Определение числа тактов в сек. .code push REALTIME_PRIORITY_CLASS push -1 call SetPriorityClass ; Устанавливаем макс. приоритет процессу push THREAD_PRIORITY_TIME_CRITICAL push -2 call SetThreadPriority ; Устанавливаем макс. приоритет потоку push 10 call Sleep RDTSC mov esi, edx mov edi, eax push 1000 ; Задержка 1 сек. call Sleep RDTSC sub eax, edi sbb edx, esi Пара eax:edx будет содержать приблизительное кол-во тактов в секунду.
Это верно, только если замеряешь на такты небольшой участок кода, а в этом случае CPUID вызовет дополнительную задержку и увелечение часла тактов. Вот прога, замеряющая частоту, с закоментированными CPUID даёт меньшую погрешность. Проверь у себя.