counter, volatile und interrupt

OP #3365173
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
}
#3365175
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.
#3365246
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.

Antwort schreiben

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.

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.