Forum: Compiler & IDEs AVRStudio printf float problem


von mario (Gast)


Lesenswert?

Hallo,

ich weiß das Thema wurde schon ein paar mal diskutiert, aber:
ich habe nach Artikel:

http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

die Unterstützung von float-Ausgabe eingeschaltet, es funktioniert aber 
nicht (Es wird "LT3582 vcat = ?V" angezeigt),z.B.
1
double volt=4.8;
2
3
printf("\r\nLT3582 vcat = %5.2fV", volt);
funktioniert nicht.

Der Workaround:
1
double volt=4.8;
2
char buf[10];
3
4
dtostrf(volt, 5, 2, buf);
5
printf("\r\nLT3582 vcat = %sV", buf);
funkioniert aber.

Scheinbar hat das Linken nicht geklappt, kann man das irgednwie 
nachprüfen?
Irgendwelche Ideen warum es nicht geht.

von Karl H. (kbuchegg)


Lesenswert?

mario schrieb:

> Scheinbar hat das Linken nicht geklappt, kann man das irgednwie
> nachprüfen?


Im AVR-Studio wird im Output Fenster mitprotokolliert, was die einzelnen 
'Erstellungsschritte' machen und mit welchen Argumenten sie aufgerufen 
wurden.
Mach einen Screenshot davon und poste ihn (Bei einem Rebuild all). Dann 
kann man hier mal durchsehen, welchen Schalter du vergessen hast.

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


Lesenswert?

Karl heinz Buchegger schrieb:
> Mach einen Screenshot davon

Besser noch: ein Logfile erzeugen.  Kann AVR Studio das irgendwie?
Ansonsten müsste man sich mit copy&paste über einen Texteditor
behelfen.

von mario (Gast)


Lesenswert?

Hier ist der output:

Build started 10.2.2010 at 16:41:46
avr-gcc  -mmcu=atmega644p -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct 
-fshort-enums -MD -MP -MT main.o -MF dep/main.o.d  -c  ../main.c
../main.c: In function 'main':
../main.c:11: warning: unused variable 'i'
avr-gcc  -mmcu=atmega644p -Wall -gdwarf-2 -std=gnu99 
-DF_CPU=1000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct 
-fshort-enums -MD -MP -MT TWI_Master.o -MF dep/TWI_Master.o.d  -c 
../TWI_Master.c
../TWI_Master.c: In function 'TWIM_Init':
../TWI_Master.c:11: warning: unused variable 'i'
avr-gcc -mmcu=atmega644p -Wl,-u,-vfprintf  -Wl,-Map=Peripherie-Board.map 
main.o uart_ext.o uart.o I2C_Slave_Handler.o TWI_Slave.o TWI_Master.o 
ADC.o OLED.o LT3582.o    -lprintf_flt -lm  -o Peripherie-Board.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
Peripherie-Board.elf Peripherie-Board.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
Peripherie-Board.elf Peripherie-Board.eep || exit 0
avr-objdump -h -S Peripherie-Board.elf > Peripherie-Board.lss

AVR Memory Usage
----------------
Device: atmega644p

Program:   17496 bytes (26.7% Full)
(.text + .data + .bootloader)

Data:       1077 bytes (26.3% Full)
(.data + .bss + .noinit)


Build succeeded with 2 Warnings...

Wie man erkennen kann, werden die Linkeroption "-Wl,-u,-vfprintf" und 
die libraries "-lprintf_flt" und "-lm" eingebunden...

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


Lesenswert?

Und du hast das aktuelle Image auch wirklich noch einmal geflasht?

von mario (Gast)


Lesenswert?

Ja, mehrmals sogar.

Mich hat auch ein bischen gewundert, dass das binary nach dem einbinden 
der float libraries nicht größer geworden ist.

von Karl H. (kbuchegg)


Lesenswert?

mario schrieb:

> Mich hat auch ein bischen gewundert, dass das binary nach dem einbinden
> der float libraries nicht größer geworden ist.

Hmm.
Das klingt nicht gut.
Hast du das debug Verzeichnis schon einmal komplett gelöscht?

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


Lesenswert?

Vielleicht ist deine Installation auch zerschossen.  Wenn er kein
vfprintf in libprintf_flt.a findet, dann beklagt er sich über nichts,
sondern macht einfach weiter und findet dann ein vfprintf in der
libc.a (allerdings halt das ohne FP-Unterstützung).

von mario (Gast)


Lesenswert?

Gut ich werde mal das winavr komplett neu installieren, aber erst morgen 
(Feierabend muß auch mal sein... :)

Ich poste morgen nochmal

Gruss
Mario

von Matthias K. (matthiask)


Lesenswert?

Libraries einbinden:
libprintf_flt.a
libm.a

Custom Options (Linker Options):
-Wl,-u,vfprintf -lprintf_flt

Float mit sprintf ausgeben klappt bei mir damit.

von Rolf M. (rmagnus)


Lesenswert?

Matthias K. schrieb:
> Libraries einbinden:
> libprintf_flt.a
> libm.a
>
> Custom Options (Linker Options):
> -Wl,-u,vfprintf -lprintf_flt

mario schrieb:
> Wie man erkennen kann, werden die Linkeroption "-Wl,-u,-vfprintf" und
> die libraries "-lprintf_flt" und "-lm" eingebunden...

von Klaus W. (mfgkw)


Lesenswert?

> Datum: 10.02.2010 17:29
...
> (Feierabend muß auch mal sein... :)

Was für eine Arbeitshaltung ist das denn????????????
Öffentlicher Dienst?

von Rolf Magnus (Gast)


Lesenswert?

Klaus Wachtler schrieb:
> Was für eine Arbeitshaltung ist das denn????????????

http://sockenseite.de/__oneclick_uploads/2006/10/ausruf.html

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.