Возникла следующая проблема: Нужно определить скорость передачи данных через USB-2.0 порт. Была идея подключить к USB компьютера микроконтроллер с интерфейсом USB 2.0 и посылать данные (например 1,2,3,4,...) в порт на максимальной скорости (480Мбит/сек), и каким-то образом определять пропавшие пакеты, таким образом определить пропускную способность шины.. Но 1) Время между потерянными пакетами я планировал вычислять с помощью стандартных аппаратных таймеров. Но... каких? Может ли подойти стандартный таймер Windows? (что-то вроде GetTickCount, только из Ring0) 2) как повлияет многозадачность Windows на определение этой скорости? Возможно ли создать драйвер, который отключит вытеснение задач хотя бы на определенное время? 3) существует ли возможность аппаратно определить скорость у USB-контроллера (не прибегая к замерам с помощью внешних таймеров)? 4) может проще было бы определить скорость на стороне микроконтроллера? (PC отсылает "мусор", а контроллер имеет точный таймер для замеров отрезков времени и включен на максимальной скорости) 5) Как ведет себя контроллер USB (ну или корневой usb-hub) когда скорость передачи на стороне клиента превышает его собственною? Есть ли у него какой-то буффер? Или он просто отбрасывает потерянные пакеты? Вызывает ли он какие-то исключения/прерывания в подобных случаях? 6) Хотелось бы реализовать этот драйвер на максимально возможном высоком уровне (подальше от низкоуровневых портов и in/out ). Возможно ли это? Если можно, посоветуйте недорогой микроконтроллер с USB 2.0 для реализации подобных дел Всем спасибо, кто ответит. Прошу прощения за возможно глупые вопросы (уже читаю RTFM ), но вопросы не отпадают, а только появляются..
simnet_ На сколько я помню, стандартный таймер имеет неточность в 55 мсек, т.е. ты сам себе ответил: На остальные вопросы у меня были где-то учебники, если найду, то скину.
simnet_ мк имхо только чтобы принимать 480Мбит/сек должен иметь частоту > 60MHz. имхо тут лучше юзать еще один комп (или другой порт этого-же) Думаю вам стоит взглянуть в сторону какой нибудь более другой оси (qnx, linux,...). что-нибудь вроде (не проверял. чистое предположение) # cat /dev/usb2 > ~/bigfile2.bin & time cat ~/bigfile1.bin > /dev/usb1 usb1 и usb2 - соединены. (как реально называются порты посмотрите) далее объем переданых данных делим на время работы приложения. А качество проверяем сравнив bigfile1.bin и bigfile2.bin.
Everhest Стандартный кварцевый генератор имеет неточность 30-50ppm, у таймера будет больше так как ошибки только накапливаются. Для USB на частоте 480МГц допускается 500ppm Что касается 55мс забудти таймер давно уже работает на большей частоте это раз. Во вторых значение читается из регистров и несвязанно с частотой прерываний, так что имеем точность 1/1193180 для класического таймера. В виндоусе если не вылазить на ринг ноль вылазят проблемы много задачности из за чего таймер выдает скачками значения приделах 10-50мс. Но это непроблема решается увеличиваем время замера хотябы до секунды и имеем приемлимаю погрешность. Правда каму какое дело, какая именно точность? Вместо устройство можно попробовать обратную петлю. Она уже встроенна как отладочное средство в USB контроллер. А можно узнать зачем надо мерить скорость и какую именно? Кстати тут вопрос какую реальную частоту, в компьюторе, имеет USB контроллер. он должен запитываться частотой 12,000Мгц, но на самоом деле он может запитываться ниже Есть регистр SOFMOD—Start of Frame Modify Register предусмотренной спецификацие для коректировки частоты. По дефолту он расчитан на входную частоту 11936 и коректируется на 64. Вот интерестно сколько реально подается и на сколько он каректируется. Мое преположение реально 11932 и каректировка на 64.
Идея в том, чтоб создать именно устройство для измерения скорости порта Существуют МК которые позволяют передавать данные с такой скоростью (под USB 2.0). Та же флешка, например.. Вот только не знаю об их стоимости.. Пытаюсь найти что-нибудь подешевле.. Может быть вы что-нибудь подскажете? Но ведь и PC должен иметь какие-то точные таймеры? Из всех что я знаю - только i8253, на котором еще звук можно генерировать . Там частота 4 МГц, правда не знаю, насколько он подходит под подобных целей. Может лучше использовать другой (слышал, существуют какие-то Performance-таймеры, встроенные в чипсет)? Или МК-шный таймер - наилучший вариант? Я бы с удовольствием, но необходимое условие - работа по Windows И появился еще вопрос из-за незнания принципов работы USB-хост контроллера.. Как повлияют на результаты измерения остальные подключенные к USB девайсы (мышь, принтер, клавиатура, ..)? Можно ли их как-нибудь отключить временно из Ring0? Этот вопрос кстати и по поводу: Всем еще раз спасибо. Не ожидал на такие быстрые ответы Added: Pavia, можно поподробнее об этой обратной петле? Как ее можно привязать к измерению скорости?
Частота не важна важна точность. Имея частоту в 1КГц можно мерить интервалы времени именьшей частоты просто дольше ждать надо будет. Что касается 4МГц вы отстали от жизни уже лет 10-15 как стандартом является генератор частоты имеющий частоту f=14,31818 МГц из него получают все остальные частоту путем умножения на M и деления на N. PIT(i8253) - имеет частоту f/12 и значение счетчика можно считать PM Timer(ACPI -TIMER) -имеет частоту f/4 значение счетчика можно считать APIC Timer - имеет частоту f может быть и выше но пока не встречал значение счетчика можно считать Performance-таймеры не существуют есть Performance - счетчики которые считают события. GetTickCount- вам хватит за глаза. Какая вам разница будет у вас точность 480±0,5 МГц или же 480±0,005МГц ? В инженерной практике принята точность до 2-3 значущие цифры. Больше просто не нужно.
6arrep читаем внимательно. Чел не хотел писать драйверов или чего еще не простого. Лив qnx позволит (если есть там дрова на usb2. неуверен) сделать все из шела и точнее, чем вынь на дровах (специфика оси). лин - просто удобнее. Вынь - система для игровых автоматов и ВБ. Если знать только ее, то конечно - она идеал.
Позвольте вас поправить - чел собирался писать драйвер или еще чего-то . Я просто надеялся использовать уже готовые надстройки Windows над USB (насколько я помню, это что-то вроде последовательного соединения PDO/FDO). Не знаю, насколько это возможно в моей ситуации. Если нет, будем работать с портами напрямую Added: Ну с таймерами вроде уже понятно Хотелось бы услышать ваше мнение по поводу #2-5. Сильно ли повлияет на измеренную скорость другие подкл. USB-устройства к тому-же хост контроллеру?
Какую именно - реальную скорость передачи данных (in/out) Зачем - сам не знаю, спрошу у заказчика . Наверно для того, чтоб определить степень загруженности основного USB-хост контроллера. Хотя... раньше я думал, что скорость USB 2.0 всегда постоянна - 480 МБит/с.
И, может, я не совсем корректно поставил вопрос: если реализовавыть эту схему с помощью обратной петли (без внешнего микроконтрллера), насколько точным будет такое измерение? Скорость будет делиться пополам на каждый из портов, верно? Или каждый получит "свои" 480 МБит?