Forum: PC-Programmierung Verzögerungszeiten bei USB sehr gross


von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Ich probiere, eine Echtzeitsteuerung mit einem Signalverarbeitungssystem 
auzuziehen, das mit einem PC kommunizieren soll. Der PC muss dazu kleine 
Pakete im Bereich von 5kB-10kB durchschnittlich alle 10-20ms aufnehmen 
und verarbeiten / speichern, d.h. er pickt sich was raus und reagiert 
dann darauf. Die maximale Dichte der Pakte ist etwa 3ms.

Die Bandbreite liegt also bei maximal punktuellen 10kB/3ms < 30MBit. 
Vorgesehen ist USB 2.0. Sollte also passen, meint man.

Das Problem ist aber, dass Windows irgendwie nicht schnell genug 
reagiert und es z.T. 10ms dauert, bis die Pakete oben ankommen und 
abgearbeitet sind.


Die Rechenleistung für den Prozessor beträgt 10-20 Aktionen je Datum, 
macht also 70 Mio Berechnungen/s. Das kann es nicht sein. Die Lücke muss 
irgendwo auf dem Weg zum Treiber aufgehen. Auch die Belastung des Cores 
liegt maximal bei 10%, im Mittel bei 2-3%.

Wie lässt sich das erklären  beschleunigen  umgehen?

Verwendet wird ein Quad-Core I% mit 2,8GHz. Umstieg auf einen 
8er-Mehrkerner mit 4GHz zeigt ähnliche Resultate.

Kann es am Windows liegen? Beide Rechner haben noch Windows 7 drauf. 
Kann man sich von Win10 mehr versprechen?

von Dr. Sommer (Gast)


Lesenswert?

Was ist das für ein Gerät? Was für Endpoints nutzt du? Wie sind die 
konfiguriert (Deskriptoren)?  Sicher dass die Software vom Gerät schnell 
genug reagiert?

von Pit Cock (Gast)


Lesenswert?

> Wie lässt sich das erklären  beschleunigen  umgehen?

Echtzeit, USB, Windows - finde die 2 (zwei!) Fehler!

Auch wenn die Zahlen überschlagsmässig genug Reserve vorgaukeln, hast Du 
schon mal gesehen wie überkandidelt USB vom Konzept her ist? Und 
Windows auch?

Ja?  Also dann überlege mal an wievielen Stellen mögliche 
Schlampereien oder gar Fehler möglich sind. Dann führe Dir vor Augen an 
wievielen Stellen Variablen sind UND wieviele davon ausserhalb deines 
Einflusses sind.
Um dagegen anzugehen resp. einige davon gar nicht zu haben, wäre 
"möglicherweise" eine andere Technologiekombination geeigneter um 
Echtzeitansprüche zu erfüllen.

Ansonsten hast Du nun ja eine Idee davon, wieviel Arbeit Du noch zu 
bewältigen hast...

NB: dieselbe Frage vor einigen Jahren gestellt, also ohne Windows X+1 im 
Ausblick, hätte die selbe Antwort bekommen. Weil Bloatware schneller 
Bloat wird als HW schneller.

von Jim M. (turboj)


Lesenswert?

Martin K. schrieb:
> Das Problem ist aber, dass Windows irgendwie nicht schnell genug
> reagiert und es z.T. 10ms dauert, bis die Pakete oben ankommen und
> abgearbeitet sind.

Wie sind die USB Pakete aufgebaut? Volle Pakete (MaxPacketLength bei 
Bulk) bekommt der Host erst dann zurück, wenn mal ein Paket 
<MaxPacketLength versendet wurde (oder Puffer voll sind).

Wenn man genau MaxPacketLength übertragen will müsste man ein 
Zero-Packet nachschieben. Das macht kaum ein USB Stack automagisch.

von Jim M. (turboj)


Lesenswert?

Pit Cock schrieb:
> Echtzeit, USB, Windows - finde die 2 (zwei!) Fehler!

Ich hatte mal spaßenshalber Ping Messungen mit LibUSB-Win32 gemacht, und 
kam auf so rund 1.25ms Ping Zeit bei USB Full Speed (12MBit/s).

