mikrocontroller.net

Forum: Compiler & IDEs AVR Studio und printfflt liberay


Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geh mal im AVR Studio auf

"Project" "Configuration Options"

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

Da sind sie alle.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!).

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg Wunsch

Warum ich auf jeden fall die libm mitlinken?

Was macht die libm ?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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&...

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

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: micro1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.