Здравствуйте специалисты!
Подскажите, пожалуйста, как для конечной точки (EP) размером 64 Байт (максимум для Bulk Full Speed) получается скорость обмена почти 1 МБайт/сек, если 64 Байта / 1 мс будет всего 64 КБ / сек.
Ни где не нашел в спецификации, что за один фрейм одна и та же EP может получать несколько транзакций с запросом на передачу данных в сторону Хоста (IN) и соответственно выполнять несколько передач блоков максимальной длины.
Может ли быть такое: Host Application хочет прочитать, например 645 байт из Bulk EP, оно просто передает IRP драйверу с размером буфера в 645 байт и в течении TimeOut ждет данные. Драйвер разбивает этот IRP на 11 транзакций IN и передает их в шину?
И тогда в течении 1 фрейма может, будет:
[ IN Token 0] {Data 0-63} [ACK]
…
[ IN Token 9] {Data 576-639} [ACK]
[ IN Token 10] {Data 640-644} [ACK]
А Firmware просто опрашивает например флаг опустошения EP, и при необходимости записывает новую порцию данных?
Спасибо за ответ.
Так и будет, если шина в данный момент свободна. В моем случае при использовании в устройстве двойной буферизации и при пересылке блоков данных размером в десятки мегабайт прокачка достигала 920 - 960 Кб/с. Скорость ограничивается еще тем, что за один IRP запрос нельзя переслать больше 64Кб.
Спасибо за ответ.
А, вы не подскажите где об этом написано, или можно прочитать. Может я плохо читал спецификацию USB, но так, к сожалению и не нашел, что за 1 фрейм может передаваться несколько транзакций для EP в режиме Bulk. Еще хотел уточнить для изохронных EP и по прерываниям в одном фрейме для одной и той же EP может быть несколько транзакций? В спецификации есть таблицы для каждого типа передач, один из столбцов называется Max Transfers, не подскажите, что он определяет: теоретически возможное количество транзакция для всей шины (несколько устройств, несколько EP), или для возможное количество транзакция для одного устройства с одной EP.
Спасибо.
В общем то я сам спецификацию читал по диагонали

. Все больше на собственных ошибках опыта набираюсь. Про изохронные ЕР - одна транзакция за фрейм, буфера при двойной буферизации переключаются у тех камней с которыми работал, по SOF. Max Transfer определяет теоретический предел пропускной способности шины вобщем. Но в каждом конкретном случае надо разбираться отдельно. Например ISO trans max size - 1023 byte/ms. Это значит что одно устройство может само их передавать, могут два устройства поделить между собой но уже меньшее количество (накладные расходы на передачу служебной информации в этом случае увеличиваются). При этом 10% останется для Control Transfer и возможно Bulk. Многое зависит еще и от софта на хосте. Винда иногда, как мне кажется не совсем корректно обрабатывает скользкие ситуации. В общем - большое поле для экспериментов.
Большое спасибо за ответ.
В спецификации USB естественно прямо не указано, что чере один EP за фрейм может передаваться более одного пакета. Но реально это так - Bulk передача занимает все свободное время шины, и если других активных устройств нет, то при отсутствии задержек на обработки запроса на передачу, можно достигнуть 900 кБ/сек на USB 1.1.
Изохронные транзакции от Bulk практически не отличаются, тут зависит от драйверов хоста. В Windows я не нашел поддержки interrupt-канала, работал с ним как с bulk.
По изохронному каждый фрейм идет запрос на передачу, но реально пакет может и не передаваться. За фрейм от одного ЕР передается только один пакет, длиной не более максимальной установленной для данного ЕР.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.