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); };
Didn't find your answer? Ask the community — no account required.
A
Ania i Grześ
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..
W
Wojtek Kaniewski
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.
K
Krzysztof
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)); };
J
Jurek Szczesiul
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.
K
Krzysztof
Faktycznie, pomogło. A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?
Pzdr. Krzysztof.
J
J.F.
W nim jest kod funcji sin(). I wielu innych.
J.
K
Krzysztof
A nie w "math.h" ?
Pzdr. K.
K
Kurciok
Wiesz co to biblioteka ? libm.a to coś w rodzaju biblioteki plik math.h to tylko opis tego co znajduje się w tej bibliotece.
J
J.F.
Zajrzyj do math.h.
J.
K
Krzysztof
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.
K
Kurciok
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ê.
J
J.F.
Zle ci sie wydaje.
J.
M
Michal
Witam Jezeli mozna to prosze o troche informacji na temat kiedy trzeba uzywac zmiennych volatile i dlaczego?? chodzi oczywiscie o AVRy
J
Jurek Szczesiul
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 )
K
Kurciok
A no to wyt³umacz :)
J
J.F.
biblioteka zawiera kod na konkretny typ.
J.
K
Kurciok
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
J
J.F.
Nie mowie nie .. ale tam moze byc sporo funkcji.
Wszystkie AVR maja podobny, bo atmel robi jeszcze calkiem inne :-)
J.
W
Wojtek Kaniewski
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
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.