Jak poprawnie używać zmiennych globalnych w AVRGCC z obsługą przerwań?
AVRGCC i zmienne globalne
From: "Rafał" <werkon_at_nospam_inetia.pl>
Subject: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 20:28:20 +0200
Witam.
Od bardzo niedawna zacząłem się tym bawić. No i (jak chyba prawie wszyscy)
już mam maluśki problemik :-)
Przykład programiku:
#include <io.h>
char zz;
SIGNAL(_jakieś przerwanie)
{
if(zz)
_coś_tam robie_;
}
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
I problem polega na tym, że:
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
- w obsłudze przerwania zawsze jej wartość jest "zero" - no bo main jej nie
zmienia.
Próbowałem chyba wszystkie optymalizacje (Os, O1, O2, O3) i efekt jest
zawsze ten sam.
Testowane na AVR STUDIO4 i w procku - efekt ten sam.
Czy trzeba ją jakoś specjalnie zadeklarować ja globalną?
W czym tu jest problem.
Dzięki za podpowiedzi.
Pzdrawiam.
========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!nnrpd.internetia.p
From: "Krzysztof Olesiejuk" <lopez_nospam_at_nospam_infomark.com.pl>
Subject: Re: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 20:44:30 +0200
Użytkownik "Rafał" <werkon_at_nospam_inetia.pl> napisał w wiadomości
news:11799-1053023313_at_nospam_as3-152.swic.dialup.inetia.pl...
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
- w obsłudze przerwania zawsze jej wartość jest "zero" - no bo main jej
nie
zmienia.
Próbowałem chyba wszystkie optymalizacje (Os, O1, O2, O3) i efekt jest
zawsze ten sam.
Nie wiem co robi Os, ale byc moze moze wylaczenie optymalizacji calkowicie
pomoze (-O0 chyba). Ale to nie jest rozwiazanie problemu.
Zmienna jest optymalizowana, poniewaz nie jest uzywana (wedlug kompilatora).
Rozsadny kompilator zoptymalizuje ciag instrukcji
a=0; a=1; a=2; jakas_funkcja(a);
dajac
a=2; jakas_funkcja(a);
Kompilator nie ma wiekszych szans na to, zeby domyslic sie, ze bedziesz
jeszcze gdzies oprocz programu korzystal z jej wartosci (konkretnie w
przerwaniach). Mozesz go o tym poinformowac slowem kluczowym volatile.
Pozdrawiam
Krzysiek
========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: Marcin E. Hamerla <Xmehamerla_at_nospam_Xpro.Xonet.Xpl.remove_X>
Subject: Re: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 20:44:33 +0200
Rafał napisal(a):
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
I problem polega na tym, że:
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
- w obsłudze przerwania zawsze jej wartość jest "zero" - no bo main jej nie
zmienia.
Próbowałem chyba wszystkie optymalizacje (Os, O1, O2, O3) i efekt jest
zawsze ten sam.
Testowane na AVR STUDIO4 i w procku - efekt ten sam.
Czy trzeba ją jakoś specjalnie zadeklarować ja globalną?
W czym tu jest problem.
Zamiast 0xFFFF wstaw na przyklad 30000 albo typ zmiennej L ustaw na
'unsigned int'.
--
Pozdrowienia, Marcin E. Hamerla
"Every day I make the world a little bit worse."
========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.gazeta.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Andy" <anok_at_nospam_ceti.pl>
Subject: Re: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 20:58:19 +0200
Użytkownik "Rafał" <werkon_at_nospam_inetia.pl> napisał w wiadomości
news:11799-1053023313_at_nospam_as3-152.swic.dialup.inetia.pl...
...
#include <io.h>
char zz;
SIGNAL(_jakieś przerwanie)
{
if(zz)
_coś_tam robie_;
}
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
I problem polega na tym, że:
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
- w obsłudze przerwania zawsze jej wartość jest "zero" - ...
sprobuj:
volatile char zz;
--
Andrzej
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mai
From: J.F. <jfox_at_nospam_poczta.onet.pl.nospam>
Subject: Re: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 22:15:09 +0200
On Thu, 15 May 2003 20:28:20 +0200, Rafał wrote:
char zz;
SIGNAL(_jakieś przerwanie)
{
if(zz)
_coś_tam robie_;
}
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
I problem polega na tym, że:
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
Zapewne chodzi o:
volatile char zz ;
to powinno wylaczyc wszelkie optymalizacje na tej zmiennej ..
Poza tym .. main ci sie blyskawicznie zakonczy ... co dalej ?
J.
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.internetia.pl!not-for-mai
From: "Rafał" <werkon_at_nospam_inetia.pl>
Subject: Re: AVRGCC i zmienne globalne
Date: Thu, 15 May 2003 23:47:35 +0200
Dzięki wszystkim.
Pomogło: volatile
Pozrawiam.
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai
From: "Przemyslaw W." <NaviPW_abc__at_nospam_interia.pl>
Subject: Re: AVRGCC i zmienne globalne
Date: Fri, 16 May 2003 20:21:18 +0200
Użytkownik "Rafał" <werkon_at_nospam_inetia.pl> napisał w wiadomości
news:11799-1053023313_at_nospam_as3-152.swic.dialup.inetia.pl...
Witam.
Od bardzo niedawna zacząłem się tym bawić. No i (jak chyba prawie wszyscy)
już mam maluśki problemik :-)
Przykład programiku:
#include <io.h>
char zz;
SIGNAL(_jakieś przerwanie)
{
if(zz)
_coś_tam robie_;
}
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
I problem polega na tym, że:
- zmienna "zz" w <main> jest pomijana (nie zmienia się jej wartość);
- w obsłudze przerwania zawsze jej wartość jest "zero" - no bo main jej
nie
zmienia.
Próbowałem chyba wszystkie optymalizacje (Os, O1, O2, O3) i efekt jest
zawsze ten sam.
Testowane na AVR STUDIO4 i w procku - efekt ten sam.
Czy trzeba ją jakoś specjalnie zadeklarować ja globalną?
W czym tu jest problem.
Dzięki za podpowiedzi.
Pzdrawiam.
Witam,
BTW przypadkiem w liniach z for() na koniec chyba nie powinno byc ";".
Przeciez wtedy linie zz = 0x10; i zz = 0x50; wykonaja sie tylko 1 raz.
Czy sie myle i o to ci wlasnie chodzi ?
pozdr.
Przemek
========
Path: news-archive.icm.edu.pl!news.icm.edu.pl!mimuw.edu.pl!news.mimuw.edu.pl!news.internetia.pl!not-for-mai
From: "Rafał" <werkon_at_nospam_inetia.pl>
Subject: Re: AVRGCC i zmienne globalne
Date: Sat, 17 May 2003 14:00:41 +0200
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
Witam,
BTW przypadkiem w liniach z for() na koniec chyba nie powinno byc ";".
Przeciez wtedy linie zz = 0x10; i zz = 0x50; wykonaja sie tylko 1 raz.
Czy sie myle i o to ci wlasnie chodzi ?
pozdr.
Przemek
To był tylko przykładzik napisany "na kolanie" mający obrazować sytuację w
której jakaś zmienna globalna modyfikowana w procedurze main nie jest
widziana w innej procedurze(w tym przypadku przrerwanie, bo akurat ja mam
właśnie taką sytuację). Jak już wcześniej napisano zabrakło mi "volatile",
ale dzięki za zainteresowanie.
Pozdrawiam.
========
Path: news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!newsfeed.gazeta.pl!news.vectranet.pl!news.bsk.vectranet.pl!not-for-mai
From: "Piotr Grygorczuk" <_grygorpl__at_nospam__poczta_._onet_._pl_>
Subject: Re: AVRGCC i zmienne globalne
Date: Fri, 16 May 2003 21:04:55 +0200
"Rafał" <werkon_at_nospam_inetia.pl> wrote in message
news:11799-1053023313_at_nospam_as3-152.swic.dialup.inetia.pl...
Witam.
int main()
{
int L;
for(L=0; L<0xFFFF;L++);
zz = 0x10;
for(L=0; L<0xFFFF;L++);
zz = 0x50;
}
1. W tym przykladzie funkcja main konczy dzialanie (tzn wychodzi) i program
idzie sobie dalej w maliny. Jak idzie w maliny to.... "Wszystko sie moze
zdarzyc..." (Lady Pank) ;-). Proponuje napisac:
int main()
{
int L;
......
while(1);
//lub "for(;;);" jak kto woli ;-)
}
No chyba, ze tej ostatniej petelki zabraklo tylko tutaj, na grupie. W takim
razie wybacz ;-).
2. Po obu for(...) masz ";" (srednik). To oznacza, ze zz stanie sie 0x10 lub
0x50 dopiero jak L stanie sie 0xffff. Czy doczekales tego momentu?
pg
========
Path: news-archive.icm.edu.pl!news.rmf.pl!news.ipartners.pl!news.task.gda.pl!not-for-mai