(großes)variablenproblem

Gast #76978
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
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
Gast #76980
Normalerweise müsste das so gehen. Poste doch bitte mal einen kompletten
Quelltext, dann lässt sich da eher etwas finden.

MfG
Sascha
#76983
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
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
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
...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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.