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