Hallo zusammen,
Ich arbeite gerade mit dem Evaluation Board STM32446 um den Protocol USB
CDC FS zu nutzen. Ich kann schon Daten am Computer senden bzw. empfangen
aber jetzt möchte ich wissen, mit welcher Geschwindigkeit die
Übertragung der Daten wirklich ist. Kann ich das am besten per Software
oder Hardware durchführen?.
Kann ich diese Zeit der Übertragung in den Pins PA12 (Data+) und
PA11(Data-) in einem Oszilloskop messen?
uint8_t mystring[] = "Hello";
int main(void)
{
/* STM32F446xx HAL library initialization */
HAL_Init();
/* Configure the system clock to 180 MHz */
SystemClock_Config();
MX_GPIO_Init();
/* Init Device Library */
USBD_Init(&USBD_Device, &VCP_Desc, 0);
/* Add Supported Class */
USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
/* Add CDC Interface Class */
USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
/* Start Device Process */
USBD_Start(&USBD_Device);
/* Run Application (Interrupt mode) */
while (1)
{
CDC_Transmit_FS(mystring,strlen((const char*)mystring));
HAL_Delay(1000);
}
}
Hallo zusammen,
Ich arbeite gerade mit dem Evaluation Board STM32446 um den Protocol USB
CDC FS zu nutzen. Ich kann schon Daten am Computer senden bzw. empfangen
aber jetzt möchte ich wissen, mit welcher Geschwindigkeit die
Übertragung der Daten wirklich ist. Kann ich das am besten per Software
oder Hardware durchführen?.
Kann ich diese Zeit der Übertragung in den Pins PA12 (Data+) und
PA11(Data-) in einem Oszilloskop messen?
uint8_t mystring[] = "Hello";
int main(void)
{
/* STM32F446xx HAL library initialization */
HAL_Init();
/* Configure the system clock to 180 MHz */
SystemClock_Config();
MX_GPIO_Init();
/* Init Device Library */
USBD_Init(&USBD_Device, &VCP_Desc, 0);
/* Add Supported Class */
USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
/* Add CDC Interface Class */
USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
/* Start Device Process */
USBD_Start(&USBD_Device);
/* Run Application (Interrupt mode) */
while (1)
{
CDC_Transmit_FS(mystring,strlen((const char*)mystring));
HAL_Delay(1000);
}
}
Ich implementiere das Beispielprogramm (USB CDC Standalone) von dem
EvaluationBoard STM32446E um Daten nur per USB senden bzw empfangen zu
können. Das scheint gut zu funktionieren, aber jetzt möchte ich wissen,
wie hoch diese Geschwindigkeit der Datenübertragung ist. Wie könnte ich
das messen?
Das ist was ich sende,
uint8_t mystring[] = "Hello";
int main(void)
{
/* STM32F446xx HAL library initialization */
HAL_Init();
/* Configure the system clock to 180 MHz */
SystemClock_Config();
MX_GPIO_Init();
/* Init Device Library */
USBD_Init(&USBD_Device, &VCP_Desc, 0);
/* Add Supported Class */
USBD_RegisterClass(&USBD_Device, USBD_CDC_CLASS);
/* Add CDC Interface Class */
USBD_CDC_RegisterInterface(&USBD_Device, &USBD_CDC_fops);
/* Start Device Process */
USBD_Start(&USBD_Device);
/* Run Application (Interrupt mode) */
while (1)
{
CDC_Transmit_FS(mystring,strlen((const char*)mystring));
HAL_Delay(1000);
}
}
Auf der Datei des Boards steht, dass die Geschwindigkeit bei 12Mbts
beträgt, Das ist das ich messen möchte.
Student schrieb:> Auf der Datei des Boards steht, dass die Geschwindigkeit bei 12Mbts> beträgt, Das ist das ich messen möchte.
Das ist nicht die Datenrate, die Du per CDC erreichen kannst, das ist
die Bruttodatenrate von "Full-Speed"-USB. Die hat "Full-Speed"-USB
immer.
Und daher kannst Du diese Bruttodatenrate auch nicht sinnvoll messen.
Ja, stimmt. Dann wenn ich zB das per USB sende uint8_t mystring[] =
"Hello"; oder wenn ich etwas in dem Board per Hterminal empfange,
Kann ich irgenwie die Zeit messen, die mein Board um diese Daten zu
übertragen benötigt?
Du kannst messen, wie lange die Ausführung der Funktion "CDC_Transmit"
dauert - dazu verwendest Du einen I/O-Pin, den Du als Ausgang
konfigurierst, legst den unmittelbar vor Aufruf der Funktion auf High
und unmittelbar nach Aufruf der Funktion auf Low. Mit einem Oszilloskop
kannst Du die Dauer des High-Pulses bestimmen.
Rufus Τ. F. schrieb:> Du kannst messen, wie lange...
Ach Rufus, laß mal. Der TO hat noch nicht kapiert, daß all seine Zeiten
und Durchsätze zum größten Teil davon abhängen, wie doof man sich auf
der µC-Seite beim zuständigen Handler anstellt.
Auch bei den USB-Cores von ST gibt es die Möglichkeit, mit mehreren
verschiedenen Blockpuffern zu arbeiten, so daß der µC einen Puffer füllt
(oder leert), während der andere gerade im USB-Procedere hängt.
Aber das ist bei stinknormalen CDC eher unüblich, weil's dort eigentlich
nicht benötigt wird. Jetzt versucht der TO mit einem Standard-Zeugs von
ST's Stange zu arbeiten und sendet "hello". Als ob's das bringen
könnte... Wäre was anderes, wenn er mit 4..8K großen Blöcken anrücken
würde.
W.S.
Rufus Τ. F. schrieb:> Du kannst messen, wie lange die Ausführung der Funktion "CDC_Transmit"> dauert
Das wird nichts bringen denn wahrscheinlich kopiert die einfach nur die
paar Bytes in den nächsten freien TX Puffer des betreffenden Endpoints
und setzt ein paar bits um den Puffer für den DMA des USB-Controllers
als abholbereit zu markieren.
Was wäre denn sinnvoll schicken oder empfanden um eine beachtliche Zeit
der Übertragung per USB messen zu können? ... Ich kenne mich nicht so
gut mit dem USB CDC Protocol,
Etwas GROßES wäre angebracht. Irgendwas zwischen 10 und 100 MB an Daten
müssen es mindestes sein um halbwegs verlässlich sagen zu können was
genau Dein PC mit der aktuellen Auslastung im Durchschnitt kann.
Der STM32F4 schafft mit FS USB und original ST-Stack nach dem Fixen
einiger Bugs knapp 1 MiB/s (was echt gut ist für FS USB).
Mit HS USB gehen ca 7,5 MiB/s, aber da limitiert der Standard-Treiber
auf PC-Seite.
Messen Kannst Du mit irgendeinem selbstgeschriebenen Programm oder auch
Wireshark.
Und jetzt sag bloß Du wolltest nicht den Durchsatz sondern die Latenz...
Karl schrieb:
> Mit HS USB gehen ca 7,5 MiB/s, aber da limitiert der Standard-Treiber> auf PC-Seite.>> Messen Kannst Du mit irgendeinem selbstgeschriebenen Programm oder auch> Wireshark.>> Und jetzt sag bloß Du wolltest nicht den Durchsatz sondern die Latenz...
Vielen Dank für die Antwort,
Ich habe gerade das Programm für HS USB, Hättest du eine Idee, wie ich
zwischen 10 und 100 MB an Daten senden kann um die 7,5 MiB/s, messen zu
können?
Bitte die https://www.mikrocontroller.net/user/conditions
berücksichtigen!
Keine Teilname an einer Diskussion unter zwei verschiedenen Namen!
(Und es ist im übrigen sinnlos, die exakt gleiche Frage im Abstand von
drei Stunden zu wiederholen, nur weil noch niemand in der Zwischenzeit
geantwortet hat)
Noch mal , vielen Dank an alle für eure nette Antworten.
Ich habe schon eine Lösung für das gefunden, und jetzt habe ich die
Geschwindigkeit gemessen und komme auf ca. 8,23MByte pro Sekunde.
Ich hätte zuerst alle über USB- Protokoll lesen müssen.
...
Ich möchte auch euch alle mich zu entschuldigen, weil ich hier auf der
Webseite mit verschiedenen Namen die gleiche Frage gestellt habe, ich
wollte nur Ruckmeldungen bekommen.
Ist für mich schon lange her jedoch bin ich mir sicher das du da mit
deinen 8,xx MByte/s nur falsch liegen kannst..
Im Standard CDC (auch bei ST) sind für Daten ein Bulk IN und ein Bulk
OUT inplementiert. Bulk entpunkte können ein mal je ms Daten senden bzw
empfangen. Die Paketgröße beträgt 64 byte, wirst du sicher rechnen
können wieviel KByte/s du da maximal erreichen kannst..
Rufus Τ. F. schrieb:> Und daher kannst Du diese Bruttodatenrate auch nicht sinnvoll messen.
Außerdem hat die zusätzlich nichts mit der CDC-Übertragungsrate zu tun.
Man muss sich von dem Gedanken verabschieden, dass eine USB-CDC das eine
irgenwie isochrone Geschichte wäre. Will heißen: Zeitverhalten und
Übertraungsrate ist nicht vorhersagbar.
Das ist USB Bulk-Tranfer, wenn ich mich richtig erinnere, und damit per
Definition nicht vorhersagbar. Denn da wird übertragen "wenn gerade mal
Zeit frei ist". Was das für das Verhalten bedeutet, wenn man hinter
einem Hub hängt (wie fast immer!), kann sich jeder denken - Abhängig vom
Host und Hub.
Was ich aus eigenen Projekten weiß:
Große Datenmengen gehen üblicherweise realtiv "schnell". Also viel
schneller als RS232, MBIT sind drin. Aber unkonstant.
Die Laufzeiten sind dagegen völlig unvorhersagbar. Manchmal geht es
schnell, manchmal dauert es >100ms.
--> Eine CDC eignet sich für zeitkritische Übertragungen einfach nicht.
Für sowas macht man ein "richtiges" USB-Device.
Zero schrieb:> Ist für mich schon lange her jedoch bin ich mir sicher das du da mit> deinen 8,xx MByte/s nur falsch liegen kannst..> Im Standard CDC (auch bei ST) sind für Daten ein Bulk IN und ein Bulk> OUT inplementiert. Bulk entpunkte können ein mal je ms Daten senden bzw> empfangen. Die Paketgröße beträgt 64 byte, wirst du sicher rechnen> können wieviel KByte/s du da maximal erreichen kannst..rolleyes
Bulk kann einmal pro Frame (1 ms) Daten übertragen und ein Paket ist
auch max. 64 Bytes wenn man so will, aber wenn man die Übertragung nicht
mit einem Paket < 64 Byte oder einem ZLP abbricht, kann man den ganzen
Frame über Pakete übertragen.
uwebonnes schrieb:
> Geht das an USB 2 oder mit einem USB-2 Hub nicht auch im 1/8 ms Raster?
Ja. Microframe nennt sich das dann. Hat aber mit der obigen
Fehlinterpretation nichts mehr zu tun.
Gästchen schrieb:> ...> --> Eine CDC eignet sich für zeitkritische Übertragungen einfach nicht.> Für sowas macht man ein "richtiges" USB-Device.
Jain. Kommt wie immer auf die Anforderungen an. Es gibt haufenweise
"professionelle" Messtechnik die auch gut funktioniert und dann doch
einen FTDI drauf hat der CDC macht. Garantieren kann natürlich niemand
nichts aber in der Regel klappt es sehr gut. Ein ausrechend großer
Puffer auf Device-Seite muss natürlich sein. Atomkraftwerke aber bitte
doch mit dem Parallelport steuern ;-)
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang