Forum: Compiler & IDEs AVR Studio und printfflt liberay


von micro1 (Gast)


Lesenswert?

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?

von Karl heinz B. (kbucheg)


Lesenswert?

Geh mal im AVR Studio auf

"Project" "Configuration Options"

Im Dialog wählst in der linken Spalte aus: "Libraries"

Da sind sie alle.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von micro1 (Gast)


Lesenswert?

@Jörg Wunsch

Warum ich auf jeden fall die libm mitlinken?

Was macht die libm ?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von micro1 (Gast)


Lesenswert?

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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von micro1 (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von micro1 (Gast)


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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?

von micro1 (Gast)


Lesenswert?

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