Mały problem z C... (AVR)
Masz problem? Zapytaj na forum elektroda.pl
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 15:44:21 +0200
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);
};
From: =?ISO-8859-2?Q?Ania_i_Grze=B6?= <brak_at_nospam_maila.pl>
Subject: Re: =?ISO-8859-2?Q?Ma=B3y_problem_z_C=2E=2E=2E_=28AVR=29?=
Date: Thu, 05 May 2005 16:39:30 +0200
Dnia 2005-05-05 15:44, Krzysztof napisał(a):
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();
Wydaje mi sie, ze w tym miejscu wynik zwracany przez funkcje 'oblicz()'
powinien byc gdzies zapisywany, a nie tak sobie pozostawione..
--
Pozdrawiam, Ania i Grzes (Od 26.12.2004 mąż i żona)
- Żwirek kręci z Muchomorkiem!?
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: =?ISO-8859-2?Q?Ma=B3y_problem_z_C=2E=2E=2E_=28AVR=29?=
Date: Thu, 05 May 2005 16:43:33 +0200
Krzysztof napisał(a):
Dlaczego poniższy programik nie chcę się kompilować? Program
ma do zmiennej b wpisywać obliczoną wartość sinusa.
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.
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 16:58:03 +0200
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));
};
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 17:06:56 +0200
Thu, 5 May 2005 16:58:03 +0200, na pl.misc.elektronika, Krzysztof
napisał(a):
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" "
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.
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...
x = sin(0.312);
x = oblicz();
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.
--
Pozdrowienia
Jurek Szczesiul
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 18:00:45 +0200
To już wiadomo - linker nie znajduje funkcji sin().
Potrzebne wspomniane już dolinkowanie biblioteki libm.a
Faktycznie, pomogło.
A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?
Pzdr.
Krzysztof.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 05 May 2005 18:10:56 +0200
On Thu, 5 May 2005 18:00:45 +0200, Krzysztof wrote:
To już wiadomo - linker nie znajduje funkcji sin().
Potrzebne wspomniane już dolinkowanie biblioteki libm.a
Faktycznie, pomogło.
A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?
W nim jest kod funcji sin(). I wielu innych.
J.
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 19:11:53 +0200
A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?
W nim jest kod funcji sin(). I wielu innych.
A nie w "math.h" ?
Pzdr.
K.
From: "Kurciok" <kurciok_at_nospam_poczta.BEZSPAMUonet.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 5 May 2005 19:22:15 +0200
A nie w "math.h" ?
Wiesz co to biblioteka ? libm.a to coś w rodzaju biblioteki plik math.h to
tylko opis tego co znajduje się w tej bibliotece.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: Mały problem z C... (AVR)
Date: Thu, 05 May 2005 20:47:50 +0200
On Thu, 5 May 2005 19:11:53 +0200, Krzysztof wrote:
A tak na marginesie, to do czego jest potrzebny ten plik "libm.a" ?
W nim jest kod funcji sin(). I wielu innych.
A nie w "math.h" ?
Zajrzyj do math.h.
J.
From: "Krzysztof" <krzysztof.gedroycWYTNIJ_TO_at_nospam_wp.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Thu, 5 May 2005 21:38:38 +0200
Zajrzyj do math.h.
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.
From: "Kurciok" <kurciok_at_nospam_poczta.BEZSPAMUonet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Thu, 5 May 2005 22:25:06 +0200
Zajrzyj do math.h.
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...?
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ę.
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Thu, 05 May 2005 22:49:27 +0200
On Thu, 5 May 2005 22:25:06 +0200, Kurciok wrote:
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)
Zle ci sie wydaje.
J.
From: "Kurciok" <kurciok_at_nospam_poczta.BEZSPAMUonet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 6 May 2005 09:52:23 +0200
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)
Zle ci sie wydaje.
A no to wytłumacz :)
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 06 May 2005 11:12:21 +0200
On Fri, 6 May 2005 09:52:23 +0200, Kurciok wrote:
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)
Zle ci sie wydaje.
A no to wytłumacz :)
biblioteka zawiera kod na konkretny typ.
J.
From: "Kurciok" <kurciok_at_nospam_poczta.BEZSPAMUonet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 6 May 2005 11:44:37 +0200
biblioteka zawiera kod na konkretny typ.
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
From: J.F. <jfox_xnospamx_at_nospam_poczta.onet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 06 May 2005 15:29:59 +0200
On Fri, 6 May 2005 11:44:37 +0200, Kurciok wrote:
biblioteka zawiera kod na konkretny typ.
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.
Nie mowie nie .. ale tam moze byc sporo funkcji.
A może się mylę ;-) i po prostu wszystkie atmele mają taki sam asembler, także
pasuje do nich jedna bibliteka ?
Wszystkie AVR maja podobny, bo atmel robi jeszcze calkiem inne :-)
J.
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 06 May 2005 16:58:11 +0200
Kurciok napisał(a):
No właśnie też tak myślałem, tylko zmieniłem zdanie bo jest tylko jedna
bibliteka libm.a, a uC jest parę. (...)
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.
From: "Kurciok" <kurciok_at_nospam_poczta.BEZSPAMUonet.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 6 May 2005 21:26:40 +0200
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.
No niby są ale coś mi się wydaje że te katalogi avr3,avr4 nie odnoszą się do
kolejnych rodzin. Bo mikrokontrolery w nich się powtarzają. Nie są to czasem
jakiś unowocześnione wersje bibliotek ?
From: Wojtek Kaniewski <wojtekka_at_nospam_SPAM.SPAM.SPAM>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 06 May 2005 23:26:30 +0200
Kurciok napisał(a):
No niby są ale coś mi się wydaje że te katalogi avr3,avr4 nie odnoszą się do
kolejnych rodzin. Bo mikrokontrolery w nich się powtarzają.
mógłbyś podać jakieś przykłady?
Nie są to czasem jakiś unowocześnione wersje bibliotek ?
nie. http://www.nongnu.org/avr-libc/user-manual/using_tools.html
w.
From: Adam Dybkowski <adybkows123_at_nospam_amwaw.edu.pl>
Subject: Re: Maly problem z C... (AVR)
Date: Fri, 06 May 2005 23:49:06 +0200
Kurciok wrote:
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.
No niby są ale coś mi się wydaje że te katalogi avr3,avr4 nie odnoszą się do
kolejnych rodzin. Bo mikrokontrolery w nich się powtarzają. Nie są to czasem
jakiś unowocześnione wersje bibliotek ?
Po przejrzeniu tych tabelek sprawa się wyjaśni:
http://www.nongnu.org/avr-libc/user-manual/using_tools.html
--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/
Uwaga: przed wysłaniem do mnie maila usuń "123" z adresu.
From: Michal <mi15_at_nospam_poczta.onet.pl>
Subject: Re: =?iso-8859-2?Q?Ma=B3y?= problem z C... (AVR)
Date: Thu, 5 May 2005 23:43:44 +0200
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...
x = sin(0.312);
x = oblicz();
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.
Witam
Jezeli mozna to prosze o troche informacji na temat kiedy trzeba uzywac
zmiennych volatile i dlaczego?? chodzi oczywiscie o AVRy
From: Jurek Szczesiul <jerzy.szczesiul_at_nospam_wycin.ep.com.pl>
Subject: Re: =?iso-8859-2?Q?Ma=B3y?= problem z C... (AVR)
Date: Fri, 6 May 2005 01:35:19 +0200
Thu, 5 May 2005 23:43:44 +0200, na pl.misc.elektronika, Michal napisał(a):
Jezeli mozna to prosze o troche informacji na temat kiedy trzeba uzywac
zmiennych volatile i dlaczego?? chodzi oczywiscie o AVRy
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 )
--
Pozdrowienia
Jurek Szczesiul
From: Michal <mi15_at_nospam_poczta.onet.pl>
Subject: Re: =?iso-8859-2?Q?Ma=B3y?= problem z C... (AVR)
Date: Fri, 6 May 2005 20:36:56 +0200
Dnia Fri, 6 May 2005 01:35:19 +0200, Jurek Szczesiul napisał(a):
Thu, 5 May 2005 23:43:44 +0200, na pl.misc.elektronika, Michal napisał(a):
Jezeli mozna to prosze o troche informacji na temat kiedy trzeba uzywac
zmiennych volatile i dlaczego?? chodzi oczywiscie o AVRy
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 )
OK! teraz rozumiem, no i musze poprawic pare moich programikow :) bo nigdy
nie uzywalem zmiennych volataile.
Wielkie dzieki za zrozumiale wyjasnienie.
pozdrawiam Michal