Hallo, ich würde gern den Befehl fprintf(*file, parameter) verwenden, um eine formatierte Ausgabe in eine Textdatei auf der SD Karte zu erreichen oder auf der UART. Meines Wissens nach benötigt diese Funktion eine putchar Funktion, die den Stream zeichenweise entgegen nimmt und auf die Zielhardware abbildet. Hat jemand ein Beispiel, wie man das löst? Irgendwie stehe ich so ein bisschem im Walde. Gruss, Christian
Hallo christian, auf meinem lpc2294 wird die ausgabe über uart folgendermaßen gelöst: #include <LPC21xx.H> // LPC21xx definitions #define CR 0x0D /* implementation of putchar (also used by printf function to output data) */ int sendchar (int ch) { /* Write character to Serial Port */ if (ch == '\n') { while (!(U1LSR & 0x20)); U1THR = CR; /* output CR */ } while (!(U1LSR & 0x20)); return (U1THR = ch); } int getkey (void) { /* Read character from Serial Port */ while (!(U1LSR & 0x01)); return (U1RBR); } Hierbei ist das U1LSR das statusregister der uart. U1THR ist das fifo register der uart. Über U1LSR wird der status des U1THR geprüft bzw festgestelt wann eine neubeschreibung des registers und damit ein senden erfolgen kann. viel erfolg thorsten
Um das stdio-Interface an verschiedene devices zu "binden" nutzt man üblicherweise eine Tabelle, in der für den jeweiligen file-id Funktionspointer hinterlegt sind, die auf die jeweilige Ausgabe/Eingabe/ctrl-Funktion zeigen. Brauchbare Beispiele dafür: - newlib-lpc (http://www.aeolusdevelopment.com/Articles/download.html) - libnosys (aus devkitpro auf sf.net) - RDCF (http://openhardware.net/Embedded_ARM/RDCF2/) - SDC support "schon drin"
Hallo, ich möchte hier noch mal anbinden, denn das problem habe ich gerade. Den letzten Beitrag verstehe ich leider nicht, zudem er mich noch weiter weg vom Thema führt. Crosssworks kennt die printf Funktion wie gehabt durch den gcc und leitet sie in einer internen Bibliothek auf __debug_printf() um, das ist die für diese Entwicklungsumgebung definierte Debug Schnittstelle, die über das JTAG Interface auf ein virtuelles Terminal schreibt. Diese Funktion ist nicht portierbar. Sehr nützlich für die Programmentwicklung, es lassen sich auch Dateien damit auf die Platte schreiben... aber eben nur wenn der JTAG Stecker drin ist und Debug Infos mit kompiliert wurden. Der Prototyp von putchar heisst: int __putchar(int ch) und liegt in der stdio.h drin. Alles was dahinter kommt liegt nur als Object File vor. Die Hilfe gibt leider auch nicht viel her.
1 | If you need to output to a physical device, such as a UART, the following |
2 | notes will help you: |
3 | |
4 | * If the character cannot be written for any reason, putchar must return EOF. |
5 | |
6 | * The higher layers of the library do not translate C's end of line |
7 | character '\n' before passing it to putchar. If you are directing output |
8 | to a serial line connected to a terminal, for instance, you will most |
9 | likely need to output a carriage return and line feed when given the |
10 | character '\n' (ASCII code 10). |
Heisst das jetzt, dass ich nur die __putchar Funktion überschreiben muss, dort drin meinen Uart Code plazieren und die Sonderzeichen gesondert erzeugen muss? Die andere Sache ist die Schreibweise von Interruptfunktionen. Koch da eigentlich jeder sein Süppchen, also zB keil anders als gcc usw? Bei mir sieht ein Prototyp für eine ISR so aus: static void _attribute_ ((interrupt("IRQ"))) timer0ISR(void); (wobei ich den Sinn hinter dem Attrbute nicht verstehe...) Eingeschaltet werden sie mit: __ARMLIB_enableIRQ(); Bei Keil wieder so mit dem Keyword _irq. void UART0Handler( void ) __irq;
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.