Forum: Mikrocontroller und Digitale Elektronik USB CDC Device - maximale FIFO-Größe?


von Harstad (Gast)


Lesenswert?

Hi,

meine Frage steht im Zusammenhang mit diesem Posting hier: 
Beitrag "COM-Port Probleme mit Windows 10"

Ich bin auf der Suche nach möglichen Implementierungsfehlern im 
USB-Stack meines Controllers. In dem Zusammenhang habe ich einen etwas 
dubiosen Kommentar bei den vordefinierten FIFO-Größen gefunden.

Deswegen meine Frage: wie groß dürfen Sende- und Empfangs-FIFO bei 
CDC-Devices laut Spezifikation maximal sein?

Danke!

von Jim M. (turboj)


Lesenswert?

Harstad schrieb:
> Deswegen meine Frage: wie groß dürfen Sende- und Empfangs-FIFO bei
> CDC-Devices laut Spezifikation maximal sein?

Da ist nix spezifiziert. Die kannste so groß machen wie Du möchtest.

Man kann sich aber schön in den Fuß schiessen, wenn man Transaktionen 
mit ganzzahligen Vielfachen von maxPacketSize (Full Speed = 64 Byte) 
anstößt. Die müssen nämlich mit einem Zero Packet abgeschlossen werden, 
sonst "hängt" die Transaktion im Host.

Mit anderen Worten: Die CDC Daten werden genau dann an die Anwendung 
durchgereicht, wenn ein USB Paket < 64 Byte übertragen wurde.

Die Ausname (Anwendung fragt genau 64*x Bytes an) spielt bei CDC keine 
Rolle, da IMHO usbser.sys einen eigenen kleinen FIFO aufmacht - deren 
Größe man nicht beeinflussen kann.

Diese Signalisierung "Ende der Transaktion" via Zero Packet fehlt bei 
den meisten CDC Implementierungen völlig, da bei "echtem" UART Input 
schon die 64 Bytes nicht am Stück anfallen würden.

von Harstad (Gast)


Lesenswert?

OK...in meinem Fall sind 512 Bytes FIFO-Größe angegeben (die ja auch per 
USB-Deskriptor an den Host übertragen werden).

Bringt es überhaupt was, mehr als 64 Bytes FIFO zu verwenden? Von der 
Geschwindigkeit her ja sicher nicht, wenn Pakete sich immer an dieser 
Größe orientieren - und der Host eh' sein eigenes Süppchen kocht...

von Jim M. (turboj)


Lesenswert?

Harstad schrieb:
> OK...in meinem Fall sind 512 Bytes FIFO-Größe angegeben (die ja auch per
> USB-Deskriptor an den Host übertragen werden).

Ist das ein USB2.0 High Speed Gerät? Bei Full Speed sind nur 64 Byte 
MaxPacketSize erlaubt.

Das ist aber nur die Größe eines USB Daten-Pakets. Bei Bulk Transfers 
werden mehrere Pakete maximaler Größe zu einer Transaktion zusammen 
gefasst.

Harstad schrieb:
> Bringt es überhaupt was, mehr als 64 Bytes FIFO zu verwenden?

Mehrere 64-Byte (oder 512? Byte bei High Speed) Pakete hintereinander 
als eine Transaktion zusammengefasst ist um Größenordnungen schneller 
als auf <64 Byte aufgeteilte Daten. Das hängt auch mit dem Scheduling 
von USB Transaktionen auf dem Host zusammen - er kann neue Daten erst im 
nächsten (Micro-)Frame schedulen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.