2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
In diesem Artikel werden Anleitungen zur sorgfältigen Verwaltung der USB-Bandbreite erläutert. Jeder USB-Client-Treiber ist dafür verantwortlich, die von ihm verwendete USB-Bandbreite zu minimieren und ungenutzte Bandbreite so schnell wie möglich in den Pool der verfügbaren Bandbreite zurückzuführen.
Hier gehen wir davon aus, dass die Geschwindigkeit von USB 2.0 480 Mbit/s, 12 Mbit/s und 1,5 Mbit/s beträgt, was einer hohen Geschwindigkeit, einer vollen Geschwindigkeit bzw. einer niedrigen Geschwindigkeit entspricht. Tatsächlich ist die Bandbreite von USB 2.0 jedoch auch sehr gering Die Prämissen dieses Artikels gehen davon aus, dass USB 3.0 das Bandbreitenproblem mildert, aber das Bandbreitenproblem ist keine unzureichende Obergrenze, sondern ein Planungs-Hibiskusproblem.
Der Wettbewerb um Bandbreite auf dem USB-Bus kommt aus mehreren Quellen, einschließlich Hardware und Software. Es ist schwierig, die Bandbreite, die einem USB-Client-Treiber zur Verfügung steht, genau vorherzusagen. USB-Host-Controller benötigen für den Betrieb eine bestimmte Bandbreite. Die erforderliche Menge hängt davon ab, ob der Controller eine hohe Geschwindigkeit hat. Es ist von System zu System unterschiedlich. USB-Hubs, die mit hoher Geschwindigkeit arbeiten, müssen manchmal Transaktionen zwischen Hochgeschwindigkeits-Upstream-Ports und Downstream-Geräten mit niedrigerer Geschwindigkeit übersetzen, und dieser Übersetzungsprozess verbraucht Bandbreite. Ob die Transaktionskonvertierung jedoch Bandbreite erfordert, hängt vom Typ des angeschlossenen Geräts und der Topologie des Gerätebaums ab.
Der größte Druck auf die Bandbreitenressourcen geht in der Regel von USB-Client-Treibern aus, die die Bandbreite monopolisieren. Das System weist die Bandbreite nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ zu. Wenn der erste geladene USB-Treiber die gesamte verfügbare Bandbreite anfordert, lassen nachfolgend geladene USB-Treiber keine Bandbreite für ihre Geräte zu. Das System kann das Gerät nicht konfigurieren oder auflisten. Da der Grund für den Aufzählungsfehler nicht offensichtlich ist, ist die Benutzererfahrung schlecht.
Manchmal erschöpfen Client-Treiber die verfügbare Bandbreite durch Hochgeschwindigkeits-Interrupt-Übertragungen. Das mit Abstand häufigste Szenario ist jedoch, dass der Client-Treiber zu viel Bandbreite für eine konstante Übertragung zuweist und diese nicht rechtzeitig freigibt. Das System behält die zugewiesene Bandbreite bei, bis der Treiber, der sie angefordert hat, seinen Endpunkt durch Öffnen eines anderen Endpunkts schließt oder das Gerät, dem Bandbreite zugewiesen wurde, entfernt wird. Das System weist keine garantierte Bandbreite für Massenübertragungen zu, sodass Massenübertragungen niemals die Ursache für Aufzählungsfehler sind. Die Leistung eines Massenübertragungsgeräts hängt jedoch von der Bandbreite ab, die dem Gerät für regelmäßige Übertragungen (ständige Wartezeiten und Unterbrechungen) zugewiesen wird.
Die USB 2.0-Spezifikation erfordert, dass konstante Geräte über Endpunkte mit Nullbandbreite in ihren Standardschnittstelleneinstellungen verfügen. Dadurch wird sichergestellt, dass keine Bandbreite für das Gerät reserviert wird, bis der Funktionstreiber eine nicht standardmäßige Schnittstelle öffnet, wodurch Aufzählungsfehler aufgrund übermäßiger Bandbreitenanforderungen während der Gerätekonfiguration verhindert werden. Es verhindert nicht, dass Client-Treiber nach der Konfiguration ihrer Geräte übermäßig viel Bandbreite zuweisen und dadurch andere Geräte daran hindern, ordnungsgemäß zu funktionieren.
Der Schlüssel zu einer ordnungsgemäßen Bandbreitenverwaltung besteht darin, dass jedes USB-Gerät im System, das ständige Übertragungen durchführt, mehrere alternative (Alt-)Einstellungen für jede Schnittstelle mit konstanten Endpunkten bereitstellen muss und der Client-Treiber diese Alt-Einstellungen mit Bedacht verwenden muss. Client-Treiber sollten zuerst die Schnittstelleneinstellung mit der höchsten Bandbreite anfordern. Wenn die Anfrage fehlschlägt, sollte der Clienttreiber die Schnittstelleneinstellungen mit zunehmend kleineren Bandbreiten anfordern, bis die Anfrage erfolgreich ist.
Angenommen, ein Webcam-Gerät verfügt über die folgende Schnittstelle:
Schnittstelle 0 (Standardschnittstelleneinstellungen: In den Standardeinstellungen gibt es keine Endpunkte mit einer konstanten Bandbreite ungleich Null)
Const Endpoint 1: Maximale Paketgröße = 0 Bytes
Const Endpoint 2: Maximale Paketgröße = 0 Bytes
Schnittstelle 0 Alt-Einstellung 1
Const Endpoint 1: Maximale Paketgröße = 256 Bytes
Const Endpoint 2: Maximale Paketgröße = 256 Bytes
Schnittstelle 0 Alt-Einstellung 2
Const Endpoint 1: Maximale Paketgröße = 512 Bytes
Const Endpoint 2: Maximale Paketgröße = 512 Bytes
Der Treiber der Webcam konfiguriert die Webcam so, dass sie bei der Initialisierung die Standardschnittstelleneinstellungen verwendet. Die Standardeinstellungen verfügen nicht über eine konstante Bandbreite. Durch die Verwendung der Standardeinstellungen während der Initialisierung wird daher die Gefahr vermieden, dass die Webcam aufgrund einer fehlgeschlagenen Anforderung einer konstanten Bandbreite keine Aufzählung durchführen kann.
Wenn der Client-Treiber bereit ist, ständige isochrone Übertragungen durchzuführen, sollte er versuchen, Alt-Einstellung 2 zu verwenden, da Alt-Einstellung 2 die größte Paketgröße hat. Wenn die Anfrage fehlschlägt, kann der Fahrer es mit der Alt-Einstellung 1 ein zweites Mal versuchen. Da die Alt-Einstellung 1 weniger Bandbreite erfordert, kann diese Anfrage auch dann erfolgreich sein, wenn die erste Anfrage fehlschlägt. Mehrere Alt-Einstellungen ermöglichen es dem Fahrer, mehrere Versuche zu unternehmen, bevor er aufgibt.
Sobald die Webcam inaktiv wird, kann die zugewiesene Bandbreite dem verfügbaren Bandbreitenpool zurückgegeben werden, indem die Standardeinstellungen erneut ausgewählt werden.
Benutzer können sehen, wie viel Bandbreite ein USB-Controller zugewiesen hat, indem sie die Eigenschaften des Controllers im Windows-Geräte-Manager überprüfen. Wählen Sie die Eigenschaften des Controllers aus und sehen Sie auf der Registerkarte „Erweitert“ nach. Dieser Messwert gibt keinen Aufschluss darüber, wie viel Bandbreite der USB-Hub für die Transaktionsübersetzung zuweist.
Die Geräte-Manager-Funktion, die die Bandbreitennutzung des USB-Controllers meldet, funktioniert unter Windows XP nicht ordnungsgemäß.
Die maximale Übertragungsgröße gibt einen fest codierten Grenzwert im USB-Treiberstapel an. Übertragungsgrößen unterhalb dieser Grenzwerte können aufgrund von Systemressourcenbeschränkungen fehlschlagen. Um diese Art von Fehlern zu vermeiden und die Kompatibilität mit allen Windows-Versionen sicherzustellen, vermeiden Sie die Verwendung großer Übertragungsgrößen für USB-Übertragungen.
Das MaximumTransferSize-Mitglied der USBD_PIPE_INFORMATION-Struktur ist veraltet. Der USB-Treiberstapel ignoriert den Wert in MaximumTransferSize für zusammengesetzte und nicht zusammengesetzte Geräte.
In Windows 2000 initialisiert der USB-Treiberstapel MaximumTransferSize auf USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Client-Treiber können bei der Konfiguration des Geräts einen kleineren Wert festlegen. Bei Verbundgeräten können funktionsspezifische Clienttreiber die MaximumTransferSize der Pipe nur in nicht standardmäßigen Schnittstelleneinstellungen ändern.
Die USB-Übertragungsgröße ist begrenzt durch:
Die Begrenzung der Übertragungsgröße mithilfe von MaximumTransferSize hat keinen direkten Einfluss auf die vom Gerät verbrauchte Bandbreite. Der Client-Treiber muss die Schnittstelleneinstellungen ändern oder die maximale Paketgröße begrenzen, die im MaximumPacketSize-Mitglied von USBD_PIPE_INFORMATION festgelegt ist.
Die maximale Paketgröße wird durch das Feld wMaxPacketSize des Endpunktdeskriptors definiert. Client-Treiber können die USB-Paketgröße in ausgewählten Schnittstellenanforderungen an das Gerät anpassen. Durch das Ändern dieses Werts wird wMaxPacketSize auf dem Gerät nicht geändert.
Innerhalb des angeforderten URB befindet sich die USBD_PIPE_INFORMATION-Struktur der Pipe. In dieser Struktur
Wenn ein Client-Treiber eine Leseanforderung ausgibt, muss der Sendepuffer ein Vielfaches der maximalen Paketgröße sein. Selbst wenn der Treiber weniger Daten als die maximale Paketgröße benötigt, muss er dennoch das gesamte Paket anfordern. Die Übertragung ist abgeschlossen, wenn das Gerät ein Paket sendet, das kleiner als die maximale Größe ist (kurzes Paket).
Auf älteren Controllern können Client-Treiber dieses Verhalten überschreiben. Im TransferFlags-Mitglied des Datenübertragungs-URB muss der Clienttreiber das USBD_SHORT_TRANSFER_OK-Flag setzen. Mit diesem Flag kann das Gerät Pakete senden, die kleiner als wMaxPacketSize sind.
Auf xHCI-Hostcontrollern ignoriert USBD_SHORT_TRANSFER_OK Massenendpunkte und Interrupt-Endpunkte. Die Übertragung kurzer Pakete auf dem EHCI-Controller führt nicht zu einem Fehlerzustand.
Auf EHCI-Hostcontrollern wird USBD_SHORT_TRANSFER_OK für Massen- und Interrupt-Endpunkte ignoriert.
Wenn USBD_SHORT_TRANSFER_OK auf UHCI- und OHCI-Hostcontrollern nicht für Massen- oder Interrupt-Übertragungen festgelegt ist, stoppen kurze Paketübertragungen den Endpunkt und geben den Fehlercode der Übertragung zurück.
Der USB-Treiber-Stack-Treiber legt beim Schreiben auf ein Gerät andere Grenzwerte für die Paketgröße fest als beim Lesen vom Gerät. Einige Client-Treiber müssen häufig kleine Mengen an Steuerdaten übertragen, um ihre Geräte zu verwalten. In diesem Fall ist es unpraktisch, die Datenübertragung auf Pakete einheitlicher Größe zu beschränken. Daher weist der Treiberstapel beim Schreiben von Daten Paketen, die kleiner als die maximale Größe des Endpunkts sind, keine besondere Bedeutung zu. Dadurch kann der Client-Treiber große Übertragungen an das Gerät in mehrere URBs aufteilen, deren Größe kleiner oder gleich dem Maximum ist.
Der Treiber muss die Übertragung mit einem Paket beenden, das kleiner als die maximale Größe ist, oder ein Paket mit der Länge Null verwenden, um das Ende der Übertragung abzugrenzen. Die Übertragung ist erst abgeschlossen, wenn der Treiber ein Paket sendet, das kleiner als wMaxPacketSize ist. Wenn die Übertragungsgröße genau ein Vielfaches des Maximalwerts ist, muss der Treiber ein durch Nulllänge begrenztes Paket senden, um die Übertragung explizit zu beenden.
Gemäß der USB-Spezifikation ist der Client-Treiber dafür verantwortlich, Datenübertragungen mithilfe von Paketen der Länge Null zu begrenzen. Der USB-Treiberstapel generiert diese Pakete nicht automatisch.
Kompatible USB 2.0- und USB 1.1-Treiber müssen ein Paket mit maximaler Größe (wMaxPacketSize) übertragen und dann die Übertragung mit einem Paket beenden, das kleiner als die maximale Größe ist, oder ein Paket mit der Länge Null verwenden, um das Ende der Übertragung abzugrenzen. Die Übertragung ist erst abgeschlossen, wenn der Treiber ein Paket sendet, das kleiner als wMaxPacketSize ist. Wenn die Übertragungsgröße genau ein Vielfaches des Maximalwerts ist, muss der Treiber ein durch Nulllänge begrenztes Paket senden, um die Übertragung explizit zu beenden
Der Gerätetreiber ist dafür verantwortlich, Datenübertragungen mithilfe von Paketen der Länge Null zu begrenzen, wie in der USB-Spezifikation erforderlich. Der System-USB-Stack generiert diese Pakete nicht automatisch.