Zeiten für einen Serial print

OP #5687175
Liebe Gemeinde,

ich habe in den letzten Tagen mit einem Arduino und einem Oszilloskop 
die Zeiten für bestimmte Operationen des Mikrocontrollers gemessen, um 
ein besseres Gefühl für die entsprechende Effizienz zu bekommen.

Um dies zu erreichen habe ich vor den entsprechenden Operationen einen 
Pin auf high gesetzt und ihn danach wieder auf low abfallen lassen. Die 
entsprechenden Zeiten habe ich mit meinem 1054z aufgezeichnet.

Gestern Abend wollte ich das gleiche dann noch für den "Serial.println" 
command machen...ich kann mir die Ergebnisse nur nicht so ganz erklären.
Wie im Graph zu erkennen, ist die Baudrate von 115200 bei bis zu 60 
Chars langsamer als die Baudrate von 9600. Erst danach wird die hohe 
Baudrate zu einem Vorteil.

Mir will einfach keine vernünftige Lösung dafür einfallen..

Hat einer von euch eine Idee oder gar die Lösung? :D
Angehängte Dateien:
#5687192
Edward M. schrieb:
> Gestern Abend wollte ich das gleiche dann noch für den "Serial.println"
> command machen...ich kann mir die Ergebnisse nur nicht so ganz erklären.
> Wie im Graph zu erkennen, ist die Baudrate von 115200 bei bis zu 60
> Chars langsamer als die Baudrate von 9600. Erst danach wird die hohe
> Baudrate zu einem Vorteil.

Serial.println schreibt in einen Buffer.
Eine Interrupt Routine sendet dann die Zeichen im Buffer.

Es dauert immer gleich lang, die Zeichen in den Buffer zu schreiben.
Egal wie schnell die Daten danach gesendet werden.


Natürlich nur solange, wie die Bufferlänge nicht überschritten wird.
Denn wenn kein Platz mehr im Buffer vorhanden ist, dann wartet println() 
darauf, bis Zeichen versendet worden sind, und wieder Platz im Buffer 
ist.
Gast #5687230
Edward M. schrieb:
> ein besseres Gefühl für die entsprechende Effizienz zu bekommen.

Um es mal pauchal auszudrücken: die Effizienz (in Termen von
Geschwindigkeit) ist in einer Arduino-Firmware-Umgebung (um
das Wort "Betriebssystem" zu vermeiden) schlichtweg gesagt
unter aller Kanone.

Hilfestellung: richtig programmieren und schon ist alles gut.
Gast #5687243
Fred Feuerstein schrieb:
> schlichtweg gesagt
> unter aller Kanone.

Von Arduino wird die ganz normale AVR Toolchain genutzt.

Und von daher ist die gleiche Performance zu erreichen, wie unter den 
andren IDEs(bzw. make) auch.

Es ist also eher dein Beitrag, welcher "unter aller Kanone" ist.
OP #5687398
Thomas W. schrieb:
> Serial.println schreibt in einen Buffer.
> Eine Interrupt Routine sendet dann die Zeichen im Buffer.
>
> Es dauert immer gleich lang, die Zeichen in den Buffer zu schreiben.
> Egal wie schnell die Daten danach gesendet werden.

Super, dass hört sich gut an :)

Fred Feuerstein schrieb:
> Um es mal pauchal auszudrücken: die Effizienz (in Termen von
> Geschwindigkeit) ist in einer Arduino-Firmware-Umgebung (um
> das Wort "Betriebssystem" zu vermeiden) schlichtweg gesagt
> unter aller Kanone.
>
> Hilfestellung: richtig programmieren und schon ist alles gut.

Nunja, ich nutze auch Atmel Studio, aber gerade für kurze Projekte 
bietet es sich einfach an, die Arduino IDE zu nutzen.

Stefan S. schrieb:
> Wenn du die Funktion DigitalWrite() nutzt, solltest du wohl bedenken,
> dass auch diese einen großen Overhead hat und unabhängig von der
> Baudrate zur Gesamtdauer beiträgt.

Die erste Messung war nur die reine an-/abstiegszeit dieser Funktion. 
Diese wurde aus allen folgenden Messungen natürlich subtrahiert :)
Gast #5687642
Fred Feuerstein schrieb:
> Um es mal pauchal auszudrücken: die Effizienz (in Termen von
> Geschwindigkeit) ist in einer Arduino-Firmware-Umgebung (um
> das Wort "Betriebssystem" zu vermeiden) schlichtweg gesagt
> unter aller Kanone.

An der Effizienz der seriellen Übertragung wirst du mit derartigen 
"klugen" Sprüchen nichts ändern können. Bei 9600 Bd beträgt die 
Übertragungsdauer für ein Byte nun mal rund 1ms. Sobald der Sendepuffer 
gefüllt ist, ist dies der limitierende Faktor. Und da der Pufferspeicher 
begrenzt ist, läufst du ab einer gewissen zu übertragenden Datenmenge 
immer in diese Grenze.

Erkläre bitte mal, wo da in deinen Augen die Arduino-Firmware-Umgebung 
begrenzend wirkt.
Gast #5687971
Edward M. schrieb:
> Um dies zu erreichen habe ich vor den entsprechenden Operationen einen
> Pin auf high gesetzt und ihn danach wieder auf low abfallen lassen. Die
> entsprechenden Zeiten habe ich mit meinem 1054z aufgezeichnet.

Das mache ich mir einfacher:
1
unsigned long StartTime = millis(); // debug
2

3
diverse Serial.print( ....
4

5
Serial.print(millis()-StartTime);
6
Serial.println(" ms");

Gerade die Tage habe ich anstatt Serial.print meine ms mal ins 
LC-Display geschrieben: Es ist egal, ob ein Terminal an der 
Schnittstelle angeschlossen oder das USB-Kabel ab ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.