www.mikrocontroller.net

Forum: Compiler & IDEs (großes)variablenproblem


Autor: martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Biedermann (Gast)
Datum:

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

MfG
Sascha

Autor: martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle antwort, mit volatile gehts!

Autor: OldBug (Gast)
Datum:

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

Gruß,
Patrick...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Biedermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.