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

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); };

Reply to
Krzysztof
Loading thread data ...

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..

Reply to
Ania i Grześ

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.

Reply to
Wojtek Kaniewski

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)); };

Reply to
Krzysztof

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.

Reply to
Jurek Szczesiul

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

Pzdr. Krzysztof.

Reply to
Krzysztof

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

J.

Reply to
J.F.

A nie w "math.h" ?

Pzdr. K.

Reply to
Krzysztof

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

Reply to
Kurciok

Zajrzyj do math.h.

J.

Reply to
J.F.

Zle ci sie wydaje.

J.

Reply to
J.F.

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

Reply to
Michal

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 )

Reply to
Jurek Szczesiul

biblioteka zawiera kod na konkretny typ.

J.

Reply to
J.F.

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

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

J.

Reply to
J.F.

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.

Reply to
Wojtek Kaniewski

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.