www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik printf Problem ARM mit Crossworks


Autor: Christian J. (elektroniker1968)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

leider kommt der alte Beitrag nicht mehr hoch, daher ein neuer:

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;

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ja du kannst die Funktion überschreiben.
Ich bevorzuge aber eher die Methode:
Whilst this is an adequate implementation of __putchar, it does consume
stack space for an unnecessary nested call and associated register saving.
A better way of achieving the same result is to define the low-level symbol
for __putchar to be equivalent to the low-level symbol for debug_putchar.
To do this, we need to instruct the linker to make the symbols equivalent.

schau dir nochmal dafür die Doku im Netz an.

mfg

Stephan

Autor: Christian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

funktioniert leider nicht __putchar irgendwo im Code zu definieren, 
printf bleibt weiter auf der Debug Schnittstelle.

Was gut funktioniert ist das
void uprintf(char *s, const char *format, ...)
{
    unsigned char textbuf[80];

    sprintf(textbuf,"\n\rT0 Interrupt  : %u ms",T0PR);
    uart0Puts(textbuf);
}

Trotzdem würde ich gern die "professionelle Lösung" vorziehen. Beispiel 
wäre gut.

PS: Frage mich wieso printf beim gcc 10kb braucht, bei Microchip PICS 
schaffen die das mit 1,5kb und voller Funktionalität mit float.

Autor: Stephan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

hier ein Beispiel.
Das war bei meinen Examples für AT91SAM7X dabei!

mfg

Stephan

Autor: Christian J. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Läuft ! :-)

Ich musste einen Unterstrich weglassen, warum weiss ich nicht, 
jedenfalls lüppt es.... die Nacht kann lang werden :-)

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.