Forum: Compiler & IDEs (großes)variablenproblem


von martin (Gast)


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

von OldBug (Gast)


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

von Sascha Biedermann (Gast)


Lesenswert?

Normalerweise müsste das so gehen. Poste doch bitte mal einen kompletten
Quelltext, dann lässt sich da eher etwas finden.

MfG
Sascha

von martin (Gast)


Lesenswert?

danke für die schnelle antwort, mit volatile gehts!

von OldBug (Gast)


Lesenswert?

Gern geschehen!
Lies den Rest aber auf jeden fall mal nach, da wirst Du einige Tips und
Hinweise bekommen.

Gruß,
Patrick...

von Peter D. (peda)


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

von Sascha Biedermann (Gast)


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

von Jörg Wunsch (Gast)


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.)

von OldBug (Gast)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.