Исходная задача: психологическое тестирование людей с использованием компьютера и включенного в него внешнего устройства. На экране чего-то происходит, человек жмёт кнопки на устройстве. Соответственно, нужно знать, когда что произошло на экране, и с какой задержкой человек на это отреагировал. Вот и встала задача согласования измерения времени в Windows и МК. В принципе, погрешность 10-20 мс заказчика пока что устраивает.
Цитата
Вообще-то GetTickCount хоть и показывает время в мсек от запуска Windows, на самом деле имеет дискретность (шаг приращения) не 1мсек, а значительно больше: от 16-17 мсек для ХР до 55мсек для 98/МЕ.
Позволю себе маленькое замечание:
как ни странно, в Win98 дискретность GetTickCount составляет 2-3мс.
Хотя системный таймер действительно генерирует прерывания с периодом около 55 мс.
Вот такая была историческая странность.
В семействе WinNT вроде дискретность GetTickCount действительно совпадает периодом прерываний.
И спасибо за наводку на PerfomanceCounter.
Теперь собственно о заявленной теме.
В драйвере моего устройства попробовал засекать системное время перед отправкой пакета URB в драйвер шины и системное время при возврате. Использовал функцию KeQueryPerformanceCounter(). Получилось, что запрос типа BULK IN размером 8 байт (ровно в максимальный размер пакета конечной точки) обрабатывался за 1.30+-0,05 мс.
В драйвере отправка данного пакета происходит в обработчике DeviceIOControl.
Пробовал измерять время из exe-шника, перед вызовом DeviceIOControl и после него, использовал функцию QueryPerformanceFrequency. Получил время 1.91+-0,05 мс.
При тестировании на данной шине было только моё устройство, рядом никто не мешался, и шина была свободна.
Так что в принципе нашелся способ согласования времени в Windows и МК с точностью 2 мс. Для моей текущей задачи величина вполне приемлемая.
Но неприятный осадок остался. Ведь хост-контроллер периодически посылает в шину SOF-пакеты, в них содержится номер кадра, который мог бы использовать мой USB-девайс. И драйвер хост-контроллера вполне может знать, как соотносится номер кадра с системным временем. Только вот я не нашел способа, как эту информацию достать (если она вообще имеется). Так что приходится пользоваться обходными путями.
Огромное спасибо всем, кто мне помогал.