Ads_700x200

środa, 3 kwietnia 2013

Eclipse - nie działa mi printf dla float

Witam,

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


11 komentarzy:

  1. Albo zawsze można spróbować użyć funkcji: gcvt(...); Pozdrawiam, Lukasz

    OdpowiedzUsuń
  2. 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:
    ../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ą.

    OdpowiedzUsuń
    Odpowiedzi
    1. pobierać nic nie musisz ale załadować plik nagłówkowy to chyba wiesz że trzeba ?

      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

      Usuń
  3. Chętnie tam zajrzę :) A może mi Pan jeszcze tak na szybko powiedzieć jaki dokładnie ma to być plik nagłówkowy?

    OdpowiedzUsuń
  4. 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ń
    Odpowiedzi
    1. Panie kolego ale TE ustawienia dotyczą jak widać tylko danego projektu w Eclipse a nie ustawień globalnych dla całego Eclipsa

      Usuń
  5. 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ń
  6. Zrobiłem wszystko tak jak zostało to opisane w powyższym poradniku a mimo to wyskakuje mi taki błąd przy kompilacji:

    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? :(

    OdpowiedzUsuń
    Odpowiedzi
    1. Ok problem rozwiązany, jednak po dogłębnej analizie wszystkiego stwierdziłem że nie dokońca robiłem to według poradnika ^^'

      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

      Usuń
  7. Dziękuję Mirku.
    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".

    OdpowiedzUsuń