Problem mit Interrupts, die glob. int´s veraendern

Gast #39777
Mir fiel folgendes Problem auf:

ich definiere eine globale 16bit-Variable per

static volatile unsigned char xy;

Nun wird im z.B. im Timer0-Interrupt eine Messung ausgefuehrt, deren 
Ergebnis in xy landet. Das Hauptprogramm soll diese nun auswerten und 
holt sich das Ergebnis per

wert = xy;

dies wird uebersetzt in

lds r24, xy
lds r25, (xy)+1

Was passiert nun, falls der Interrupt genau zwischen diesen beiden 
Befehlen auftritt und xy veraendert, bekommt das Hauptprogramm dann den 
halben alten und den halben neuen Wert?

Was waere ein moeglicher Workaround, Interrupt waehrend des Werte-holens 
abschalten oder lock bits?

Gruss!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 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.