Keil uVision printf benutzen

Gast #1313339
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.
Gast #1313362
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
Persönliche Seite #1313378
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.
Persönliche Seite #1313386
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.
#1313570
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
Persönliche Seite #1313616
> 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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.