Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Скорость USB 2.0
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
dmitry-tomsk
Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0:
1) На какую среднюю пропускную способность можно расчитывать?
2) Самый скоростной чипсет мат. платы в плане USB ?
3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости?
4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл?
5) Кто или что может будить устройство под XP без спроса?
nemo444
Цитата(dmitry-tomsk @ Mar 3 2005, 22:29)
Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0:
1) На какую среднюю пропускную способность можно расчитывать?
2) Самый скоростной чипсет мат. платы в плане USB ?
3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости?
4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл?
5) Кто или что может будить устройство под XP без спроса?
*


Писал драйвер под ХР (USB2.0), НО устройство было USB1.1.
IMHO если устройство на шине одно, то BULK - самый удобный вид передачи.
ISO быстрее только в случае наличия нескольких устройств на шине.
Большой минус ISO - негарантированная доставка пакетов.
Максимум скорости для BULK USB1.1 (~1,6 Mbit/s) был достигнут без особых усилий.

Что значит "Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл" ? На стороне РС надуваешь USB Bus Driver в асинхронном режиме (не ждешь завершения предыущего запроса) - пакеты вылетают на шину со свистом. USB Bus Driver сам слепит всё за тебя так, как ему удобнее. Сообщит об ошибке, если делаешь что-то не так.
dmitry-tomsk
Спасибо за ответ! В асинхронной накачке есть минусы - нужно делать очередь в драйвере, чтобы пакеты не перепутались. А скорость хотелось порядка 50 Мбайт/сек, пока у меня только 30 получается.
А насчёт спячки ничего сказать не можете?
v_mirgorodsky
Я знаю smile.gif

1. Средняя пропускная способность по USB выше 40MB/s строго говоря очень проблематична. У нас получилось достигнуть 46MB/s, но это уже был екстремум. Использовали BULK-трансферы с одним устройством на шине, на серверной двухпроцессорной материнке. В устройстве стоял CY7C68013.

2. Самый скоростной чипсет в плане USB - Intel, с ICH4-5 и новее южным мостом. В этих чипсетах USB хост встроен в чипсет, что позволяет достичь большей пропускной способности. По результатам тестирования прирост составляет 30-40% по сравнению с внешними USB хостами.

3. С ISO не работали, потому ничего не скажу.

4. Сцепка URB-ов не поддерживается на данный момент ни под одной из ОС, поддерживающих USB. Эта идея была выдвинута для ускорения работы шинного драйвера, однако похоронена за ненадобностью. Винда, например, тупо показывает синий экран, если видит там что-либо отличное от NULL smile.gif

5. Устройство под хрюном никто кроме драйвера не трогает. Однако, если реализован ровер-манаджер (IRP_MJ_POWER), то винда может по своему усмотрению будить устройство, но через ваш драйвер. По другому это не работает. Хост ничего не шлет лишнего, чего ему не скажут послать, ничего не прячет и ведет себя в высшей степени корректно. Если устройство просыпается само по себе, то значит есть ошибки в софте или девайсе - ищите.

