www.mikrocontroller.net

Forum: Compiler & IDEs AVR32 printf umleiten stdout


Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich verwende einen AVR32 und möchte gerne printf über usart 0 nutzen.
Leider kann ich die Funktionen aus der newlib ad on nicht nehmen.
Dies ist so da ich externes SDRAM habe und ich beim Linker sagen muss
-nostartfiles. Somit ist schonmal die normale crt0.S nicht dabei.
Ich nehme nämlich eine angepasste von Atmel aus dem Beispiel
damit das externe SDRAM als HEap verwendet werden kann.
Jetzt ist es nur dumm das printf nicht mehr über usart0 geht.

Wie wird das nun manuell gemacht die stdout von printf umzuleiten.
Irgendwie gibt es keine konkrete Antwort im Netz, oder ich verstehe es 
einfach nicht.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unterschiede zwischen dem normalen crt0.S und dem angepassten crt0.S 
siehst du keine? Vielleicht mal beide Dateien anhängen, damit andere 
drüberschauen...

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider habe ich die origianl crt0.S nicht.
Ich habe die nur als Object file

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
muss es denn unbedingt printf sein?

Im Grunde brauchst du doch nur sprintf und eine Funktion, die einen 
String auf die UART ausgeben kann.

Zur Not kann man sich auch eine my_printf als variadische Funktion 
selber bauen.

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Richtig es muss nicht printf sein.
Aber die Funktion solte printf heisen.

Aber wie mache ich sowas?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon gesagt: eine variadische Funktion

<aus dem Gedächtnis zusammenkram>
#include <stdio.h>
#include <stdarg.h>


void my_printf( const char* fmt, ... )
{
  char buffer[80];

  va_list args;
  va_start( args, fmt );
  vsprintf( buffer, fmt, args );
  va_end( args );

  uart_puts( buffer );
}

Allerdings solltest du noch mal die Doku zu deiner Lib studieren. Da 
gibt es mit Sicherheit eine Möglichkeit, wie du dem normalen printf eine 
Ausgabefuktion für ein einzelnes Zeichen unterjubeln kannst.

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Allerdings solltest du noch mal die Doku zu deiner Lib studieren. Da
>
> gibt es mit Sicherheit eine Möglichkeit, wie du dem normalen printf eine
>
> Ausgabefuktion für ein einzelnes Zeichen unterjubeln kannst.

Ja klar gibt es dass. Atmel hat es ja auch im Framework gemacht.
Und es geht ja auch. Eben nur nicht wenn ich die neue crt0.S nehmen muss 
und nicht die Originale von der Gnu Toolchain 2.4.2 von Atmel.
Da ich aber SDRAM habe benötige ich eine eigene crt0.S
mit den asm Routinen um SDRAM zu initialisieren und die variablen die im 
SDRAM liegen zu initialisieren.

Ich habe mir auch schon öfters die Doku der newlib
angeschaut. Verstehe ich aber noch nicht ganz.
Ich muss mich damit mal genau beschäftigen.

Aber danke für deine Hilfe.

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Vielen Dank. Das funktioniert. Ich kann die funktion sogar printf nennen
und die normale damit überschreiben. Muss dan halt nur ein return wert 
angeben

Autor: Jens A. (micro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

komisch ist nur das

 printf("1Hardware init done AVR32 is running.....\n\r");
 printf("2Hardware init done AVR32 is running.....\n");

 printf("3Hardware init done AVR32 is running.....\r\n");



 printf("4Hardware init done AVR32 is running.....");

die printf ausgaben mit vorne 1 und 4 gehen. Mit 2 und 3 nicht.
Des weiteren geht dadurch der automatische reset des AVR32 durch den 
Programmer AVR Dragon nicht mehr.

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.