Allerdings nur wenn man die Read Transaktion vor der Write Transaktion 
startet - sonst dauert das noch rund 1-2 ms länger IIRC.

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Den Paketaufbau muss ich mal checken lassen, keine Ahnung. Die anderen 
beiden Beiträge bringen mich aber schon mal weiter, auch wenn das kein 
erbaulichen Infos sind.

Ich würde gerne die Reaktionszeiten auf 1ms beschränken, aber das ist 
wohl utopisch.

von Timmo H. (masterfx)


Lesenswert?

10ms hört sich eher so nach dem Thread Time Slice an. Kein Plan ob es 
was ändert wenn du für deine Applikation mal die Timer Resolution hoch 
stellst (via NtSetTimerResolution)
Ansonsten evtl. über PerformanceCounter (erzeugt aber höhere CPU-Last)

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Timmo H. schrieb:
> wenn du für deine Applikation mal die Timer Resolution hoch stellst (via
> NtSetTimerResolution)

Das geht auch über die "Multimedia"-Timer-Funktionen timeBeginPeriod und 
timeEndPeriod. Damit lässt sich die Timergranularität auf 1 msec 
heruntersetzen.

https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timebeginperiod
https://docs.microsoft.com/en-us/windows/desktop/api/timeapi/nf-timeapi-timeendperiod

von c-hater (Gast)


Lesenswert?

Martin K. schrieb:

> Das Problem ist aber, dass Windows irgendwie nicht schnell genug
> reagiert und es z.T. 10ms dauert, bis die Pakete oben ankommen und
> abgearbeitet sind.

Gebetsmühle an:

Windows ist kein Echtzeit-OS. Wenn der Taskwechsel schon nominell nur 
alle 20ms erfolgt, kann man nicht erwarten, Zeiten im Bereich darunter 
exakt messen zu können. Das sollte jedem denkenden Menschen von 
vornherein klar sein...

Um Diskrimierungen von Windows vorzubeugen: das gilt für Linux ganz 
genauso.

Für beide Systeme gibt es allerdings "Echtzeit"-Aufsätze. Und auch 
diverse andere Möglichkeiten, sich in die Nähe von "Echtzeit" zu 
schummeln.

Ist aber alles mehr oder weniger Gülle. Die "Echtzeit"-Aufsätze können 
zwar wirklich Echtzeit (solange auch alle Treiber mitspielen), aber 
diese Echtzeit ist lahm. Viel zu lahm, Zeiten um 10ms exakt erfassen zu 
können.

Und die Tricks sind eben nicht Echtzeit, können also kein exaktes 
Zeitverhalten garantieren. Allerdings kann man damit unter günstigen 
Umstanden Zeiten im Bereich von 10ms wirklich messen. Aber was nützt 
das, wenn man dem Messergebnis nicht wirklich trauen kann?

von Stefan F. (Gast)


Lesenswert?

Es gibt ein paar Stellschrauben, wo man etwas relevant optimieren kann. 
Allerdings ist Windows nicht geeignet, es wird am Ende höchstens mit 
viel Glück funktionieren. Dabei ist USB nur ein problem, du wirst 
ähnliche Delays bei allen anderen denkbaren Schnittstellen ebenso 
erleben, weil dein Programm nicht ununterbrochen ganz alleine auf dem 
Rechner läuft.

Was kann man machen?

Die Daten mit einem externen Mikrocontroller puffern und dann an den PC 
senden. Du musst aber eine andere Schnittstelle verwenden, mindestens 
USB 2.0 Hi-Speed, das bietet kein USB-UART Adapter, soweit ich weiß.

von Christian R. (supachris)


Lesenswert?

Das wird so nix. Weder Windows noch USB sind Echtzeit fähig. Selbst wenn 
du einen RTOS Kernel für Windows verwendest wird dir die USB Topologie 
in die Suppe spucken.
Man hat ja schon am Host Controller keine deterministischen Zeiten, am 
Root Hub nicht und am Treiber Stack erst recht nicht.
Etwas besser geht Interrupt statt BULK Transfer aber dann ist die 
Datenrate natürlich nicht so hoch.

