Zeiten für einen Serial print

OP #5687175
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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.
OP #5687398
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.