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



Masz problem? Zapytaj na forum elektroda.pl

Poprzedni Następny
Wiadomość
Spis treści
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);
};



Poprzedni Następny
Wiadomość
Spis treści
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!?

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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));
};



Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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.





Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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.



Poprzedni Następny
Wiadomość
Spis treści
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ę.



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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 :)



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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



Poprzedni Następny
Wiadomość
Spis treści
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.


Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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 ?



Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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.

Poprzedni Następny
Wiadomość
Spis treści
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

Poprzedni Następny
Wiadomość
Spis treści
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;

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

Poprzedni Następny
Wiadomość
Spis treści
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