Forum: Mikrocontroller und Digitale Elektronik Keil uVision printf benutzen


von ojeoje (Gast)


Lesenswert?

Hallo,
ich benutze einen Assembler Treiber für die ausgabe auf ein 4x20 LCD. 
Alle Funktionen des Treibers funktionieren einwandfrei.
Nun habe ich die PUTCHAR funktion mit in das projekt eingebunden weil 
ich gerne printf benutzen möchte.
Compiler sagt: MAIN.C(163): error C208: '_printf': too many actual 
parameters

Hier sind die Funktionsdeklarationen des Treibers:

extern  init_display(void);
extern  clr_lcd(void);
extern  printchar(char);
extern  moveto(char,char);
extern  cursor_on(void);
extern  cursor_off(void);
extern  print_lcd(char code *);
extern  print_digit (unsigned char);

Diese Funktionieren.
Kann mir jemand sagen was ich tun muss damit printf funktioniert.

von MeinerEiner (Gast)


Lesenswert?

Erst mal auch schreiben, wie prinft aufgerufen wird... steht da 
nirgendwo

von Mark B. (markbrandis)


Lesenswert?

Funktioniert's denn mit nur einem Parameter? Wenn der Compiler meint, 
dass da zu viele sind...

von Ralf (Gast)


Lesenswert?

printf arbeitet über die putchar.
Wird keine putchar-Funktion in die Projektdateien aufgenommen, wird eine 
interne Funktion verwendet.
Die eigene putchar-Funktion muss die Steuerzeichen (Endeterminierung, 
etc.) passend auf das Display ummünzen.

Das heisst, die putchar-Funktion darf von deinen Treiber-Funktionen 
wissen, printf darf's nicht wissen (bzw. muss es nicht wissen).

Bzgl. der Fehlermeldung, zeig mal deine main.c.

Ralf

von ojeoje (Gast)


Lesenswert?

Ahhhhhhh!!!

Es funzt!
stdio.h!!!

Sorry und Danke!!!

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Hi,

das einfachste retargeting mit nur einem Ausgabekanal ist, eine eigene 
fputc zu schreiben.

Die fputc sieht dann z.B so aus:

int fputc(int c, FILE *f)
{
  if(c=='\n') lcd_putchar('\r');
  lcd_putchar(c & 0xff);

  return(c);
}


Willst du verschiedene Ausgabekanäle mittels FILE pointern (fopen, 
fprintf, ...) verwenden, müssen die _sys_open/close/read/write 
funktionen neu geschrieben und angepasst werden.
Such mal in den files des RTAgent von Keil.

VG,
/th.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

btw...
ich arbeite gerade an einem sehr komplexen retarget-system mit flexiblen 
ausgabekanälen.

Hat sich jemand von euch schon mal damit beschäftigt? Gibt es irgendwo 
verständliche "lektüre", wie die internas bei anderen aussehen, d.h. wie 
die infrastruktur ist von printf über fputc über _sys_write über .... ?

VG,
/th.

von Peter D. (peda)


Lesenswert?

Random ... schrieb:
> ich arbeite gerade an einem sehr komplexen retarget-system mit flexiblen
> ausgabekanälen.

Das mit den FILE-Pointern ist mir zu umständlich.
Wenn ich auf verschiedene Geräte ausgeben muß (LCD, UART), dann nehme 
ich einfach sprintf().

In der Regel müssen ja die Ausgaben je nach Gerät völlig verschieden 
formatiert werden. D.h. man kann eh nie den gleichen String auf mehrere 
Geräte ausgeben.


Peter

von Random .. (thorstendb) Benutzerseite


Lesenswert?

> In der Regel müssen ja die Ausgaben je nach Gerät völlig verschieden
> formatiert werden. D.h. man kann eh nie den gleichen String auf mehrere
> Geräte ausgeben.



Nunja,

für User/Textausgaben kann man schon immer die gleichen Quelldaten 
nehmen. Man muss dann nur eine Terminalemulation mit in den 
devicetreiber einbauen.
So mach ichs.

Ich unterscheide halt nicht, ob ich ein (G)LCD, UARTx, ITM, USB oder ETH 
device habe :-) Das weiss der Treiber.

VG,
/th.

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.