моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
В этой статье обсуждаются рекомендации по тщательному управлению пропускной способностью USB. Каждый драйвер USB-клиента отвечает за минимизацию используемой полосы пропускания USB и максимально быстрый возврат неиспользуемой полосы пропускания в пул доступной полосы пропускания.
Здесь мы думаем, что скорость USB 2.0 составляет 480 Мбит/с, 12 Мбит/с и 1,5 Мбит/с, что соответствует высокой скорости, полной скорости и низкой скорости соответственно. Но на самом деле пропускная способность USB 2.0 очень ограничена. Из помещения этой статьи выглядит USB 3.0. Это облегчает проблему с пропускной способностью, но проблема с пропускной способностью - это не недостаточный верхний предел, а проблема гибискуса планирования.
Конкуренция за пропускную способность шины USB исходит из нескольких источников, включая аппаратное и программное обеспечение. Трудно точно предсказать объем полосы пропускания, доступной драйверу USB-клиента. Хост-контроллерам USB для работы требуется определенная полоса пропускания. Требуемое количество зависит от того, является ли контроллер высокоскоростным. Это варьируется от системы к системе. USB-концентраторам, работающим на высокой скорости, иногда приходится транслировать транзакции между высокоскоростными восходящими портами и нижестоящими низкоскоростными устройствами, и этот процесс трансляции потребляет полосу пропускания. Однако необходимость использования полосы пропускания для преобразования транзакций зависит от типа подключенного устройства и топологии дерева устройств.
Наиболее серьезное давление на ресурсы полосы пропускания обычно оказывают драйверы USB-клиентов, которые монополизируют полосу пропускания. Система распределяет полосу пропускания в порядке очереди. Если первый загруженный драйвер USB запрашивает всю доступную полосу пропускания, последующие загруженные драйверы USB не будут предоставлять пропускную способность своим устройствам. Система не может настроить или перечислить устройство. Поскольку причина сбоя перечисления не очевидна, взаимодействие с пользователем оставляет желать лучшего.
Иногда клиентские драйверы исчерпывают доступную полосу пропускания из-за высокоскоростной передачи прерываний. Но, безусловно, наиболее распространенным сценарием является то, что драйвер клиента выделяет слишком большую полосу пропускания для постоянной передачи и не может своевременно ее освободить. Система сохраняет выделенную полосу пропускания до тех пор, пока драйвер, запросивший ее, не закроет свою конечную точку, открыв другую конечную точку, или пока устройство, которому была выделена полоса пропускания, не будет удалено. Система не выделяет гарантированную полосу пропускания для массовых передач, поэтому массовые передачи никогда не являются причиной сбоев перечисления. Однако производительность устройства массовой передачи зависит от объема полосы пропускания, выделенной устройству для регулярных (постоянных ожиданий и прерываний) передач.
Спецификация USB 2.0 требует, чтобы постоянные устройства имели конечные точки с нулевой пропускной способностью в настройках интерфейса по умолчанию. Это гарантирует, что полоса пропускания не резервируется для устройства до тех пор, пока функциональный драйвер не откроет интерфейс, отличный от интерфейса по умолчанию, что помогает предотвратить сбои перечисления из-за запросов чрезмерной пропускной способности во время настройки устройства. Это не мешает клиентским драйверам выделять чрезмерную пропускную способность после настройки своих устройств, тем самым препятствуя правильной работе других устройств.
Ключом к правильному управлению полосой пропускания является то, что каждое USB-устройство в системе, выполняющее постоянную передачу, должно предоставлять несколько альтернативных настроек (Alt) для каждого интерфейса, содержащего постоянные конечные точки, и драйвер клиента должен разумно использовать эти настройки Alt. Клиентские драйверы должны сначала запросить настройку интерфейса с самой высокой пропускной способностью. Если запрос не выполнен, драйвер клиента должен запрашивать настройки интерфейса со все меньшей пропускной способностью, пока запрос не будет успешным.
Например, предположим, что устройство веб-камеры имеет следующий интерфейс:
Интерфейс 0 (настройки интерфейса по умолчанию: в настройках по умолчанию нет конечных точек с ненулевой постоянной пропускной способностью)
Const Endpoint 1: Максимальный размер пакета = 0 байт.
Const Endpoint 2: Максимальный размер пакета = 0 байт.
Интерфейс 0 Альтернативная настройка 1
Const Endpoint 1: максимальный размер пакета = 256 байт.
Const Endpoint 2: максимальный размер пакета = 256 байт.
Интерфейс 0 Альтернативная настройка 2
Const Endpoint 1: максимальный размер пакета = 512 байт.
Const Endpoint 2: максимальный размер пакета = 512 байт.
Драйвер веб-камеры настраивает веб-камеру на использование настроек интерфейса по умолчанию при инициализации. Настройки по умолчанию не имеют постоянной пропускной способности, поэтому использование настроек по умолчанию во время инициализации позволяет избежать опасности того, что веб-камера не сможет выполнить перечисление из-за неудачного запроса постоянной пропускной способности.
Когда клиентский драйвер готов выполнять постоянную изохронную передачу, ему следует попытаться использовать альтернативный параметр 2, поскольку альтернативный параметр 2 имеет наибольший размер пакета. Если запрос не выполнен, драйвер может повторить попытку, используя настройку Alt 1. Поскольку для альтернативного параметра 1 требуется меньшая пропускная способность, этот запрос может быть успешным, даже если первый запрос завершится неудачей. Множественные настройки Alt позволяют водителю сделать несколько попыток, прежде чем сдаться.
Когда веб-камера перейдет в режим ожидания, выделенную полосу пропускания можно вернуть в пул доступной пропускной способности, снова выбрав настройки по умолчанию.
Пользователи могут увидеть, какую полосу пропускания выделил USB-контроллер, проверив свойства контроллера в диспетчере устройств Windows. Выберите свойства контроллера и просмотрите вкладку «Дополнительно». Это значение не указывает, какую пропускную способность USB-концентратор выделяет для трансляции транзакций.
Функция диспетчера устройств, сообщающая об использовании полосы пропускания контроллера USB, не работает должным образом в Windows XP.
Максимальный размер передачи задает жестко запрограммированное ограничение в стеке драйверов USB. Передача размеров ниже этих ограничений может привести к сбою из-за ограничений системных ресурсов. Чтобы избежать подобных сбоев и обеспечить совместимость со всеми версиями Windows, избегайте использования больших объемов данных для передачи данных через USB.
Член MaximumTransferSize структуры USBD_PIPE_INFORMATION устарел. Стек драйверов USB игнорирует значение MaximumTransferSize для составных и некомпозитных устройств.
В Windows 2000 стек драйверов USB инициализирует MaximumTransferSize значением USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Драйверы клиента могут установить меньшее значение при настройке устройства. Для составных устройств клиентские драйверы для каждой функции могут изменять только MaximumTransferSize канала в настройках интерфейса, отличных от настроек по умолчанию.
Размер передачи через USB ограничен:
Ограничение размера передачи с помощью MaximumTransferSize не влияет напрямую на пропускную способность, потребляемую устройством. Драйвер клиента должен изменить настройки интерфейса или ограничить максимальный размер пакета, установленный в элементе MaximumPacketSize USBD_PIPE_INFORMATION.
Максимальный размер пакета определяется полем wMaxPacketSize дескриптора конечной точки. Клиентские драйверы могут регулировать размер USB-пакета в некоторых запросах интерфейса к устройству. Изменение этого значения не приводит к изменению wMaxPacketSize на устройстве.
Внутри запрошенного URB находится структура USBD_PIPE_INFORMATION канала. В этой структуре
Когда драйвер клиента выдает запрос на чтение, размер буфера передачи должен быть кратным максимальному размеру пакета. Даже если драйверу требуется меньше данных, чем максимальный размер пакета, он все равно должен запросить весь пакет. Передача завершается, когда устройство отправляет пакет размером меньше максимального (короткий пакет).
На старых контроллерах драйверы клиента могут переопределить это поведение. В элементе TransferFlags URB передачи данных драйвер клиента должен установить флаг USBD_SHORT_TRANSFER_OK. Этот флаг позволяет устройству отправлять пакеты размером меньше wMaxPacketSize.
На хост-контроллерах xHCI USBD_SHORT_TRANSFER_OK игнорирует массовые конечные точки и конечные точки прерываний. Передача коротких пакетов на контроллере EHCI не приводит к возникновению ошибки.
На хост-контроллерах EHCI USBD_SHORT_TRANSFER_OK игнорируется для конечных точек пакетной обработки и прерываний.
На хост-контроллерах UHCI и OHCI, если USBD_SHORT_TRANSFER_OK не установлен для массовой передачи или передачи с прерыванием, передача коротких пакетов остановит конечную точку и вернет код ошибки передачи.
Драйвер стека драйверов USB накладывает разные ограничения на размер пакета при записи на устройство и при чтении с устройства. Некоторым клиентским драйверам приходится часто передавать небольшие объемы управляющих данных для управления своими устройствами. В этом случае нецелесообразно ограничивать передачу данных пакетами одинакового размера. Таким образом, во время записи данных стек драйверов не придает никакого особого значения пакетам, размер которых меньше максимального размера конечной точки. Это позволяет драйверу клиента разбивать большие передачи на устройство на несколько URB, размер которых меньше или равен максимальному.
Драйвер должен завершить передачу пакетом размером меньше максимального или использовать пакет нулевой длины для ограничения конца передачи. Передача не будет завершена, пока драйвер не отправит пакет размером меньше wMaxPacketSize. Если размер передачи в точности кратен максимальному значению, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
В соответствии со спецификацией USB драйвер клиента отвечает за разграничение передачи данных с использованием пакетов нулевой длины. Стек драйверов USB не генерирует эти пакеты автоматически.
Совместимые драйверы USB 2.0 и USB 1.1 должны передавать пакет максимального размера (wMaxPacketSize), а затем завершать передачу пакетом меньше максимального размера или использовать пакет нулевой длины для ограничения конца передачи. Передача не будет завершена, пока драйвер не отправит пакет размером меньше wMaxPacketSize. Если размер передачи в точности кратен максимальному значению, драйвер должен отправить пакет с разделителями нулевой длины, чтобы явно завершить передачу.
Драйвер устройства отвечает за разграничение передачи данных с использованием пакетов нулевой длины, как того требует спецификация USB. Системный USB-стек не генерирует эти пакеты автоматически.