реклама на сайте
подробности

 
 
> Согласование времени в USB-device и Windows, Как синхронизировать время внутри микроконтроллера с операционной сист
Алексей__
сообщение Sep 29 2008, 16:15
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 4-01-08
Пользователь №: 33 818



Здравствуйте!
Делаю собственный USB-device на базе AT89C5131.
Драйвер для него пишу тоже сам.
Какие есть способы согласования измерения времени внутри девайса и Windows?
Например, девайс с периодом 1 мс сканирует состояние портов,
складывает в массив, затем шлёт это в драйвер.
Как драйвер (или даже конечное приложение) может соотнести время конкретного скана внутри микроконтроллера с внутренним системным временем?
Одна из частей девайса это просто набор кнопок,
и нужно знать время их нажатия и отпускания.
Какие могут быть способы, и какова их точность?
Спасибо, надеюсь на ваши соображения.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Алексей__
сообщение Oct 3 2008, 10:04
Сообщение #2





Группа: Новичок
Сообщений: 5
Регистрация: 4-01-08
Пользователь №: 33 818



Исходная задача: психологическое тестирование людей с использованием компьютера и включенного в него внешнего устройства. На экране чего-то происходит, человек жмёт кнопки на устройстве. Соответственно, нужно знать, когда что произошло на экране, и с какой задержкой человек на это отреагировал. Вот и встала задача согласования измерения времени в 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-девайс. И драйвер хост-контроллера вполне может знать, как соотносится номер кадра с системным временем. Только вот я не нашел способа, как эту информацию достать (если она вообще имеется). Так что приходится пользоваться обходными путями.
Огромное спасибо всем, кто мне помогал.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.0187 секунд с 7
ELECTRONIX ©2004-2016