W związku z dość częstym pytaniem, które pojawia się w mailach i nie tylko postanowiłem napisać ten krótki mini poradnik do kącika Eclipse na moim blogu ;) O co chodzi? Często spotykam się bowiem z takim pytaniem:
"mam problem z funkcją sprintf zamiast liczby float na wyświetlaczu pojawia mi się znak ?"
no to proszę - oto nadlatują posiłki z pomocą ;) Wystarczy tylko dodać kilka prostych ustawień do toolchaina dla projektu, w którym chcemy wykorzystywać wyświetlanie czy obsługę liczb float. Pokażę to najlepiej chyba na przykładzie screenshotów poniżej:
1. Krok PIERWSZY w opcjach Linkera - "general" musimy dodać następujący wpis
-Wl,-u,vfprintf
2. Krok DRUGI w opcjach Linkera - "Libraries" należy dodać dwie biblioteki które mają się nam dodatkowo kompilować w celu poprawnej obsługi wyświetlania liczb float. Chodzi o biblioteki:
- libm.a
- libprintf_flt.a
jednak w ustawieniach podajemy same nazwy bez rozszerzenia *.a i do tego bez przedrostka lib* - dokładnie jak na dwóch poniższych screnach:
i to wszystko ;) po bólu - teraz już można zrobić ew w projekcie opcję CLEAN potem ponownie BUILD i hulaj dusza - wszystko zacznie normalnie działać - chociaż poczujemy że pamięci Flash nam ubyło po kompilacji ;)
powodzenia
Albo zawsze można spróbować użyć funkcji: gcvt(...); Pozdrawiam, Lukasz
OdpowiedzUsuńMoże to pytanie będzie śmieszne ale w myśl zasady kto pyta nie błądzi. Czy ja te biblioteki muszę jeszcze dodatkowo pobrać? Mi cały czas wywala błąd:
OdpowiedzUsuń../main.c:33: warning: implicit declaration of function 'sprintf'
../main.c:33: warning: incompatible implicit declaration of built-in function 'sprintf'
../main.c:33: warning: format '%1.3f' expects type 'double', but argument 3 has type 'float'
I nie wiem co może być tego przyczyną.
pobierać nic nie musisz ale załadować plik nagłówkowy to chyba wiesz że trzeba ?
Usuńhttp://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html
takie pytania jak chcesz dobrej pomocy to zadawaj na naszym forum
www.forum.atnel.pl
bo tutaj nie ma jak na takie rzeczy szczegółowo odpowiadać. A tam pokażesz np swój kod itp - zapraszam
Chętnie tam zajrzę :) A może mi Pan jeszcze tak na szybko powiedzieć jaki dokładnie ma to być plik nagłówkowy?
OdpowiedzUsuńdobra nie było tego pytania:)
UsuńA czy te ustawienia mają wpływ na projekty ,gdzie nie korzystamy z funkcji printf ,chodzi mi o to ,że grzebiemy w ustawieniach Eclipsa ,więc czy potem trzeba przywrócić ustawienia domyślne ,gdy nie korzystamy ?
OdpowiedzUsuńPanie kolego ale TE ustawienia dotyczą jak widać tylko danego projektu w Eclipse a nie ustawień globalnych dla całego Eclipsa
UsuńCo to za magia, że po użyciu opcji opisanych w tym wpisie użycie pamięci na dane zmniejszyło się o 15%?! :O Było 85% a teraz mam 70%!
OdpowiedzUsuńZrobiłem wszystko tak jak zostało to opisane w powyższym poradniku a mimo to wyskakuje mi taki błąd przy kompilacji:
OdpowiedzUsuń13:26:55 **** Incremental Build of configuration Release for project ledzik ****
make all
Building target: ledzik.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,ledzik.map -Wl,-u,vfprintf -L"C:\WinAVR-20100110\avr\lib" -mmcu=atmega8a -o "ledzik.elf" ./LED/HD44780.o ./main.o -lm -lprintf_flt
C:\WinAVR-20100110\avr\lib\libprintf_flt.a(vfprintf_flt.o): In function `vfprintf':
(.text.avr-libc+0xfe): undefined reference to `__mulhi3'
C:\WinAVR-20100110\avr\lib\libprintf_flt.a(vfprintf_flt.o): In function `vfprintf':
(.text.avr-libc+0x10e): undefined reference to `__mulhi3'
collect2.exe: error: ld returned 1 exit status
make: *** [ledzik.elf] Błąd 1
13:26:55 Build Finished (took 236ms)
dlaczego? :(
Ok problem rozwiązany, jednak po dogłębnej analizie wszystkiego stwierdziłem że nie dokońca robiłem to według poradnika ^^'
UsuńPrzedtem korzystałem z innego poradnika i w okienku libraries path przy punkcie 2 podałem ścieżkę do bibliotek które były gdzieś tam na dysku C:.
Pan Mirek o tym nie wspomina ale na screenach wyraźnie widać że nie podaje tej ścieżki, to znaczy że biblioteki musiał mieć zaimportowane bezpośrednio do projektu.
Tak też zrobiłem i... działa :D
Pozdrawiam
Dziękuję Mirku.
OdpowiedzUsuńTeż nie chciała mi działać funkcja drukowania liczb float, a dzięki Twojemu poradnikowi działa już prawidłowo.
Jednakże chciałbym przestrzec takich jak ja, którzy zawsze po przecinku stawiają SPACJĘ, że w przypadku wpisu "-Wl,-u,vfprintf" nie może być spacji po przecinkach, gdyż podczas kompilacji pojawia się błąd linkera "ERROR 1".