Hallo zusammen. Ich hab da mal eine Verständnissfrage. Ich lerne in der FH im Moment C für den PC und da haben wir auch schon printf und scanf benutzt. Das Programm startet, das Consolen-Fenster geht auf und mit printf kann man einen String anzeigen lassen und bei scanf "wartet" das Programm, bis der Benutzer etwas eingegeben hat und mit Enter bestätigt. Jetzt stell ich mir die Frage, wie das bei µC's funktionieren soll. Dort hat man ja weder eine Konsole, noch eine Tastertur oder Bildschirm. Klar kann man ein LCD und ein Tastenfeld anschließen, aber woher weiß der C-Compiler, wo das (eventuell vorhandene) Display hängt, welcher (wenn überhaupt) Treiber verbaut ist und allgemein, was er mit den Parametern machen soll? Sprich: Wie kann/soll ich mir das vorstellen? Danke schonmal im Vorraus
Hallo wie wärs mit UART/RS232 ? Das printf/scanf ist ja ein Funktion der Bibliothek. Nicht jeder Compiler bietet diese Funktionen an. Das muss/wird dann wohl in der Beschreibung dokumentiert sein, "wo er das hinschickt". Gruß Gerhard
Naja bei µC hat man aber einen UART, über die die printf-Ausgaben an ein Terminal (z.B. PC) gesendet werden können. Im Quellcode kann man dem Compiler mitteilen, welche Funktion für die Standardausgabe zuständig ist. Dafür muss man vorher nur den UART initialisieren und eine Funktion schreiben die ein Zeichen über den UART sendet bzw. empfängt und dies dann über entsprechende direktiven dem Compiler mitteilen diese als stdin bzw. stdout zu nutzen
Du kannst stdout z.B. auf die put_char vom uart legen, dann kannst du printf mit dem µC verwenden! Hier steht wies geht: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Die_Nutzung_von_sprintf_und_printf Ist natürlich nicht wirklich effizient ;-) Gruß
Beim AVR GCC ist es so daß den Printf/Scanf-Funktionen eine entsprechende Funktion mitgeteilt werden muß über die dann die Ein-/Ausgaben erfolgen. Der Programmierer hat es damit selbst in der Hand ob das I/O über RS232 oder ein Display/Keyboard oder ... geht.
Michael Skropski schrieb: > Jetzt stell ich mir die Frage, wie das bei µC's funktionieren soll. Dort > hat man ja weder eine Konsole, noch eine Tastertur oder Bildschirm. Klar > kann man ein LCD und ein Tastenfeld anschließen, aber woher weiß der > C-Compiler, wo das (eventuell vorhandene) Display hängt, welcher (wenn > überhaupt) Treiber verbaut ist und allgemein, was er mit den Parametern > machen soll? > > Sprich: Wie kann/soll ich mir das vorstellen? Der weiß das alles weil man es einprogrammiert (wie beim PC). scanf und printf gibts so direkt nicht, weil es keinen standard Ein- und Ausgabestream gibt, wobei man die auch einbauen könnte für der UART (gibts vermutlich schon irgendwo) Ich glaub du hast da noch ein sehr großes verständnis Problem. Was willst du überhaupt machen?
Timmo H. schrieb: > Naja bei µC hat man aber einen UART, über die die printf-Ausgaben an ein > Terminal (z.B. PC) gesendet werden können. > Im Quellcode kann man dem Compiler mitteilen, welche Funktion für die > Standardausgabe zuständig ist. Dafür muss man vorher nur den UART > initialisieren und eine Funktion schreiben die ein Zeichen über den UART > sendet bzw. empfängt und dies dann über entsprechende direktiven dem > Compiler mitteilen diese als stdin bzw. stdout zu nutzen Achso, dann versteh ich das. Wenn der Compiler das unterstützt, muss ich ihm quasi sagen, was er mit der Eingabe bzw. Ausgabe machen soll, und dann ruft er für jedes Zeichen die stdout auf!? Im printf ist dann bestimmt auch noch die Formatierung, wenn ich z.B. eine Float-Zahl ausgeben will, dass er die Zahl aus der Variablen benutzt und mit sovielen Nachkommastellen ausgibt, wie ich angegeben habe (z.B. %4.2f). irgendwer schrieb: > Ich glaub du hast da noch ein sehr großes verständnis Problem. > Was willst du überhaupt machen? Ich weiß nich ob das soo groß ist. Ich hab die beiden Funktionen bisher halt nur bei der "PC-Programmierung" kennengelernt. Dann hab ich das in einem Quellcode für einen AVR gesehen (war eine UART-Anwendung) und hab mich gewundert. Deswegen hab ich auch "nur" gefragt, Anwendung kommt dann später, wenn ich mein Experimentierboard habe, wo ein Display und eine RS-232-Schnittstelle drauf ist. Dann denke/hoffe ich, hab ich das soweit verstanden. Wenn ich hier was falsches drin stehen habe, wohl doch noch nich :/ Danke aber für die Antworten.
Michael Skropski schrieb: > Achso, dann versteh ich das. Wenn der Compiler das unterstützt, muss ich > ihm quasi sagen, was er mit der Eingabe bzw. Ausgabe machen soll, und > dann ruft er für jedes Zeichen die stdout auf!? Der Compiler untersützt gar nichts, der compiliert nur. Printf/scanf/etc. sind Funktionen einer lib. Beim avr ist das die avrlibc, bei ARM's ist die newlib weit verbreitet, und auf dem PC ist das einfach die libc. Diese libs bieten auch Funktionen, um die tatsächliche Zeichenein- und ausgabe dort einzubinden. Die eigentliche Ausgabefunktion für ein einzelnes Zeichen, die dann ein Zeichen auf die uart oder ein LCD ausgibt, musst du selber schreiben, und der lib mit über die passenden Funktion bekannt machen. Wie das geht, steht in der jeweiligen Dokumentation. Bei einem Aufruf von printf() ruft dann die lib deine eigene Ausgabefunktion für jedes Zeichen auf, und die macht dann das damimt, was du programmiert hast. Oliver
Ein Beispiel sagt oft mehr als viele Worte: http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#stdio_without_malloc
Bei den mit SDCC (und wohl auch einigen ähnlichen) mitgelieferten Bibliotheken ist putchar()/getchar() einfach nicht implementiert; man baut es dann (von Grund auf oder auf Basis anderer Bibliotheksfunktionen) selber, evtl auch als Proxy der je nach Inhalt einer Variablen unterschiedliche Kanäle anspricht. Eigentlich sehr flexibel. Komplette printf()/scanf()-Implementationen sind aber für kleinere Controller schon sehr schwergewichtig (da werden zB long int-Hilfsroutinen und Floating-Point-Emulationen mit reingzogen, schnell ist man bei mehreren Kilobyte! Und selbst zB sdcc printf_tiny() ist riesig im Vergleich zu einer einfachen eigenen puts()-artigen Funktion ); daher werden oft zig Versionen mit unterschiedlichen Featuresets mitgeliefert.
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.