Forum: Mikrocontroller und Digitale Elektronik PIC32 Durchsatz USB Bulk-Transfer


von mac4ever (Gast)


Lesenswert?

Hallo allerseits,

als erstes die Frage, dann ein wenig Erläuterung zum Problem: Ist es 
möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames zu 
übertragen?

Ich beschäftige mich gerade mit dem USB Stack von Microchip, den ich auf 
einem PIC32 uC verwende.
Für ein aktuelles Projekt benötige ich unter anderem ein Datenlogging 
mit max. 150kB/s auf einen USB-Stick. Klingt für USB Full-Speed ( 
1.5MB/s) erstmal nicht problematisch. Doch leider ist das eben nur die 
theoretische Datenrate. Der USB Stack von Microchip ist dermaßen 
langsam, dass ich gerade mal auf 50-60kB/s komme. Genutzt wird dabei die 
Mass-Storage-Class und folglich der Bulk-Transfer.
Ein solcher Transfer besteht aus 3 Phasen: CBW, Daten, CSW. Nach ein 
wenig Codeanalyse habe ich die vermeintliche Schwachstelle ausgemacht. 
Jede der drei Phasen wird in genau einem USB-Frame abgearbeitet. Daher 
benötigt ein einzelner Bulk-Transfer von 512 Byte Daten 3ms - dabei ist 
der Bus über 80% IDLE. Ohne den Overhead eines FAT-Systems würde das 
reichen, sind "immerhin" 170kB/s. Mit FAT kommt man eher auf ein 
drittel, da hier noch zusätzlich Transfers anfallen.

Wenn ich die USB Spez. und diverse andere Quellen richtig interpretiere, 
sollte der mehrfache Zugriff, also die Bündelung mehrerer Transaktionen, 
auf einen Endpunkt innerhalb eines Frames zulässig sein. Zeitlich sollte 
es auch keine Probleme geben, da der Massenspeicher der einzige 
USB-Device am Host ist und der Bulk-Transfer nur etwas über 50% des 
Frames verwendet.

Im Microchip-Forum gibt es diverse Threads, die das Problem des geringen 
Durchsatzen ansprechen, allerdings scheint von den Entwicklern kaum 
einer darauf einzugehen. Ich überlege daher den Stack zu modifizieren, 
würde aber vorher gern wissen ob mein Vorhaben (Frage siehe oben) 
überhaupt von der Spezifikation abgedeckt wird.

Hinweis: Es kommt nur USB in Frage. Daher verzichte ich gern auf 
Ratschläge, ein anderes Interface zu verwenden :)

Viele Grüße!

von PittyJ (Gast)


Lesenswert?

Ist das korrekt, dass das USB-Massenspeicher Interface benutzt wird?
Das habe ich auch gerade von der Host-Seite aus in der Mache.

Ja, es sind immer 3 Teile: Befehl. Daten-Anforderung und Statusabfrage 
zum Schluss.
Aber man muss ja nicht nur einen Block lesen. Man kann gleich mehrere 
Blöcke auf einmal anfordern. Bei meinen Test lese ich z.B. 512 KBytes 
auf einen Schlag.
Es sind ja normale SCSI Befehle. Und der READ-Befehl hat ein Feld mit 
der Anzahl der Sektoren.

Bei USB-2.0 komme ich so auf 48Mbytes/sek.

von K. D. (deka)


Lesenswert?

PittyJ schrieb:
> Bei USB-2.0 komme ich so auf 48Mbytes/sek.

Mit nem PIC?

von mac4ever (Gast)


Lesenswert?

Ok, mehrere Sektoren zu lesen ist klar. Fürs schreiben stellt SCSI so 
was nicht zu Verfügung.
Mehrere Sektoren zu lesen macht aber auch nur bis zur Clustergröße Sinn.

Mit was arbeitest du gerade? Hast du dir mal die Eingeweide deines Host 
Stacks angeschaut, wie er die einzelnen Transaktion zusammenfasst?

von holger (Gast)


Lesenswert?

>Für ein aktuelles Projekt benötige ich unter anderem ein Datenlogging
>mit max. 150kB/s auf einen USB-Stick.

Wieso loggst du nicht einfach auf eine SD Karte?
Dann sparst du dir das ganze USB Geraffel.

>dass ich gerade mal auf 50-60kB/s komme.

Das schaff ich locker mit nem 16MHz AVR und 8MHz SPI auf SD Karte.
Die 150kB/s auch.

von holger (Gast)


Lesenswert?

>Hinweis: Es kommt nur USB in Frage. Daher verzichte ich gern auf
>Ratschläge, ein anderes Interface zu verwenden :)

Upps, den hatte ich übersehen. Also vergiss meinen Tip.

von Michael H. (morph1)


Lesenswert?

Also ich schaff leicht 500-700kb/sec auf die SD-Karte, ebenfalls mit 
einem PIC32.

Das von dir angesprochene Problem kenne ich von diversen Kingston 
SD-Karten, die im SPI modus bei 512 Packet-Größe unendlich langsam 
werden und erst bei größeren Zugriffen vernünftiges Tempo erreichen.

Wenns dir aber rein um eine Live-Übertragung vom PIC zum PC geht, dann 
würde ich dir die libUSB oder WinUSB empfehlen, das schafft man dann 
auch gut 1MB+/sec.

von mac4ever (Gast)


Lesenswert?

Michael H. schrieb:
> Wenns dir aber rein um eine Live-Übertragung vom PIC zum PC geht

Geht es mir nicht, wie im ersten Post beschrieben wird der PIC als Host 
betrieben und es wird auf einen USB-Stick geschrieben.

Bitte, bitte ... keine Hinweise darauf wie schnell oder gut es mit 
SD-Card funktionieren würde. Dessen bin ich mir bewusst, aber ich habe 
nicht die Möglichkeit die Schnittstelle zu ändern.

Daher noch einmal die prinzipielle Frage:
Ist es möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames an 
den gleichen Endpunkt zu übertragen?

von Potter (Gast)


Lesenswert?

>>Daher noch einmal die prinzipielle Frage:
>>Ist es möglich CBW-, Daten- und CSW-Phase innerhalb eines USB-Frames an
>>den gleichen Endpunkt zu übertragen?
Naja bei 8 Micro-Frames kannst Du 8 x 64 Bytes übertragen (vorausgesetzt 
Du bekommst Deinen Endpunkt schnell genug voll).

Stellt sich die Frage: Wie groß ist denn Dein CBW- und Dein CSW-Paket? 
Und wieviele Daten willst Du denn mitschicken?

Üblicherweise werden Sektoren übertragen. Somit haben wir 512 Bytes an 
Daten. plus CBW und CSW. Wie soll das also gehen, wenn insgesamt 8 * 64 
Bytes zur Verfügung stehen?

>>Bitte, bitte ... keine Hinweise darauf wie schnell oder gut es mit
>>SD-Card funktionieren würde. Dessen bin ich mir bewusst, aber ich habe
>>nicht die Möglichkeit die Schnittstelle zu ändern.
Auch wenn Du die Schnittstelle nicht ändern kannst, ein bischen 
Kopfrechnen sollte noch drinn sein :)

Gruß Potter

von Marco M. (marco_m)


Lesenswert?

Kannst du etwas zu dem FAT-Overhead sagen bzw. spricht etwas dagegen die 
Logging Dateien im voraus anzulegen, so dass man nur eine Liste von 
Sektoren hat die man nacheinander beschreiben muss? Das klingt grad so, 
als hättest du ein bisschen sehr viel Dateisystemoverhead.

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.