Самый ПЛОХОЙ (ДЕРЬМОВЫЙ, %:?№", ....) чипсет в плане USB это VIA, его надо избегать, IMHO. Железка там может и не самая плохая, но драйвера полный отстой, IMHO.
nemo444
2 dmitry_tomsk

Очередь в драйвере реализовать просто. Полно всяких классов для работы со связанными списками ( я их использовал для хранения URB). Не нравится С++, напиши что-то своё.

Если не хочешь всё же связываться с асинхронной передачей запросов в USB Bus Driver, попробуй увеличить размер URB, которыми его накачиваешь.
Насколько я понял, драйвер шины у микрософта работает весьма эффективно,если ему не давать простаивать. По моему опыту синхронная передача в Bus Driver URB небольших размеров здорово снижает скорость.

Ещё совет: не делай каждый раз выделение памяти под новый URB.
Используй метод "reuse URB" для засылки в драйвер шины.

Может вот эта ссылка чем-то будет полезна?(h**p://www.usb.org/phpbb)

По поводу спячки полностью согласен с v_mirgorodsky.
dmitry-tomsk
Спасибо огромное за помощь!!!
Размеры URB увеличивать пробовал, получал синий экран в отместку.
С синхронной передачей в драйвере у меня тоже не получается. Стандартный пример в DDK использует
BuildPartialMdl, если устройство отключить во время передачи данных, то попытка освободить память
в CompletionRoutine приводит к синему экрану. Если посылать асинхронные запросы в драйвере,
то каким образом разбить таблицу MDL на части? А если в приложении, то сколько запросов нужно делать?
Если считать время пересылки стандартного пакета 64 кБ = 1 ms, то какой массив надо запихать в
waitformultipleobject, чтобы обеспечить непрерывность посылки при условии, что в параллельном потоке
данные обрабатываются (полагаю, связано с квантом опроса активности потоков)?
Кстати, для CY7C68013, можно ли там сбросить уже заряженный endpoint буфер для EP2-4-6-8? С EP1 достаточно было сбросить BUSY флаг, а для других что-то не найду такого.
nemo444
Я лично писал драйвер с использованием DriverStudio v3.1. Мне это показалось удобнее, чем непосредственно на DDK. На изучение много времени не уйдёт - там всё просто (готовые классы на основе DDK). К тому же SoftIce здорово помог в отладке. Плюс есть куча примеров WDM драйверов (в том числе и USB).
Синий экран - следствие ошибок в написании драйвера. У меня тоже так было, пока баги не подчистил. Если ошибки возникают в устройстве, то драйвер просто подвисает (так у меня было). Внимательно почитай, что тебе синий экран пишет (очень помогает понять из-за чего он вываливается). У меня увеличение размера URB не вызывало синего экрана. Взять более свежую версию DriverStudio можно вот здесь:
h**p://soft.0zones.com/SoftDown.asp?ID=16751 и обязательно здесь:
h**p://soft.0zones.com/SoftDown.asp?ID=22405

Ещё мне понравился пример из книги John Hyde ""USB Design by Example". Особенно рекомендую Chapter 11 "Moving a lot of Data" и пример к ней.
Не получится найти в гугле - пиши.
v_mirgorodsky
Есть такая английская книжка Walter Oney, "Programming Windows Driver Model", первое или второе издание. Кое чего по ней можно посмотреть на сайте автора: h**p://ww*w.oney*soft.co*m. Эта книга уже давно считается Библией по вопросам написания WDM драйверов под Windows. Там рассмотрены практически все аспекты программирования WDM драйверов и в частности уделено очень много внимания USB драйверам. Она есть на нашем FTP. Там описано все по поводу очередей, обработки запросов от USB и т.д.

Без построения очередей в драйвере и рециклирования буфера в CompletionRoutine() добиться сколь нибудь нормальной скорости невозможно sad.gif
dmitry-tomsk
Большое спасибо за помощь!!!
Книгу Oney в инете нашёл, действительно классная, я пользовался книгой backer the windows 2000 device driver book, там все очень поверхностно. Driver Studio тоже начал закачивать. Книгу Хайда не нашел, но думаю, пока и найденного хватит для изучения. Попробую совместить асинхронную накачку с двумя выделенными URB, а затем перезаряжать их в CompletionRoutine. На импортном форуме нашёл, что задержка от передачи irp в шинный драйвер до вызова CompletionRoutine 750 тыс тактов процессора, то есть от 0,5 до 2 мс для более менее современных компьютеров, так что двумя запросами со стандартным размером буфера endpoint 64 кБ можно обойтись.
Ещё раз спасибо за ценные советы!!!
Vallen
Help!
Скиньте USB Design by Example на мыло.
Заранее спасибо.
nemo444
2 Vallen

Уточните мыло, на которое кинуть книжку.
Она весит чуть больше 16 метров.
Vallen
2 nemo444
На zh_spb@mail.ru.
Если возможно разбитым на куски по 2-3 мега.
Заранее спасибо.
nemo444
2 Vallen
Проверяйте почту.
Разбил примерно по 2 мега. (9 кусков)
Vallen
2 nemo444
Спасибо
vvvvv
А как бы на Ftp выложить, или намыльте мне, я положу
vvvvv
Положил на ftp в upload/doc USB Design by example и USB Complete
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.