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.
Erst mal auch schreiben, wie prinft aufgerufen wird... steht da nirgendwo
Funktioniert's denn mit nur einem Parameter? Wenn der Compiler meint, dass da zu viele sind...
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
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.
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.
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.