logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

3 problemy ( sinus,kompilacja,nowyprojekt) AVR Atmega

edzioedzio55 18 Lut 2011 00:31 2017 4
  • #1 9167055
    edzioedzio55
    Poziom 10  
    No więc szukam i mecze się od paru dni mam : następujące problemy

    1. Projekt, gdy użyje polecenia
    wynik=sin(4.822);


    kompilator się kompiluje natomiast gdy napiszę
    float abc=2.345;
    wynik=sin(abc);


    się nie kompiluje i wyskakuje komunikat

    c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5libc.a(fp_powsodd.o): In function `__fp_powsodd':
    (.text.fplib+0x10): relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/avr5libgcc.a(_mul_sf.o)
    c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr5libc.a(fp_powsodd.o): In function `__fp_powsodd':
    (.text.fplib+0x20): relocation truncated to fit: R_AVR_13_PCREL against symbol `__mulsf3' defined in .text section in c:/winavr-20081205/bin/../lib/gcc/avr/4.3.2/avr5libgcc.a(_mul_sf.o)
    make: *** [sumo.elf] Error 1
    Build failed with 1 errors and 0 warnings...
    


    nie wiem w czym jest problem dodam tylko ze takie polecenia się normalnie kompilując w Dev C++

    Z tego co znalazłem w pdf do avr-lib-user-manual piszą choć nie rozumiem co cytuje str 61.

    "11.3 I get "undefined reference to..." for functions like "sin()"
    In order to access the mathematical functions that are declared in <math.h>, the
    linker needs to be told to also link the mathematical library, libm.a.
    Typically, system libraries like libm.a are given to the final C compiler command
    line that performs the linking step by adding a flag -lm at the end. (That is, the initial
    lib and the filename suffix from the library are written immediately after a -l flag. So
    for a libfoo.a library, -lfoo needs to be provided.) This will make the linker
    search the library in a path known to the system.
    An alternative would be to specify the full path to the libm.a file at the same place
    on the command line, i. e. after all the object files (.o). However, since this requires
    knowledge of where the build system will exactly find those library files, this is
    deprecated for system libraries.
    Back to FAQ Index."

    2.
    Problem drogi polega na tym, że mając jakąś pętle do opóźnienia czasowego powiedzmy taką
    void wait(unsigned char pt)
    {
    	 unsigned char tp1;
    
     	 for(;pt>0;pt--)
     	 {
      	 	for(tp1 = 255; tp1 != 0; tp1--) ;
     	 }
    }

    to nie kiedy avr studio mi to pomija jakby "skapował" się ze jest to nie produktywne działanie. To znaczy gdy tworzy swój plik makefile to tak właśnie pomija gdy korzystam z tych "dobry" podmienianych projektów to nie pomija. Problem może rozwiązać np coś takiego:
    void wait(unsigned char pt)
    {
    	 unsigned char tp1;
    
     	 for(;pt>0;pt--)
     	 {
      	 	for(tp1 = 255; tp1 != 0; tp1--) asm("nop");
    
     	 }
    }

    od czego to zależy ?;
    3.
    Najważniejsze napisałem już kilka projektów ale nadal nie umiem stworzyć nowego projektu. Omijałem to poprzez kopiowanie jakieś przykładowego programu zachowując oryginalne nazewnictwo a zmieniając kod. Z tego co się doczytałem wiąże się to z plikiem makfile, który podobno jest generowany automatycznie przez avr studio. Próbowałem nawet sam tworzyć taki plik przy pomocy winAvr->mfile zgodnie np z tym kursem ale taki plik też mi zwykle nie chciał działać http://kursc.dioda.com.pl/str001.html.
    Powiem tak mam makefile do atmegi 8 i 32 ale nie długo mam zamiar napisać coś na inny i będę miał problem ze stworzeniem dobrego makefile. Więc ktoś może mi w końcu wytłumaczy jak się to robi.?
    Odrazu powiem odwiedziłem te linki:
    https://www.elektroda.pl/rtvforum/topic1059204.html
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=77409


    4. Zapytam przy okazji jeszcze o jedną kwestię
    jak skowertować liczbę we floadzie do tablicy charów z kropką.
    podobno można to zrobić dodając do linkera (-Wl,-u,vfprintf,-lprintf_flt,-lm)ale mi to nie dział (może źle to robie)? Dlatego też napisałem swoją funkcje która przerabia floata na tablice charów ale jest bardzo dułga. i nie optymalna. Jednakże interesował bym mnie jak to zrobić lepiej.
  • #2 9167285
    ginar
    Poziom 21  
    ad2.
    Cytat:
    To znaczy gdy tworzy swój plik makefile to tak właśnie pomija gdy korzystam z tych "dobry" podmienianych projektów to nie pomija.

    Prawdopodobnie w jednym z makefil'ów jest włączona optymalizacja
    Zwróć uwagę na takie słowa kluczowe w pliku jak:
    -Os ; -O0; O1; O2; oznaczają one stopień optymalizacji kodu

    ad3.
    Sporo osób (ja również) używają środowiska Eclipse (ze specjalną wtyczką do AVR) jako edytora. Makefile jest generowany automatycznie a jego opcje ustawia się w odpowiednich zakładkach. Sprawdzając na domyślnych ustawieniach - nie mam takiego problemu jak w ad1.
    ad4.
    Można tak:
    Cytat:
    int sprintf ( char * str, const char * format, ... );


    dla przykładu:
    float fMyFloat=3.14;
    char cBufferr[10];
    sprintf ( cBufferr, %f, fMyFloat);

    http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/
  • #3 9167333
    tmf
    VIP Zasłużony dla elektroda
    ad 1. Jak słusznie się domyślasz trzeba włączyć <math.h> i całość zlinkować z libm.a. Bibliotekę dodasz w opcjach projektu AVR Studio.
    ad 2. Winę ponosi optymalizacja. Twój drugi przykład też nie zadziała, trzeba zrobic volatile asm. A najlepiej tak nie robic, tylko skorzystać z delay.h.
    ad 3. Jak masz zainstalowane WinAVR albo atmelowy toolchain to po włączeniu AVR Studio dajesz new project i już.
    ad 4. Skonwertować możesz przy pomocy sprintf, koniecznie podając parametry wywołąnia linkera, które umieściłeś w poście.
    A ogólnie to polecam (autoreklama):
    http://helion.pl/ksiazki/jezyk_c_dla_mikrokon...nsowanych_aplikacji_tomasz_francuz,jcmikr.htm
  • #4 9169472
    edzioedzio55
    Poziom 10  
    Dzięki za odpowiedź.
    Aprori rzecz wygląda tak.
    Cytat:
    Prawdopodobnie w jednym z makefil'ów jest włączona optymalizacja
    Zwróć uwagę na takie słowa kluczowe w pliku jak:
    -Os ; -O0; O1; O2; oznaczają one stopień optymalizacji kodu

    rzeczywiscie coś w tym jest, dzięki.:D
    ad3.
    Sporo osób (ja również) używają środowiska Eclipse (ze specjalną wtyczką do AVR) jako edytora. Makefile jest generowany automatycznie a jego opcje ustawia się w odpowiednich zakładkach. Sprawdzając na domyślnych ustawieniach - nie mam takiego problemu jak w ad1. 

    Brzmi kusząco prawdopodobnie pomyśle tym również. Po za tym twierdzisz, że rozwiąże to problem sinusa co zdecydowanie nakręca.

    Cytat:

    ad 1. Jak słusznie się domyślasz trzeba włączyć <math.h> i całość zlinkować z libm.a. Bibliotekę dodasz w opcjach projektu AVR Studio.

    no dobrze problem polega na tym, proszę ja ciebie, że nie wiem jak to wpisać. Robiłem tak project->configuration options->Custom options i w tym małym okienku wpisałem libm.a i dalem add, nie pomogło wpisałem -lm też nie pomogło powiedz co konkretnie mam tam wpisać. Dodam tylko ze w programie mam załączoną bibliotekę <math.h>

    Słusznie przyjaciele
    Cytat:
    float fMyFloat=3.14;
    char cBufferr[10];
    sprintf ( cBufferr, %f, fMyFloat);
    ta funkcja jest ciekaw rzecz w tym ze nie działa na float'ty przynajmnie mi jakiś tam błąd wyskakiwał. Owszem działa na inty, long int, ale przy flotach napotykałem na opór.
  • #5 9169683
    tmf
    VIP Zasłużony dla elektroda
    Hmm, a nie zwróciła twojej uwagi w tym oknie zakładka Libraries? Wybierasz w niej libm.a i klikasz add library, nie brzmi to znajomo?
    Podobnie aby sprintf działało z float trzeba dodać libprintf i custom options zdefiniować podane wcześniej symbole linkera.
REKLAMA