von Purzel H. (hacky)


Lesenswert?

Was soll das Ganze denn koennen ? Wir suchen dir ne Alternative. Der PC 
kann leider nur als langsames Visualisierungs- und 
Parametrisierungs-Frontend dienen.

: Bearbeitet durch User
von Danish B. (danishbelal)


Lesenswert?

Stefanus F. schrieb:
> mindestens
> USB 2.0 Hi-Speed, das bietet kein USB-UART Adapter, soweit ich weiß.

Der FT232H bietet im Prinzip schon Hi-Speed USB an.

Allerdings ist die Baudrate im Vergleich zur USB-Geschwindigkeit stark 
limitiert. Wenn man damit schneller werden möchte muss man eine andere 
Schnitstelle auf der Mikrocontroller Seite nutzen.

Siehe: 
http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232H.pdf

von Jiri D. (Gast)


Lesenswert?

Martin K. schrieb:
> Die Bandbreite liegt also bei maximal punktuellen 10kB/3ms < 30MBit.
> Vorgesehen ist USB 2.0. Sollte also passen, meint man.

Die USB-Spec ist da ein bisschen tricky: USB 2.0 ist eine Obermenge von 
USB 1.1, 1.0.
Ein Gerät, das mit "USB 2.0" beworben ist, kann also auch nur ein Low 
Speed, oder Full Speed (12 Mb/s) Gerät sein. "USB 2.0" sagt zunächst 
nichts über die Geschwindigkeit aus. Stattdessen musst du auf 
"Super-Speed", "Hi-Speed", "Full Speed", "Low Speed" achten.

Zum Beispiel ist der FT230X "Full Speed" (12 Mb/s) und der FT2232H "Hi 
Speed" (480 Mb/s). Beide sind USB 2.0.
http://www.ftdichip.com/Products/ICs/FT230X.html
http://www.ftdichip.com/Products/ICs/FT2232H.html

Bei den Datenraten muss aber noch der USB Protokolloverhead 
berücksichtigt werden und Aussagen über USB-bedingte Latenzen/Jitter 
sind das auch nicht.

c-hater schrieb:
> Martin K. schrieb:
>
>> Das Problem ist aber, dass Windows irgendwie nicht schnell genug
>> reagiert und es z.T. 10ms dauert, bis die Pakete oben ankommen und
>> abgearbeitet sind.
[...]
> Für beide Systeme gibt es allerdings "Echtzeit"-Aufsätze. Und auch
> diverse andere Möglichkeiten, sich in die Nähe von "Echtzeit" zu
> schummeln.
>
> Ist aber alles mehr oder weniger Gülle. Die "Echtzeit"-Aufsätze können
> zwar wirklich Echtzeit (solange auch alle Treiber mitspielen), aber
> diese Echtzeit ist lahm. Viel zu lahm, Zeiten um 10ms exakt erfassen zu
> können.

