Hallo, ich habe irgendwie Probleme im AVR Studio 4 mit SP 3 die float printf lib einzubinden. Weis jemand wie das geht? Oder muss ich das makefile selbstständig bearbeiten. Woher ich das wies das diese nicht richtig eingebunden wird? folgendes: sprintf(out,"%f",test); uart0_puts(out); Mit dem mfile Editor der beim WinAvr dabei ist funktioniert der obige Code und test welches ein double ist wird ordentlich in ein string gewandelt und über die uart ausgegeben. Jetzt nehme ich die selben Quelldateien und lege einfach nur ein AVR Studio projekt damit an. Das Avr Studio macht sich ja dann sein eigenes makefile und der Code funktioniert nicht mehr. Was mache ich falsch?
Geh mal im AVR Studio auf "Project" "Configuration Options" Im Dialog wählst in der linken Spalte aus: "Libraries" Da sind sie alle.
Danach gehst du dann noch in die allgemeinen Optionen und fügst als Linkeroption hinzu -Wl,-u,vfprintf Keine Ahnung, warum AVR Studio das nicht bequemer für den Benutzer zugänglich gemacht hat... Gleichfalls für -lm (libm.a), die sollten sie einfach mal immer mit linken (ja, du auf jeden Fall, micro1!).
@Jörg Wunsch Warum ich auf jeden fall die libm mitlinken? Was macht die libm ?
> Warum ich auf jeden fall die libm mitlinken? Weil du sie für den korrekten Gleitkommacode auch dann brauchst, wenn du keine Funktionen aus <math.h> benutzen willst, siehe https://savannah.nongnu.org/bugs/?func=detailitem&item_id=3485 Wie geschrieben, diese Bibliothek sollte man einfach immer mit drin stehen haben -- wenn man nichts davon braucht, kostet es auch nichts. (So macht es übrigens das Template-Makefile von Mfile.)
Achso. Ok alles klar. Aber dann nochmal ne frage. Das was Karl Heinz Buchegger geschrieben hat das wies ich auch. Dort habe ich ja auch die libs hinzugefügt das reicht also nicht? Was bewrikt aber dann das hinzufügen unter dieser Option? Wenn das eh nichts bringt wozu ist dies dan da? Für irgenetwas muss das ja gut sein die Option oder? Ich muss also noch folgende Zeilen unter costum option hinzufügen? -Wl,-u,vfprintf // fpr printf float lib -lm // für libm oder?
> das reicht also nicht? Ja, das reicht (leider) nicht. Konnte Karl Heinz nicht wissen. > Was bewrikt aber dann das hinzufügen unter dieser Option? > Wenn das eh nichts bringt wozu ist dies dan da? Du hast das falsch verstanden: du brauchst beides, die Bibliothek, die Karl Heinz erwähnt hat und die Option -u,vfprintf. > Ich muss also noch folgende Zeilen unter costum option hinzufügen? > -Wl,-u,vfprintf // fpr printf float lib Ja, die als custom linker option. Sie bewirkt, dass der Linker das Symbol vfprintf als undefiniert auf die Reise gegeben bekommt, sodass er es aus einer Bibliothek auflösen muss. Die -lprintf_flt Option dann benennt die Bibliothek, in der sich die Gleitkomma- Version der Routine vfprintf() befindet, und da das Symbol vorher explizit als undefiniert festgelegt worden ist, wird es in diesem Moment und aus dieser Bibliothek gelinkt. Das -Wl,-u,vfprintf brauchst du lediglich dann nicht, wenn du in deiner Applikation vfprintf() selbst aufrufst (dann bewirkt die Referenz aus deiner Applikation bereits dasselbe). Es ist nämlich lediglich diese Funktion, die sich zwischen den drei Implementie- rungsvarianten unterscheidet, alle anderen Funktionen der printf- Familie greifen auf diese Funktion zurück. Wenn du nun die Option -Wl,-u,vfprintf nicht angegeben hast und deine Applikation z. B. printf() benutzt, dann passiert folgendes: . Der Linker hat das Symbol printf als undef markiert bekommen. . Die Bibliothek libprintf_flt.a wird verarbeitet; sie bietet lediglich das Symbol vfprintf, das ist aber im Moment gar nicht gefragt, also wird aus dieser Bibliothek nichts gelinkt . Die Standardbibliothek (libc.a) wird verarbeitet. Sie löst das gefragte Symbol printf auf, wobei das Linken des ent- sprechenden Objektmoduls einen neuen undef für vfprintf erzeugt. Der Linker hat jetzt aber schon lange vergessen, dass libprintf_flt.a dafür eine Auflösung hätte, aber libc.a hat ja ebenfalls eine (die Standardvariante ohne Gleitkomma): also wird diese jetzt gelinkt. . Das Ergebnis ist dann so, als hättest du -lprintf_flt gar nicht angegeben. Mittlerweile ist mir ein besserer Trick eingefallen, mit dem man diese Krücke nicht mehr braucht (libprintf_flt und libprintf_min müssen einfach die anderen Module der Familie ebenfalls nochmal mit aufnehmen), aber das muss ich erstmal implementieren. > -lm // für libm Das musst du nicht unbedingt als custom option angeben, hier kannst du auch die normale Bibliotheksauswahl von AVR Studio benutzen. Kommt auf das gleiche raus.
Ok. Allesklar das werde ich morgen ausprbieren und schauen ob es dann funktioniert. Wenn nicht werde ich einfach nicht mehr mit dem AVR Studio areiten sondern wieder auf das mfile creater zurückgriefen und mit einem beliebigem editor programmieren. Dann funktioniert alles auch wieder. Es ist halt nur schon alles direkt im AVR Studio machen zu können.
Ich glaube, du kannst AVR Studio auch sagen, dass du dein Makefile extern erstellst. Kenn mich da aber nicht aus, ich hab' kein Windows und finde AVR Studio ziemlich gruselig zu bedienen.
Schade funktioniert nicht. folgende fehlermeldung avr-gcc.exe: -u: linker input file unused because linking not done avr-gcc.exe: vfprintf: linker input file unused because linking not done
Du musst das ganze in den Linker Options eintragen! Das ist von Atmel etwas verwirrend gemacht worden, geb ich zu. Im Configuration Options Dialog: Custom Options auswählen. Im linken der beiden Listboxen den Eintrag '[Linker Options] selektieren. Jetzt die geforderten Einträge hinzufügen
Dann hast du irgendwas vermasselt. Hier ist das Log, wenn es richtig funktioniert (leider umgebrochen im Forum) rm -rf x.o x.elf dep/ x.hex x.eep Build succeeded with 0 Warnings... avr-gcc -mmcu=atmega8 -Wall -gdwarf-2 -O0 -funsigned-char \ -funsigned-bitfields -fpack-struct -fshort-enums \ -Wp,-M,-MP,-MT,x.o,-MF,dep/x.o.d -c ../x.c -o x.o avr-gcc -mmcu=atmega8 -Wl,-u,vfprintf x.o -lprintf_flt -lm \ -o x.elf avr-objcopy -O ihex -R .eeprom x.elf x.hex avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex x.elf x.eep Build succeeded with 0 Warnings... Bist du dir sicher, dass du die custom option korrekt angebracht hast, keine Leerzeichen zu viel drin?
@Karl Das könnte es sein. Ich habe es nämlich in den Optionen für alles eingetragen. Das Feld wo die Linker kommandos eingetragen sind ist ler. Ich werde es mal ausprobieren.
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.