mikrocontroller.net

Forum: Compiler & IDEs ARM7 mit GCC: Verwendung von printf


Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Thorsten H (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"

Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
If you need to output to a physical device, such as a UART, the following 
notes will help you:

* If the character cannot be written for any reason, putchar must return EOF.

* The higher layers of the library do not translate C's end of line 
character '\n' before passing it to putchar. If you are directing output 
to a serial line connected to a terminal, for instance, you will most 
likely need to output a carriage return and line feed when given the 
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;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.