(großes)variablenproblem

Gast #76978
Lesenswert?

hi,
hab da ein großes problem mit einer variable, ungefähr so:

unsigned char cnt = 0;   // eine globale variable
...
SIGNAL(SIG_INTERRUPT1)
{
  ...
  cnt++;              // variable wird erhöht, sehe ich an einem lcd
  ...
}
...
void funk1(void)
{
  ...
  while(cnt == 0)
    PORTA = cnt+1;     // am porta hängen 8 leds
  ...
}

also mein problem:
es wird die variable cnt bei einem externen interrupt eindeutig erhöht,
den zählerstand sehe ich an einem lcd, in der funktion funk1 bleit
dieselbe variable aber immer 0, was ich an den leds sehe.

eigentlich sollte irgendwann während die while-schleife in funk1 läuf
die variable durch den externen interrupt erhöht werden, was dazu führt
dass die while-schleife abgebrochen wird, dem ist aber nicht so,
arg, ich hab keine ahnung wieso?

wenn nötig könnte ich ev. den ganzen source zur verfügung stellen.

danke,
Martin
Gast #76979
Lesenswert?

Hallo Martin!

Dein Problem ist schon öfter hier beschrieben: das Schlüsselwort heist
"volatile". Kurz: es sorgt dafür, daß jeder Zugriff auf Deine
Variable sicher gestellt wird (keine Optimierung seitens Compiler).
Den Rest kannst Du ja in den anderen Threads nachlesen...

Gruß,
Patrick...

P.S.:
volatile unsigned char cnt = 0;   // eine globale variable
#76983
Lesenswert?

Und warum geht das hier nicht mit dem AVR-GCC:


unsigned char cnt = 0;   // eine globale variable

void funk1(void)
{
  ...
  while( (unsigned char volatile)cnt == 0) // <- das hier !!!

    PORTA = cnt+1;     // am porta hängen 8 leds
  ...
}


Man kann doch alles mögliche casten, warum dann nicht auch volatile ?


Peter
Gast #76984
Lesenswert?

Hallo Peter!

Ich würde mal vermuten das es daran liegt, dass volatile nur dem
Compiler beim compilieren "sagt" dass er die Variable nicht mit
(weg-)optimieren soll. Zur laufzeit würde ein Cast auf volatile also
keinen sinn machen, und deshalb auch nicht gehen.

MfG
Sascha
Gast #76985
Lesenswert?

Oder mit den Worten des Standards (6.5.4 Cast operators):

``A cast does not yield an lvalue. Thus, a cast to a qualified type
has the same effect as a cast to the unqualified version of the
type.''

(`const' und `volatile' sind type qualifiers.)
Gast #76986
Lesenswert?

...wobei (volatile unsigned char) oder (volatile unsigned char *)
zumindest keine Fehlermeldung bringt...
Allerdings gibts ne Fehlermeldung, wenn man Versucht, beispielsweise
ein volatile unsigned char an eine Funktion zu übergeben, die einfach
nur ein schlichtes unsigned char erwartet...
Irgendwo wiederspricht sich das doch, oder?
Klar ist volatile ein type qulaifier, aber dann sollte das bei der
Übergabe auch keine Rolle spielen, oder bin ich da jetzt auf dem
Holzweg?

Patrick...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren