Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Согласование времени в USB-device и Windows  (Прочитано 10343 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voytalexey
Гость
« : 29-09-2008 16:23 » 

Здравствуйте!
Как можно синхронизировать время внутри USB-микроконтроллера с системным таймером в операционной системе?
Делаю собственный USB-device на базе AT89C5131.
Драйвер для него пишу тоже сам.
Какие есть способы согласования измерения времени внутри девайса и Windows?
Например, девайс с периодом 1 мс сканирует состояние портов,
складывает в массив, затем шлёт это в драйвер.
Как драйвер (или даже конечное приложение) может соотнести время конкретного скана внутри микроконтроллера с внутренним системным временем?
Одна из частей девайса это просто набор кнопок,
и нужно знать время их нажатия и отпускания.
Какие могут быть способы, и какова их точность?
Спасибо, надеюсь на ваши соображения.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 29-09-2008 17:08 » 

посмотрите формат пакета... помоему там разбито все на кадры. и быть может получится по номеру кадра восстановить.
хотя насчет точности - большой вопрос... а какая нужна?

да и то... кто гарантирует, что пакет от устройства передастся в текекущем кадре? только написание собственного контроллера USB...
но тут есть моменты: не уврен что кадры синхронизированы с часами машины) думаю там разные кварцы - будет разбегаться понемногу.

если тупо в лоб делать - можно по приходу пакета в драйвекре опрашивать часы... если пакеты на DPC хотя бы обрабатываются - есть шанс уложится в 1мс...
но вообще надо понимать - гарантий никаких)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
voytalexey
Гость
« Ответ #2 : 01-10-2008 09:02 » 

Спасибо за готовность помочь.
Точность нужна не хуже одного тика системного таймера Windows.

Была мысль, чтоб написать функцию согласования таймеров так:
приложение измеряет системное время Widows, запоминает, отправляет в МК запрос вида "выдать текущее состояние внутреннего таймера МК", МК отвечает, приложение получает ответ, и в этот момент снова измеряет системное время Widows.
Если предположить, что длительность выполнения запроса "туда" и "обратно" одинаковое, то можно вычислить, какое время было внутри Windows в тот момент когда МК начал отрабатывать запрос.
Но никаких гарантий того, что длительность запроса "туда" и "обратно" одинаковое, нет.
И ещё я подумал, может есть уже готовые методы согласования счетчиков времени внутри USB-девайсов и Windows?
Способ через написание собственной функции мне кажется кривоватым.

Немного не понял замечание
"если пакеты на DPC хотя бы обрабатываются - есть шанс уложится в 1мс..."
Если я в драйвере засекаю системное время в момент прихода пакета,
какая разница, в синхронном или асинхронном режиме я обрабатываю пакет?

Огромное спасибо за помощь.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-10-2008 12:08 » 

APIC 3МГц? 330нс?! нереально.
винда и вообще архитектура x86 на это не расчината "впринципе".

по замечанию - нет гарантии того, что момент обработки пакета совпадает со временем его прихода.
может пройти до 10(в ЛУЧШЕМ случае) а то и сотен мкс.

можно попробовать измерять относительное время, по номеру цикла шины USB. помоему там было такое понятие. посмотрите в Агурове арбитраж шины и поля пакетов.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
voytalexey
Гость
« Ответ #4 : 03-10-2008 10:49 » 

Здравствуйте.
Что-то я совсем перестал понимать замечания.
Кто такой APIC? И почему он 3МГц?
И как это относится к проблеме согласования систем измерения времени в Windows и МК?

То, что WinXP это не система реального времени, это понятно.
Потому и хотел узнать, с какой точностью можно согласовывать времена.
И вот что получилось после некоторых мучений.
В драйвере моего устройства попробовал засекать системное время перед отправкой пакета URB в драйвер шины и системное время при возврате. Использовал функцию KeQueryPerformanceCounter(). Получилось, что запрос типа BULK IN размером 8 байт (ровно в максимальный размер пакета конечной точки) обрабатывался за 1.30+-0,05 мс.
В драйвере отправка данного пакета происходит в обработчике DeviceIOControl.
Пробовал измерять время из exe-шника, перед вызовом DeviceIOControl и после него, использовал функцию QueryPerformanceFrequency. Получил время 1.91+-0,05 мс.
При тестировании на данной шине было только моё устройство, рядом никто не мешался, и шина была свободна.
Так что в принципе нашелся способ согласования времени в Windows и МК с точностью 2 мс. Для моей текущей задачи величина вполне приемлемая.
Но неприятный осадок остался. Ведь хост-контроллер периодически посылает в шину SOF-пакеты, в них содержится номер кадра, который мог бы использовать мой USB-девайс. И драйвер хост-контроллера вполне может знать, как соотносится номер кадра с системным временем. Только вот я не нашел способа, как эту информацию достать (если она вообще имеется). Так что приходится пользоваться обходными путями.
Огромное спасибо за помощь.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 03-10-2008 12:53 » 

посмотрите QueryBusTime() и USB_BUS_INTERFACE_USBDI_V0 возможно подойдет... я типа этого имел в виду.

APIC - это системный таймер x86. частота у него около 3 МГц в зависимости от оборудования...
кстати KeQueryPerformanceCounter() (он же RDTSC) работают не на всех машинах. На некоторых машинах вместо тиков процессора возвращается 3МГц счетчик. имейте в виду - я уже наступал на эти грабли... и с CoreDuo тоже нестыковки есть...
http://www.google.ru/search?sourceid=navclient&hl=ru&ie=UTF-8&rls=GGLG,GGLG:2005-41,GGLG:ru&q=KeQueryPerformanceCounter+RDTSC
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
voytalexey
Гость
« Ответ #6 : 18-10-2008 08:12 » 

Спасибо за наводку.
Действительно, таки есть возможность соотнести номера кадров с системным временем
используя  QueryBusTime() и USB_BUS_INTERFACE_USBDI_V0.
К тому же в  NuMega DriverStudio есть функция
KUSBLowerDevice::GetCurrentFrameNumber();
Я её как-то незаметил сразу.
В общем, в итоге имеется возможность согласовать время в МК и Windows с точностью до одного кадра USB, 1 миллисекунда.
Огромное спасибо за помощь.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 18-10-2008 10:11 » new

(((
ну не подсаживайтесь же на классы нумеги! умерла она! читайте DDK - это гораздо полезнее!
ну сами же себе яму копаете!
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines