2016-03-29 15 views
0

Ich schreibe ein Programm in C für PIC32 uC, die eine globale Variable (Uint32_t-Typ), die von mehreren Interrupt Service Routinen und von der Main gelesen/geändert werden können.
Ich weiß, dass das nicht sicher ist, also habe ich mich gefragt, wie man es sicher macht? Gibt es ein Beispiel, das zeigt, wie man es sicher macht?Gemeinsame Nutzung von globalen Variablen mit mehreren Interrupt-Service-Routinen in C

Edit 1:

Kann Interrupts unterbrechen einander? ja
Aktualisiert die ISR die Variable? ja Ändert Main die Variable? ja Sind schreibt und liest die Variable Atom und wie weißt du? Nicht sicher
Gibt es ein RTOS? Kein

+0

Der sicherste Weg ist: Tu das nicht! BTW Ich hoffe, Sie haben diese Variable als "flüchtig" definiert. – LPs

+0

Nun, es klingt wie Sie eine freistehende Umgebung verwenden, so C nicht viel vorschreibt, aber wenn Sie tragbaren Code schreiben wollten, würden Sie sich C11-Entwurf Standard n1570 ansehen: * 5.1.2.3 Programmausführung 5 Wann die Verarbeitung der abstrakten Maschine wird durch Empfang eines Signals unterbrochen, die Werte von Objekten, die weder sperrfreie atomare Objekte noch vom Typ flüchtig sig_atomic_t sind, sind nicht spezifiziert [...]. Der Wert eines Objekts, das vom Handler geändert wurde, der weder ein blockierungsfreies atomares Objekt noch vom Typ volatile sig_atomic_t ist, wird unbestimmt, wenn der Handler den [...] * – EOF

+1

ausführt Wenn Sie so eingerichtet sind, dass Interrupts deaktiviert sind Wenn Sie Interrupts bearbeiten, müssen Sie die Interrupts auch überall dort abschalten, wo Sie das globale Hauptverzeichnis lesen oder ändern. – Ross

Antwort

1

Wenn Sie wirklich brauchen globale Variablen zu halten, die während der Wartung mehrerer Interrupts modifiziert werden können, die sich gegenseitig unterbrechen können, empfehle ich Ihnen Weg folgendes zu tun:

  1. Machen Sie alle Sequenzen von Aktionen (lesen und/oder schreibe) auf diese Variablen "atomar", indem alle Interrupts vorher deaktiviert werden und danach alle Interrupts wieder aktiviert werden. Auf PIC32 können Sie dies tun, indem Sie das globale Interrupt-Flag GIE schreiben.
  2. Deklarieren Sie diese Variablen als flüchtige, um jede unerwartete Optimierung vom Compiler zu vermeiden.
  3. Benennen Sie diese Variablen mit einem bestimmten Präfix um, um sie eindeutig zu identifizieren, wie Shared_XXXX, aber es hängt von der Namenskonvention ab, die Sie verwenden.
  4. Setzen Sie alle Folgen von Aktionen auf diese Variablen in Funktionen mit einem bestimmten Präfix, um sie eindeutig zu identifizieren, wie Atomic_XXXX(). Um den Punkt 1 zu implementieren, müssen entweder alle diese Funktionen durch das Deaktivieren aller Interrupts und das erneute Aktivieren aller Interrupts beendet werden, oder alternativ können atomare Funktionen als Callback-Parameter systematisch an eine Funktion übergeben werden, die alle Interups deaktiviert, die Callback-Funktion aufruft und alle wieder aktiviert unterbrechen.
+0

Ich mag Ihre Vorschläge, danke –