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.
Unterschiede zwischen dem normalen crt0.S und dem angepassten crt0.S siehst du keine? Vielleicht mal beide Dateien anhängen, damit andere drüberschauen...
Leider habe ich die origianl crt0.S nicht. Ich habe die nur als Object file
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.
@Karl heinz Buchegger Richtig es muss nicht printf sein. Aber die Funktion solte printf heisen. Aber wie mache ich sowas?
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.
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.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.