Forum: Mikrocontroller und Digitale Elektronik printf geht nicht mit Parametern?


von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Hallo,

Ich möchte in mein Projekt ein printf verwenden.

Diese Codezeile geht:
1
printf("\r\nHallo\r\n");

In der Debug Console wird das richtig ausgegeben.

Wenn ich dann diese Zeile hinzu programmiere, dann geht es nicht:
1
printf("Zahl: %i\r\n", nZahl);

Linker zeigt dann den Fehler:
undefined reference to `printf'
wohl wegen dem Parameter.

weiß jemand was da noch fehlt?

Das Projekt ist ein Bootloader für den RX63N, debugt wird mit dem HEW 
und übersetzt wird das ganze mit dem Karpit Compiler.
Der Vorgänger hat wohl einiges gekürzt damit der Bootloader nicht zu 
groß wird. Ich soll den Prot vom RX62N auf den RX63N machen und da 
wollte ich seine Arbeit in der Debug Console ausgeben damit ich 
kontrollieren kann ob der noch richtig arbeitet.
Das eigentliche Projekt ist C++ und da nutzt printf andere Routinen im 
Hintergrund. puts() habe ich daher schon hinzugefügt:
1
extern "C" int puts(char *ptr) {
2
    int len = 0;
3
    while (*ptr) {
4
        charput(*ptr++);
5
        len++;
6
    }
7
    return len;
8
}

Vielen Dank für die Hilfe.

von Peter II (Gast)


Lesenswert?

Markus M. schrieb:
> Linker zeigt dann den Fehler:
> undefined reference to `printf'
> wohl wegen dem Parameter.

kann bei C eigentlich gar nicht sein. Die Name für das Symbol ändert 
sich nicht wenn mit oder ohne Parameter arbeitet.

Wie sieht die Signatur in der Header Datei für printf aus?

von test (Gast)


Lesenswert?

1
#include <stdio.h>

vergessen?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ohne das Include geht ja ohnehin nichts.

in der stdio.h steht das:
1
_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);

Die Datei wurde noch nie verändert.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Fehlen noch irgend welche libs die mit dazu gelinkt werden müssen?

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich habe das hinzugefügt:
1
extern "C" int sbrk(int i) { UNUSED(i); return 0; }

nun lässt es sich zumindest übersetzen, Test dauert noch.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Irgendwie passt das:

Markus M. schrieb:
> Linker zeigt dann den Fehler:
> undefined reference to `printf'
> wohl wegen dem Parameter.

mit dem:

Markus M. schrieb:
> Ich habe das hinzugefügt:
> extern "C" int sbrk(int i) { UNUSED(i); return 0; }

nicht zusammen.

Sicher, dass printf undefined war und nicht sbreak?

Ich befürchte, dass Deine Dummy-sbrk-Funktion nicht den gewünschten 
Erfolg haben wird.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

das befürchte ich auch. :-(

Dauert noch eine wenig bis ich den Bootloader so umgebogen habe dass ich 
das testen kann.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Markus M. schrieb:
> Wenn ich dann diese Zeile hinzu programmiere, dann geht es nicht:
Ich sehe Möglichkeiten:
1. der Fehler ist nicht im geposteten Code
2. printf() fehlt die für Parameter überladene Variante

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Wenn man nach "RX63N sbrk" googelt, findet man u.a. das:

  http://renesasrulz.com/renesas_forum_home/rx/f/27/t/4697.aspx

----------------------------------------------------------------------
"The simple solution is to create a new project which uses heap and copy 
sbrk.c and sbrk.h from this project to your project.

You can also find the code templates used for new projects in your HEW 
installation: \HEW\System\Pg\Renesas\RX\Rx_1_1\Generate\sbrk\"
----------------------------------------------------------------------

Ich kenne das vom STM32, wenn ich dort printf verwenden möchte, muss ich 
auch eine eigene sbrk-Funktion einbinden.

von Peter II (Gast)


Lesenswert?

Frank M. schrieb:
> Ich kenne das vom STM32, wenn ich dort printf verwenden möchte, muss ich
> auch eine eigene sbrk-Funktion einbinden.

vermutlich war die Fehlermeldung das das Symbol sbrk in printf fehlt und 
nicht das printf fehlt.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Ich hab nun diese Libs mit gelinkt:
stdc++ m g gcc nosys

davor wurde nur gcc mit gelinkt, nun kommt der Fehler nicht mehr.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Es gibt Compiler, die printf-Aufrufe, die keine Argumente enthalten, 
direkt durch puts-Aufrufe ersetzen. Und dann stört sich der Linker nicht 
an einer etwaig fehlenden printf-Library ...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Rufus Τ. F. schrieb:
> Es gibt Compiler, die printf-Aufrufe, die keine Argumente enthalten,
> direkt durch puts-Aufrufe ersetzen.

Genau das hätte ich auch so erwartet.  Geht allerdings nur, wenn am
Ende des Strings ein '\n' steht, denn das ist bei puts() ja implizit.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jörg W. schrieb:
> Geht allerdings nur,

... ist hier ja der Fall (siehe erstes Posting im Thread).

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Hab das nun getestet, der printf klappt nun korrekt. Es haben also nur 
die libs gefehlt.
Thx für die Hilfe.

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.