Mały problem z C... (AVR)

May 05, 2005 23 Replies

Dlaczego poniższy programik nie chcę się kompilować? Program ma do zmiennej b wpisywać obliczoną wartość sinusa.


#include <avr/io.h>



#include <math.h>



float oblicz(void); int main(void) { oblicz(); return(0); };



float oblicz(void) { float a = 0.4363; float b = 0; b = sin (a); return (b); };



Dnia 2005-05-05 15:44, Krzysztof napisał(a):

Wydaje mi sie, ze w tym miejscu wynik zwracany przez funkcje 'oblicz()' powinien byc gdzies zapisywany, a nie tak sobie pozostawione..

Krzysztof napisał(a):

miło by było, gdybyś podał jaki błąd występuje przy kompilacji, ale zgaduję, że nie linkujesz programu wynikowego z biblioteką libm. bie wiem z jakiego środowiska korzystasz, więc powiem tylko, że do opcji gcc albo LDFLAGS trzeba dodać ,,-lm''.

w.

Korzystam z AVR-GCC + nakładka AVR-Side. Problem jest z funkcją sinus, tzn. wyświetla się błąd: "Program.c: 100: error - undefined reference to "sin" "

Co najdziwniejsze korzystanie z funkcji sinus w funkcji main jakoś się kompiluje (jeszcze nie sprawdzałem czy wynik jest poprawny), a w zewnętrznej funkji już nie...

Program z poprawkami wygląda tak:

#include <avr/io.h>

#include <math.h>

double a = 0.4363; double b = 0;

double oblicz(void); int main(void) { double x; x = sin(0.312); x = oblicz(); return(0); };

double oblicz(void) { return (sin(a)); };

Thu, 5 May 2005 16:58:03 +0200, na pl.misc.elektronika, Krzysztof napisał(a):

To już wiadomo - linker nie znajduje funkcji sin(). Potrzebne wspomniane już dolinkowanie biblioteki libm.a AvrSide zrobi to samodzielnie po zaznaczeniu checkboxa "dołącz libm.a" w opcjach linkera.

Poniważ x nie jest zadeklarowany jako volatile, optymalizator w ogóle nie wykonuje pierwszej operacji a od razu drugą - w ten sposób ustala od razu ostateczną wartość x bez wyliczania zbędnej pośredniej.

Faktycznie, pomogło. A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?

Pzdr. Krzysztof.

W nim jest kod funcji sin(). I wielu innych.

J.

A nie w "math.h" ?

Pzdr. K.

Wiesz co to biblioteka ? libm.a to coś w rodzaju biblioteki plik math.h to tylko opis tego co znajduje się w tej bibliotece.

No tak, tu jest tylko opis funkcji matematycznych (plik naglówkowy). To w pliku "libm.a" jest juz gotowy (skompilowany) kod innych funkcji stdio, io i innych...?

Pzdr. K.

stdio, io to akurat nie sa funkje :) no ale mniejsza z tym. a w libm.a s± tylko funkcje matematyczne (te których opis jest w math.h) i tak jak powiedzia³e¶ s± one skompilowane (ale z tego co mi siê wydaje nie na konkretny typ mikrokontrolera, to co¶ w stylu takiej kompilacji ogólnej) dopiero w procesie kompilacji twojego programu z tego libm.a zostanie zassane to co trzeba i skompiluje siê na odpowiedni mikrokontroler. A tego pliku nie w³±cza siê standardowo bo zajmuje do¶æ troche miejsca, pewnie zauwa¿y³e¶ ¿e jak do³±czy³e¶ ten plik to plik wynikowy powiêkszy³ siê do¶æ trochê.

Witam Jezeli mozna to prosze o troche informacji na temat kiedy trzeba uzywac zmiennych volatile i dlaczego?? chodzi oczywiscie o AVRy

Thu, 5 May 2005 23:43:44 +0200, na pl.misc.elektronika, Michal napisał(a):

volatile informuje optymalizator,żeby nie usuwać z kodu fragmentów dotyczących tak opisanej zmiennej chociaż mogłoby wyglądać, że można je pominąć bez wpływu na końcowy wynik. Szczególnie dotyczy to zmiennych globalnych modyfikowanych w przerwaniach - w avr-gcc bez volatile to nie działa w ogóle. Natomiast czasem używamy dla specyficznych własnych potrzeb, np. żeby edukacyjnie prześledzić jakieś przeliczenia itp.

Zrób eksperyment : int x;

x=1; x=2; x=3; x=4;

- powstanie kod ustawiający od razu x=4 ( przy włączonej optymalizacji )

Dla volatile int x; kod uwzględni wszystkie kolejne przypisania. ( BTW wszystkie SFR są z założenia volatile żeby uniknąć nieprzewidzianych efektów )

biblioteka zawiera kod na konkretny typ.

J.

No w³a¶nie te¿ tak my¶la³em, tylko zmieni³em zdanie bo jest tylko jedna bibliteka libm.a, a uC jest parê. Byæ mo¿e w tej bibliotece s± poporstu ró¿ne wersje funkcji na ró¿ne mikrokontrolery i dlatego zajmuje a¿ 40k. A mo¿e siê mylê ;-) i po prostu wszystkie atmele maj± taki sam asembler, tak¿e pasuje do nich jedna bibliteka ? Tylko dlaczego zajmuje ona a¿ 40k

Nie mowie nie .. ale tam moze byc sporo funkcji.

Wszystkie AVR maja podobny, bo atmel robi jeszcze calkiem inne :-)

J.

Kurciok napisał(a):

nie znalazłeś przypadkiem tej biblioteki w okolicy katalogów avr3, avr4, avr5? mam w tej chwili zainstalowaną avr-libc-1.0.4 i dla każdej rodziny avrów są osobne wersje bibliotek.

bo owszem, asembler jest ten sam, ale kod dla ATmega128 musi umieć zaadresować więcej niż 64kB pamięci, a biblioteki dla małych avrów muszą mnożenie robić programowo.

w.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required