Forum: Compiler & IDEs AVR32 printf umleiten stdout


von Jens A. (micro)


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.

von Stefan B. (stefan) Benutzerseite


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...

von Jens A. (micro)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Jens A. (micro)


Lesenswert?

@Karl heinz Buchegger

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

Aber wie mache ich sowas?

von Karl H. (kbuchegg)


Lesenswert?

Wie schon gesagt: eine variadische Funktion

<aus dem Gedächtnis zusammenkram>
1
#include <stdio.h>
2
#include <stdarg.h>
3
4
5
void my_printf( const char* fmt, ... )
6
{
7
  char buffer[80];
8
9
  va_list args;
10
  va_start( args, fmt );
11
  vsprintf( buffer, fmt, args );
12
  va_end( args );
13
14
  uart_puts( buffer );
15
}

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.

von Jens A. (micro)


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.

von Jens A. (micro)


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

von Jens A. (micro)


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.

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
Noch kein Account? Hier anmelden.