Jak poprawnie używać zmiennych globalnych w AVRGCC z obsługą przerwań?

AVRGCC i zmienne globalne





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

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

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

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

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

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

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

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

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