Forum: Compiler & IDEs AVR32 stdout umleiten seltsames verhalten


von Jens A. (micro)


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?

von Karl H. (kbuchegg)


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.

von Jens A. (micro)


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.

von Rolf M. (rmagnus)


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.

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.