Es gibt schon Möglichkeiten mit normalen amd64 CPUs niedrige und 
deterministische Latenzen hinzubekommen. Habe zum Beispiel für die 
Arbeit mal einen Netzwerk-Paketgenerator (nicht USB!) unter Linux-RT mit 
DPDK (https://www.dpdk.org/) gebaut und dabei Latenzen von CPU zum Kabel 
um die 8-9 µs erreicht, mit Paket-zu-Paket Jitter Standardabweichung < 1 
µs. (das ist so grob das Minimum, was mit DPDK erreichbar ist)

Das erreicht man z.B. in dem dynamic CPU frequency scaling abgeschaltet 
wird, auf jedem Echtzeit-Kern nur ein thread laufen darf (isolcpus boot 
option und fixe affinities setzen), Speicher im "nahen" RAM alloziert 
wird (NUMA), huge pages, sowie DPDK als user-space IP stack (keine 
Latenzen durch OS Kernel, user-space Prozess kommuniziert direkt mit 
Netzwerkkarte), sowie eine 10 GbE Netzwerkkarte.
Der thread auf einem CPU-Kern macht ausschließlich busy waiting und 
möglichst keine syscalls; die CPU-Last ist dann konstant bei 100%...

Also möchte damit sagen: Prinzipiell kann man schon ganz passable 
Ergebnisse erzielen, aber es sind schon sehr spezielle Anwendungen bei 
denen das geht und für die es Werkzeuge gibt. Zudem hat USB halt 
designbedingt einen relativ großen Jitter.

von Julia D. (Gast)


Lesenswert?

Jiri D. schrieb:
> Das erreicht man z.B. in dem dynamic CPU frequency scaling abgeschaltet
> wird, auf jedem Echtzeit-Kern nur ein thread laufen darf (isolcpus boot
> option und fixe affinities setzen), Speicher im "nahen" RAM alloziert
> wird (NUMA), huge pages, sowie DPDK als user-space IP stack (keine
> Latenzen durch OS Kernel, user-space Prozess kommuniziert direkt mit
> Netzwerkkarte), sowie eine 10 GbE Netzwerkkarte.

Ich lese das gerade mit und frage mal frech dazwischen:

Wo kann man sowas ablesen oder erlernen? Buch- oder Seitenempfehlung 
parat?

Danke!

von Jiri D. (Gast)


Lesenswert?

Julia D. schrieb:
> Jiri D. schrieb:
>> Das erreicht man z.B. in dem dynamic CPU frequency scaling abgeschaltet
>> wird, auf jedem Echtzeit-Kern nur ein thread laufen darf (isolcpus boot
>> option und fixe affinities setzen), Speicher im "nahen" RAM alloziert
>> wird (NUMA), huge pages, sowie DPDK als user-space IP stack (keine
>> Latenzen durch OS Kernel, user-space Prozess kommuniziert direkt mit
>> Netzwerkkarte), sowie eine 10 GbE Netzwerkkarte.
>
> Ich lese das gerade mit und frage mal frech dazwischen:
>
> Wo kann man sowas ablesen oder erlernen? Buch- oder Seitenempfehlung
> parat?

Bezüglich DPDK in der dazugehörigen Dokumentation:
http://core.dpdk.org/doc/
-> Getting started guide for Linux:
http://doc.dpdk.org/guides/linux_gsg/
-> Programmer's Guide
http://doc.dpdk.org/guides/prog_guide/

Da sind auch Beispiele dabei (in C), die aber teilweise echt konfus 
sind...

von Jim M. (turboj)


Lesenswert?

Martin K. schrieb:
> Ich würde gerne die Reaktionszeiten auf 1ms beschränken, aber das ist
> wohl utopisch.

Nö. Ich habe <1ms "Ping" (im Mittel) gemessen als ich mein Full Speed 
Gerät hinter einen High Speed Hub gehangen habe. Gab aber IIRC 
signfikant Ausreisser nach oben.

Allerdings war das mit "direkter" Programmierung über LibUSB-Win32, und 
überschneidendem Lese- und Schreibtransfers - d.h. der Lese-Transver 
wurde vor dem Schreibtransfer gestartet.

Dann darf aber auch kein USB2UART Chip mehr dazwischen hängen. Die 
warten gerne mal so 1-10ms auf Daten, um die dann aus dem Fifo in einem 
Rutsch zu versenden - spart Ressourcen auf dem Host. Grade neuere FTDI 
Chips haben vergleichsweise große Fifos auf dem UART.

Glücklicherweise gibt es bei den meissten µC Familien Ableger mit 
nativem USB.

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Christian R. schrieb:
> Das wird so nix. Weder Windows noch USB sind Echtzeit fähig. Selbst wenn
> du einen RTOS Kernel für Windows verwendest wird dir die USB Topologie
> in die Suppe spucken.

Ich glaube es auch. Nur bin ich eben an Windows gebunden.

Danke für all eure Beiträge. Hat mich weiter gebracht!

von udok (Gast)


Lesenswert?

Martin K. schrieb:
> Christian R. schrieb:
>> Das wird so nix. Weder Windows noch USB sind Echtzeit fähig. Selbst wenn
>> du einen RTOS Kernel für Windows verwendest wird dir die USB Topologie
>> in die Suppe spucken.
>
> Ich glaube es auch. Nur bin ich eben an Windows gebunden.
>
> Danke für all eure Beiträge. Hat mich weiter gebracht!

USB ist natürlich echtzeitfähig.  Es ist in Zeitscheiben von 1ms
(Full Speed), bzw 0.125 ms (High Speed) organisiert.
Also alle 0.125 ms wird ein Packet gesendet und empfangen.

Der Windows Treiber funktioniert mit DMA parallel zur CPU,
sodass das Windows auf USB Treiberebene in der Praxis
ebenfalls echtzeitfähig ist.

Also ein Ping-Pong von <= 2ms läuft auf nicht ausgelasteten
Windows Rechnern meiner Erfahrung nach stabil.

Es kann aber sein, dass dein Anwenderprogram (User Thread)
mal nicht zum Abarbeiten der Packete kommt,
wenn Windows andere User Threads mit höherer Prio abarbeitet.

Das kannst du relativ leicht umgehen, indem du vor zeitkritischen
Aktionen ein Sleep() aufrufst, sodass dein Thread, wenn er
aufwacht, immer den ganzen Zeitschlitz zur verfügung hat, und indem du
die Basispriorität erhöhst.

Also, wenn du nur auf Packet N innerhalb von 10 ms antworten musst,
ist das unter Windows in der Praxis kein Problem.
So ziemlich alle Audio Interfaces habe weniger als 10 ms Latenz.

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

udok schrieb:
> USB ist natürlich echtzeitfähig.  Es ist in Zeitscheiben von 1ms
> (Full Speed), bzw 0.125 ms (High Speed) organisiert.
> Also alle 0.125 ms wird ein Packet gesendet und empfangen.

Betrachtungsfrage! Die 0.125ms würde ich noch als Echtzeit durchgehen 
lassen, bei den 1ms habe ich so mein Problem.

Für den Fall der geringen Paketgrößen mit pulsierenden Daten in kleinem 
Umfang bekomme ich das nicht geregelt, den Puffer vollzuladen, dass 
gesendet wird.

Stellt sich die Frage, was alternativ nehmen, wenn nicht USB?

von Wühlhase (Gast)


Lesenswert?

Martin K. schrieb:
> udok schrieb:
>> USB ist natürlich echtzeitfähig.  Es ist in Zeitscheiben von 1ms
>> (Full Speed), bzw 0.125 ms (High Speed) organisiert.
>> Also alle 0.125 ms wird ein Packet gesendet und empfangen.
>
> Betrachtungsfrage! Die 0.125ms würde ich noch als Echtzeit durchgehen
> lassen, bei den 1ms habe ich so mein Problem.
Eigentilch nicht. "Echtzeitfähig" sagt ja nichts über die 
Geschwindigkeit aus sondern garantiert eine Verarbeitung innerhalb einer 
gewissen Zeit.

Zumindest hab ich das mal so gelernt, habe diese Definition aber auch 
immer wieder so angetroffen.

Und USB stellt auch Real Time Transfers zur Verfügung. Da gehen zwar 
keine maximalen Datenraten und ich meine, eine Rückmeldung über 
fehlerhaft übertragene Pakete gibt es auch nicht oder nur eingeschränkt, 
aber grundsätzlich ist USB schon echtzeitfähig.

Nur das fette Windows eben nicht. Wenn es "in den meisten Fällen" 
schnell genug reagiert, so ist das auch ganz schnell mal hinfällig wenn 
der Benutzer z.B. eine CD ins Laufwerk schiebt.

von Dr. Sommer (Gast)


Lesenswert?

Martin K. schrieb:
> Stellt sich die Frage, was alternativ nehmen, wenn nicht USB?

Man macht die Echtzeit-Aufgabe komplett auf dem Controller/Gerät, und 
macht auf dem PC nur die Nutzerschnittstelle und falls nötig die 
Versorgung mit großen, nicht-echtzeitkritischen Daten (Logging, 
Aufspielen von "Programmen" wie ganze CNC-Programme, ...). So wie bei 
Druckern: Der PC schickt das ganze Dokument (z.B. als Postscript) 
beliebig langsam, und wenn es angekommen ist besorgt der Drucker die 
zeitkritische Ansteuerung von Druckkopf und Motoren.

von Christian R. (supachris)


Lesenswert?

Naja, echtzeitfähig kann ja auch sein, dass es garantiert in 3 Tagen 
reagiert.
Bis zum Host Controller würde ich da, zwar mit Bauchschmerzen, mitgehen. 
Aber dann wirds lustig. Wenn die Daten da sind, wird ein Interrupt 
generiert. Den arbeitet der Interrupt Controller irgendwann ab und 
signalisiert dem OS Kernel, dass da was zu tun ist. Irgendwann kommt der 
Kernel Scheduler mal vorbei und holt die Daten ab. Irgendwann wird dann 
mal die Anwendung im user Space benachrichtigt. Bei USB Interrupt oder 
Isochron Transfer bekommt man noch garantierte Bandbreiten (die 
natürlich weit weniger sind als der Maximaldurchsatz), aber wenn man 
schnell übertragen will, muss man BULK nehmen, das hat aber die 
niedrigste Priorität. Wir haben hier bei Windows Pausen im Datentransfer 
von 50...100....200ms festgestellt, obwohl die Hardware kontinuierlich 
Daten liefert und der PC massig Kerne hat und nichts zu tun.

von Stefan F. (Gast)


Lesenswert?

Dr. Sommer schrieb:
> So wie bei
> Druckern: Der PC schickt das ganze Dokument (z.B. als Postscript)
> beliebig langsam, und wenn es angekommen ist besorgt der Drucker die
> zeitkritische Ansteuerung von Druckkopf und Motoren.

Ich hatte mal einen Laserdrucker, der nur eine halbe Seite puffern 
konnte. Mit diesem Gerät hatte ich ständig Probleme. Am Schlimmsten war, 
wenn er beim Drucken von Büchern einzelne Absätze ausgelassen hatte. Ein 
scheußliches Gerät war das.

von Thomas (Gast)


Lesenswert?

Christian R. schrieb:
> Bei USB Interrupt oder Isochron Transfer bekommt man noch garantierte
> Bandbreiten (die natürlich weit weniger sind als der Maximaldurchsatz),
> aber wenn man schnell übertragen will, muss man BULK nehmen, das hat
> aber die niedrigste Priorität.

Das steht in USB spec. aber anders.....
Bulk ist genau nicht für die schnellsten Datentransfers gedacht sondern 
dafür garantiert fehlerfrei. Auf einem freien Bus ist Bulk genauso 
schnell wie ISO.
Schlechte Verbindungen (Kabel, Hubs)  können dafür sorgen dass es 
langsamer wird. Oft kann einfach das device die Daten nicht schnell 
genug verarbeiten und sendet NAKs.
Nicht um sonst gibt es Chips mit 2fach oder sogar 4fach Puffer.

Thomas

von Christian R. (supachris)


Lesenswert?

Thomas schrieb:
> Auf einem freien Bus ist Bulk genauso schnell wie ISO.

ISO liefert mir bei 2.0 eine garantierte Bandbreite von 24MByte/s. BULK 
schafft bei freiem Bus knapp über 40MByte/s.

von udok (Gast)


Lesenswert?

Christian R. schrieb:
> Naja, echtzeitfähig kann ja auch sein, dass es garantiert in 3 Tagen
> reagiert.

Na ja, jetzt übertreibst du aber etwas, wenn mein Windows nach 3 Minuten
nix mehr macht, drücke ich den Reset.

> Bis zum Host Controller würde ich da, zwar mit Bauchschmerzen, mitgehen.
> Aber dann wirds lustig. Wenn die Daten da sind, wird ein Interrupt
> generiert. Den arbeitet der Interrupt Controller irgendwann ab und
> signalisiert dem OS Kernel, dass da was zu tun ist. Irgendwann kommt der
> Kernel Scheduler mal vorbei und holt die Daten ab. Irgendwann wird dann
> mal die Anwendung im user Space benachrichtigt.

Wenn der Interrupt da ist, dann arbeitet der IRQ Controller
ihn sofort ab.
Der IRQ Controller ruft dann den Scheduler auf, der merkt dass
Daten, auf die der User Prozess wartet, da sind.
Er ruft dann den User Prozess direkt auf.
Das dauert keine Millisekunde.

> Bei USB Interrupt oder
> Isochron Transfer bekommt man noch garantierte Bandbreiten (die
> natürlich weit weniger sind als der Maximaldurchsatz), aber wenn man
> schnell übertragen will, muss man BULK nehmen, das hat aber die
> niedrigste Priorität.

Die Isochrone Bandbreite ist ca die Hälfte der maximalen Bandbreite,
also nicht so viel weniger wie man in der Praxis im Bulk Mode erreicht.
Wenn nur ein Gerät am Bus hängt, wie es ja oft der Fall ist,
dann kannst du einfach Bulk Mode nehmen, da der USB Bus ja nicht
willkürlich Delays einbaut...

> Wir haben hier bei Windows Pausen im Datentransfer
> von 50...100....200ms festgestellt, obwohl die Hardware kontinuierlich
> Daten liefert und der PC massig Kerne hat und nichts zu tun.

Wenn du einen Windows Hintergrundprozess laufen hast, von denen manche
hohe Prio haben, dann muss dein User Prozess halt warten, bis
die Festplatte indiziert hat, oder Updates runterlädt,
oder was auch immer...
Die kann man aber abdrehen.

von udok (Gast)


Lesenswert?

Christian R. schrieb:
> Thomas schrieb:
>> Auf einem freien Bus ist Bulk genauso schnell wie ISO.
>
> ISO liefert mir bei 2.0 eine garantierte Bandbreite von 24MByte/s. BULK
> schafft bei freiem Bus knapp über 40MByt

Das liegt daran, das nur ca die Hälfte der Bandbreite für ISO 
rerserviert
werden kann.

von Purzel (Gast)


Lesenswert?

Ich mache andauernd Echtzeitdinge. Auch komplexe. Dabei lass ich den 
steuernden Prozess auf einem Controller laufen, und benutze den PC nur 
zur Parametrisierung und Visualisierung. Zur Anbindung des Controllers 
an einen PC..
Falls es denn USB sein muss, USB-to-Serial kann soviel wie eben die 
passenden Controller von FTDI koennen. Dabei sollte man fuer maximaelne 
Durchsatz grosse Blocklaengen verwenden. Uns kleine Ping-Pong 
Geschichten vermeiden.
Fuer hoehere Datenraten, zB Oszilloskopbilder, verwendet man Ethernet.

von Christian R. (supachris)


Lesenswert?

udok schrieb:
> Christian R. schrieb:
>> Naja, echtzeitfähig kann ja auch sein, dass es garantiert in 3 Tagen
>> reagiert.
>
> Na ja, jetzt übertreibst du aber etwas, wenn mein Windows nach 3 Minuten
> nix mehr macht, drücke ich den Reset.

Es ging mir nur darum, den Unterschied zwischen "echtzeitfähig" und 
niedrige Latenz bzw. hoher Datendurchsatz zu erläutern. Da wird ja immer 
viel vermischt.

>> Bis zum Host Controller würde ich da, zwar mit Bauchschmerzen, mitgehen.
>> Aber dann wirds lustig. Wenn die Daten da sind, wird ein Interrupt
>> generiert. Den arbeitet der Interrupt Controller irgendwann ab und
>> signalisiert dem OS Kernel, dass da was zu tun ist. Irgendwann kommt der
>> Kernel Scheduler mal vorbei und holt die Daten ab. Irgendwann wird dann
>> mal die Anwendung im user Space benachrichtigt.
>
> Wenn der Interrupt da ist, dann arbeitet der IRQ Controller
> ihn sofort ab.
> Der IRQ Controller ruft dann den Scheduler auf, der merkt dass
> Daten, auf die der User Prozess wartet, da sind.
> Er ruft dann den User Prozess direkt auf.
> Das dauert keine Millisekunde.

Naja, in der Theorie mag das so sein, unsere Erfahrung aus über 10 
Jahren USB Messgeräte Entwicklung sagt da leider was anderes.

>> Bei USB Interrupt oder
>> Isochron Transfer bekommt man noch garantierte Bandbreiten (die
>> natürlich weit weniger sind als der Maximaldurchsatz), aber wenn man
>> schnell übertragen will, muss man BULK nehmen, das hat aber die
>> niedrigste Priorität.
>
> Die Isochrone Bandbreite ist ca die Hälfte der maximalen Bandbreite,
> also nicht so viel weniger wie man in der Praxis im Bulk Mode erreicht.
> Wenn nur ein Gerät am Bus hängt, wie es ja oft der Fall ist,
> dann kannst du einfach Bulk Mode nehmen, da der USB Bus ja nicht
> willkürlich Delays einbaut...

Der Bus nicht, das OS aber schon.

>> Wir haben hier bei Windows Pausen im Datentransfer
>> von 50...100....200ms festgestellt, obwohl die Hardware kontinuierlich
>> Daten liefert und der PC massig Kerne hat und nichts zu tun.
>
> Wenn du einen Windows Hintergrundprozess laufen hast, von denen manche
> hohe Prio haben, dann muss dein User Prozess halt warten, bis
> die Festplatte indiziert hat, oder Updates runterlädt,
> oder was auch immer...
> Die kann man aber abdrehen.

Wie geschrieben, wir entwickeln und vertreiben seit über 10 Jahren USB 
Messgeräte bei denen es auf die maximale Geschwindigkeit ankommt.
Dazu verwenden wir den Cypress FX2 und FX3. Auch wenn du alles im 
Windows abdrehst und einen Rechner mit 16 Kernen hast, wirst du solche 
Pausen rein bekommen. Bei Windows 10 ist es schon um einiges besser als 
Windows 7 und erst recht im gruseligen XP, aber weg bekommt man die 
Pausen nie.
Wir verwenden WinUSB mit RAW_IO und vielen asynchronen Transfers mit 
großer Blocklänge bei BULK, auf der Device Seite maximal mögliche 
Buffergröße plus Buffer im FPGA, denn die 4-fach Packet Buffer gerade 
des FX2 sind ja immer noch ein Witz und laufen in µs voll.
Wir schaffen damit bei USB 2.0 knapp über 40MiByte/s Upstream und bei 
USb 3.0 etwas über 300MiByte/s. Da ginge vielleicht noch was, aber der 
FX3 Parallelbus läuft über 85MHz nicht mehr so dolle.

Im Übrigen ist das sehr stark Host-Controller abhängig. ASMedia, VIA 
kannste gleich komplett vergessen. Am Besten immer noch Intel EHCI bzw. 
xHCI, dicht gefolgt von Renesas. AMD Chipsatz USB 3.0 taugt leider auch 
nicht viel, wahrscheinlich sparen die dann an den Buffern.

von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Christian R. schrieb:
>> Wenn der Interrupt da ist, dann arbeitet der IRQ Controller
>> ihn sofort ab.
>> Der IRQ Controller ruft dann den Scheduler auf, der merkt dass
>> Daten, auf die der User Prozess wartet, da sind.
>> Er ruft dann den User Prozess direkt auf.
>> Das dauert keine Millisekunde.
>
> Naja, in der Theorie mag das so sein, unsere Erfahrung aus über 10
> Jahren USB Messgeräte Entwicklung sagt da leider was anderes.

Ja, eben das ist das Problem. Wir haben in der Softwareabteilung jetzt 
Messungen gemacht. Dort sieht man in der Tat die Pausen, von denen du 
schreibst.

Danke für den Tipp mit den Interfacebausteinen. War mir nicht bewusst, 
dass es dort solche Unterschiede gibt.

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.