Forum: Mikrocontroller und Digitale Elektronik seltsames printf-Verhalten (SAM3X8E mit GCC)


von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen,

ich habe ein sehr seltsames verhalten von "printf" beim Arduinmo DUE 
(8SAM3X8E), programmiert in Standard C (GCC) mit Atmel Studio 7.

Ich leite die Standardausgabe auf ein TFT mit RA8875, angesteuert über 
4-Wire SPI, an.

Das funktioniert auch alles, aber:

Die Umleitung zum TFT erfolgt unter Nutzung von TFT_Putchar (bei mir 
TFT_prcha genannt). Rufe ich TFT_prcha direkt auf, so wird das Zeichen 
auch korrekt und sofort ausgegeben.

Nutze ich aber printf (aus einer/der Standardlibrary), dann scheint das 
System mehrere 100 ms delay zwischen printf-Aufruf und der Ausgabe zu 
warten.

Das hat bei mir mit(Code vereinfacht dargestellt):
1
SetzePixelCursorXY(0,100);
2
prcha('x');
3
prcha('x');
4
prcha('x');
5
prcha('x');
6
printf("Pixel 0,100");
7
SetzePixelCursorXY(0,300);
8
printf("Pixel 0,300");
9
prcha('-');
10
prcha('-');
11
prcha('-');
12
prcha('-');

folgenden Fffekt:

Es wird "sofort" an der richtigen Positon (0,100)
xxxx ausgegeben, gefolt von ----  an Position (0,300), was eigentlich 
falsch ist.
Nach einer kurzen Wartezeit von ein paar 100 ms wird dann unmittelbar 
hinter (!) ----Pixel 0,100Pixel 0,300) ausgegeben.

Bei Programmierung unter irgendweclhen Betriebssystemen könnte ich mir 
ein solches Verhalten erklären, aber hier? Oder arbeitet die Library 
"printf" irgendwie im Hintergrund an? Weiß das jemand von Euch? Wäre 
toll. Noch toller wäre, wenn es einen Lösung dafür gäbe.

Danke, yogy

von Jim M. (turboj)


Lesenswert?

Printf() puffert.

Puffer wird mit fflush geleert oder wenn ein \n ausgegeben wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich halte hier printf auch nicht für unbedingt geeignet. printf ist für 
formatierte Ausgabe gedacht. Hier werden aber nur Strings ausgegeben. Da 
gibt es doch bestimmt analog zu dieser prcha-Funktion auch eine, mit der 
man Strings ausgeben kann?

Wenn nicht, dann diese nehmen:
1
void prchs (const char * str)
2
{
3
    while (*str)
4
    {
5
        prcha (*str);
6
        str++;
7
    }
8
}
9
10
    ...
11
    prchs ("Pixel 0,100");
12
    ...

Da diese Funktion prcha() benutzt, sollte damit das 
printf-Puffer-Problem ebenso erledigt sein.

: Bearbeitet durch Moderator
von Hanns-Jürgen M. (yogy)


Lesenswert?

Frank M. schrieb:
> Ich halte hier printf auch nicht für unbedingt geeignet. printf ist für
> formatierte Ausgabe gedacht. Hier werden aber nur Strings ausgegeben. Da
> gibt es doch bestimmt analog zu dieser prcha-Funktion auch eine, mit der
> man Strings ausgeben kann?
>
> Wenn nicht, dann diese nehmen:
>
1
> void prchs (const char * str)
2
> {
3
>     while (*str)
4
>     {
5
>         prcha (*str);
6
>         str++;
7
>     }
8
> }
9
> 
10
>     ...
11
>     prchs ("Pixel 0,100");
12
>     ...
13
>
>
> Da diese Funktion prcha() benutzt, sollte damit das
> printf-Puffer-Problem ebenso erledigt sein.

Ja, das ist schon richtig. Mein obiger vereinfachter angegebener Code 
ist da vlt. etwas irrefuhrent, real wird ein Array (index li) 
ausgegeben, hier jeweils 16 mal
1
printf("0x%02X,",TX_BUF[li * 2]);
aufgerufen.

@jim.m

Das Anfuegen von \n ändert nichts.

von Hanns-Jürgen M. (yogy)


Lesenswert?

Hallo zusammen,

vergesst bitte meine Anfrage, das Problem hat sich gelöst, ich war der 
Doofe (wie immer), da ich nach diesen Ausgabebefehken die 
Streamumleitung in der SW  geändert habe. (Ist halt noch ein 
Testsystem).

Nun habe ich das gesäubert und es arbeitet nun so wie es soll.

Sry, yogy

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.