Forum: Mikrocontroller und Digitale Elektronik volatile NUR bei interrupt deklarieren?


von brechbunkt (Gast)


Lesenswert?

Hallo,

ich habe einen timer-Variable, der per Interrupt inkrementiert wird und 
muss diese Variable selbstverständlich als volatile deklarieren.

In einer Funktion hole ich mir diesen Wert, rechne damit ein wenig rumm 
und gebe das Ergebnis mit der Funktion zurück. Ich muss doch aber nur 
die Variable als volatile deklarieren, die in der IRQ verwendet wird. 
Bei meiner get_delay() brauche ich das doch nicht mehr, oder? Oder muss 
ich nun sogar die Funktion als volatile deklarieren?

1
static volatile uint32_t sysTick = 0;  /* wird per IRQ erhöht */
2
3
uint32_t get_delay(void)
4
{
5
  uint32_t currentSysTick = sysTick;
6
7
  // ... Berechnungen ...
8
  
9
  return currentSysTick;
10
}

von (prx) A. K. (prx)


Lesenswert?

Genau richtig so.

von brechbunkt (Gast)


Lesenswert?

OK, danke für die Antwort.

von Sven S. (boldie)


Lesenswert?

öhm, nicht unbedingt!

Was hast du für einen Prozessor? Du musst sicherstellen, das dein 
Prozessor die Variable unterbrechungsfrei in ein Register laden kann, 
ansonsten hast du in sehr seltenen Fällen ein echtes Problem.

Beispiel:

16 Bit variable auf 8 Bit Prozessor:

0x00FF;
Lädt unterstes Byte 0xFF
Interrupt inkrementiert auf 0x0100
Lädt oberstes Byte 0x01
Ergebnis dann: 0x01FF

volatile bringt nur bedingt etwas, es weist den Compiler nur an, immer 
den Wert zu laden wenn er genutzt wird. Dies ist trotzdem keine atomare 
variable!

von Falk B. (falk)


Lesenswert?

Der Zugriff im normalen Programm muss atomar sein, siehe Interrupt.

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.