www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC2xxx: UART + printf()


Autor: Jürgen Eckert (sid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, (ich bins schon wieder)

normalerweise verwende ich zu Debug zwecken ganz gerne den UART. Und
damit man "schöne" Ausgaben erhält, und diese möglichst einfach,
verwend ich (zumindest am AVR) printf() indem ich einfach mit
fdevopen() der stdout Kanal in eine UART Sende Funktion "umpippe".

Doch das scheint am ARM nicht so einfach zu gehen...
Ich habe zwar eine printf() Funktion die ich anpassen und mit rein
kompilieren könnte, doch ist das wohl nicht die feine englische Art.
Und das ioctl() aus der lpc-newlib will ich auch nicht unbedingt
nehmen, da ich den UART selber initialisieren will (und so).

Doch auf der Seite von mthomas (der in der Beziehung ein ziemlich
krasser Guru zu sein scheint - *fett respekt alter...*) hab ich was
ganz interesantes gefunden: Das Bsp. nennt sich lpc2129_adc_stdio.
Da drinnen gibt es eine Datei die nennt sich syscalls.c In der werden
die Känle "umgepippt" in Funktionen die man eintragen kann. Doch
dummerweise wird diese Datei in keiner anderen includiert. Sie steht
nur kurz im Makefile drinnen.

Lange Rede kurzer Sin:
Wo ist der Trick dabei? Oder bin ich einfach nur Blind?
Weil die Datei einfach mit zu kompilieren und zu linken reicht nicht!
Irgendwo fehlt da noch ein kleiner Trick. Mein Prozessor bleibt einfach
beim printf() momentan stehen.

THX
Jürgen

Autor: Ppp Mmm (sanic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jürgen,

das printf() kannst du von Ulrich Radigs Seite verwendet.
In der ARM-Sektion findest du bei seinem SD/MMC-Card Code eine .c Datei
wo ein printf() drin ist.
Das verbraucht bei mir minimal Platz und funktioniert super.
Mit dem Umpipen und dem ganzen anderen Kram hatte ich nur Probleme und
es hat pervers viel Platz eingenommen.

Grüße,
Patrick

Autor: mthomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
syscalls definiert Funktionen mit bekanntem Namen, die von der Library
unter genau diesen Namen erwartet werden. Die Library sucht unter den
gesetzten Namen (in der Lib. in der Art "extern <bekannter Name>
deklariert). Daher kein Include irgendwo sondern nur "Bereitstellung
der Objekte". UART kann man "von Hand" initialisieren man muss die
write-Funktion und sbrk (printf braucht malloc, malloc braucht sbrk)
wie  bei syscall.c bereitstellen. Bei newlib iprintf verwenden, falls
man kein FP braucht - Speicherbedarf ist deutlich kleiner als bei
"normalem" printf mit floating-point-supprot (aber immer noch hoch).
Bei newlib-lpc ist all dies noch einfacher und gut "vorgekaut": Man
kein einen Stream per Devicenamen offenen ("COM1"/"COM2"). Mein
Beispiel "adc-stdio" ist nur eine stark reduziert Fassung der
newlib-lpc-Variante.
Deutlich kompakter sind die "mini-frintfs" wie z.B. die, auf die
Patrick verwiesen hat. Gute Variante findet man auch bei Holger
Klabunde (google findet) und eine lizenzfreie recht alte Version
irgendwo in den Tiefen des circuit cellar Artikel-Archivs.

Autor: Jürgen Eckert (sid)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, ihr habt mich überzeugt... Ich nutze jetzt eine eigene printf()
Funktion zum Debugen....


THX

Autor: Danielb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen, kannst du bitte deine printf() Funktion posten?

Gruß
Daniel

Autor: Jürgen Eckert (sid)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Puh... Lang ists her...

Im Anhang ist das drinnen was du suchst. Einfach den UART
initialisieren (mit UART_0Init(parameter) oder so) und dann kannst du
auch schon printf() nutzen.

MfG
Jürgen

Autor: Danielb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dankeschön :)

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.