www.mikrocontroller.net

Forum: Compiler & IDEs AVR32 stdout umleiten seltsames verhalten


Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nutze einen AVR32 und leite die stdout folgendermaßen um.

// rederict stdout
int _write(int file,char *ptr,int len)
{
 int i;
 for(i=0;i<len;i++)
 {
  uart1_putc(*ptr++);
 }
 return len;
}

Nachdem ich aber das mache kann der JTAG Debugger den AVR32 nicht 
richtig resetten. Ich muss immer einen manuellen Reset Hardwaremäßig 
machen damit der Prozessor neu startet. Warum ist das so?
Hat das noch jemand so?

Weiterhin funktioniert printf nur wenn
ich am Ende ein \n einfüge etwas so:
printf("Ergebniss =%2.5f\r\n",z);

Bei
printf("Ergebniss =%2.5f\r",z); geht printf nicht.


Warum? Weis dies jemand?

Hat jemand damit schon mal Erfahrung gemacht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens A. schrieb:

> Weiterhin funktioniert printf nur wenn
> ich am Ende ein \n einfüge etwas so:
> printf("Ergebniss =%2.5f\r\n",z);
>
> Bei
> printf("Ergebniss =%2.5f\r",z); geht printf nicht.
>
>
> Warum? Weis dies jemand?

Zum JTAG kann ich nichts sagen.
Aber zu \n
Es ist nicht ungewöhnlich, dass Ausgabebibliotheken die Ausgabe 
zwischenpuffern und erst dann, wenn sie einen \n sehen, die komplette 
Ausgabe die Pipeline runterschicken in der sie dann zum Gerät 
transferiert werden.
Entweder mann kann dann dieses Buffering abschalten oder aber man zwingt 
die Ausgabelib mittels einem flush dazu, die Ausgabepuffer auszuleeren, 
selbst dann wenn noch kein \n gesehen wurde.

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Ja mit dem Buffer erst nach \n leeren habe ich auch schon irgendwie
in Google finden können.
Aber im C Standard ist das aber nicht so, oder?
Weiterhin würde das ja bedeuten das ich mit printf
über die RS232 niemals eine alte Zeile wieder überschreiben kann,
da ja durch \r\n immer ein neue Zeile angefangen wird.

Laut C Büchern gibt es auch eine Funktion fflush()
aber ich habe keine Ahnung wir das mit der newlib ist.


Wo gibt es eigentlich Literatur oder Internetseiten wo man
sich das eigentlich mal genaustens anlesen kann.
Wie das alles mit dem stdout oder FILESTREAM funktioniert.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens A. schrieb:
> @Karl heinz Buchegger
>
> Ja mit dem Buffer erst nach \n leeren habe ich auch schon irgendwie
> in Google finden können.
> Aber im C Standard ist das aber nicht so, oder?

Doch. Für File Streams sind die Modi "unbuffered", "fully buffered" und 
"line buffered" definiert. "line buffered" ist das, was man 
üblicherweise bei stdout antrifft.

> Weiterhin würde das ja bedeuten das ich mit printf
> über die RS232 niemals eine alte Zeile wieder überschreiben kann,
> da ja durch \r\n immer ein neue Zeile angefangen wird.

Doch. Du kannst jederzeit ein fflush(stdout) machen.

> Laut C Büchern gibt es auch eine Funktion fflush()
> aber ich habe keine Ahnung wir das mit der newlib ist.

Da das eine ziemlich grundlegende Funktion ist, gibt es die da sicher 
auch.

Antwort schreiben

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

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.