Forum: Compiler & IDEs counter, volatile und interrupt


von David H. (davidm)


Lesenswert?

Ich habe ein PIC32MX und verwende Change Notify Pins die auch ein 
Interrupt generieren.


So ganz habe ich es nocht nicht raus wie ich sicher mit Variablen umgehe 
die wärend einem Interrupt geändert werden.

Ich habe also einen Simplen counter und möchte diesen in main() 
verwenden.

Folgendes darf nicht passieren:
- Die Variable counter darf nicht irgendwie verstuemmelt werden
- Es dürfen keine Impulse verloren gehen (Also kein abschalten der ISR)
- Der counter wird in main() auf 0 gesetzt


Funktioniert dies bereits sicher,
oder wird dies erst durch volatile erreicht?
Bisher dachte ich das volatile nur das erneute lesen einer Variablen 
erzwingt.
1
BYTE counter;
2
3
void __ISR(_CHANGE_NOTICE_VECTOR, ipl5) ChangeNoticeHandler(void)
4
{
5
 counter++;
6
}
7
8
9
10
void main(void) {
11
etwas mit counter machen
12
counter = 0; // counter reset
13
}

von (prx) A. K. (prx)


Lesenswert?

volatile reicht. Darf bei einer 32-Bit Kiste auch entsprechend breit 
sein, muss als kein Byte sein.

http://www.mikrocontroller.net/articles/FAQ#Was_hat_es_mit_volatile_auf_sich

> Bisher dachte ich das volatile nur das erneute lesen einer Variablen
> erzwingt.

Eben. Ohne volatile weiss main() nicht, dass die Variable sich jederzeit 
ändern kann und optimiert u.U. sämtliche Zugriffe weg.

: Bearbeitet durch User
von David H. (davidm)


Lesenswert?

A. K. schrieb:
> volatile reicht.

Ich muss hier also nicht irgendwie fürchten das der mir die variable 
zwischen drinne verändert?

Also verändern in Form von +1 ist ja ok, aber nicht das sich das 
überschneidet und nicht mehr funktioniert.

von Karl H. (kbuchegg)


Lesenswert?

David Mueller schrieb:

> Also verändern in Form von +1 ist ja ok, aber nicht das sich das
> überschneidet und nicht mehr funktioniert.

natürlich musst du.
Aber das hat jetzt nichts mit volatile zu tun.

So ein Compiler ist ja kein Geistheiler, bei dem man nur das richtige 
Stichwort aufsagen muss und alle Probleme lösen sich in Luft auf.

> - Es dürfen keine Impulse verloren gehen (Also kein abschalten der ISR)

Das wirds nicht spielen. Denn zwischen
> etwas mit counter machen
und
> counter = 0; // counter reset
wirst du die Interrupts abschalten müssen.
Was aber nicht notwendigerweise bedeutet, dass du sie soooo lange 
abschalten musst, dass welche verloren gehen. Man kann ja auch mit einer 
Hilfsvariablen erst mal die Interrupts abschalten, den Counter-Wert 
sicher, den Counter auf 0 setzen und die Interrupts wieder frei geben, 
ehe man dann mit dem so in der Hilfsvariablen gesicherten 'Counter' Wert 
weiterarbeitet. Dann sind die Interrupts nur ganz kurz aus und wenn dir 
dann immer noch einer verloren geht, dann hast du ein viel 
grundlegenderes Problem.

: Bearbeitet durch User
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.