2016-03-26 17 views
3

zu markieren Ich weiß, dass verschiedene Architekturen verschiedene Möglichkeiten bieten können, Entwickler zu erkennen, ob die CPU jetzt in ISR läuft, z. ein Register lesen.Ist es sicher, eine globale Variable zu verwenden, um die Ausführung in ISR

Aber ich habe festgestellt, dass in einigen BSP-Code, sie verwenden eine globale Variable, es heißt g_in_isr, als ein Flag, um anzuzeigen, ob CPU in ISR ausgeführt wird. Wenn ein Interrupt aufgetreten ist, führt der Interrupt-Handler beim Beenden g_in_isr++ Operation auf Entery und g_in_isr-- aus.

Ich frage mich, ob dieser Weg sicher auf den Architekturen ist, die verschachtelte Interrupt ermöglicht. In den meisten Architekturen g_in_isr++ oder g_in_isr-- ist keine atomare Operation (habe ich Recht?), Was ist, wenn eine hohe Priorität Interrupt kommt, während eine bestehende Interrupt-Handler macht g_in_isr++ Operation? Ist das nicht problematisch?

-Update (2016-03-27)

Ja, ich weiß es Architektur abhängig ist, aber ich möchte den allgemeinen Fall kennen. Nehmen wir an, dass g_in_isr++ nicht atomar ist, ist es in der Tat nicht atomar auf der Architektur, bin ich richtig? Natürlich verwenden wir auch keine Compiler-Magie, um sie atomar zu machen.

Jetzt in einem solchen Fall, würde es Probleme verursachen?

+1

Es könnte, könnte es, es liegt an dem OS-Designer, um sicherzustellen, dass es nicht funktioniert. Dies ist ein OS-Design-Problem, nicht C-spezifisch. –

+0

Welche CPU- und welche CPU-Anweisungen generiert der Compiler für diese C-Anweisungen? Müssen Interrupts innerhalb des ISR aktiviert werden, um verschachtelte Interrupts zuzulassen? – kkrambo

+0

@kkrambo Entschuldigung, ich habe meine Frage aktualisiert, damit sie jetzt gelöscht aussieht. Können Sie es jetzt beantworten? Vielen Dank! –

Antwort

0

Die C-Sprache hat keine brauchbare atomare Semantik vor C11 angegeben, aber eine Sache existiert. Der Typ sig_atomic_t ist eine ganze Zahl mit garantiertem atomaren Zugriff, vgl. ISO 9899: 1999 §7.14 ¶2:

2 Die angeführten Art ist

sig_atomic_t 

die der (möglicherweise flüchtige qualifizierte) Integer-Typ eines Objekts ist, das als atomare Einheit zugegriffen werden kann, sogar in Gegenwart von asynchronen Interrupts.

Wenn Sie eine globale Variable vom Typ sig_atomic_t verwenden, um anzuzeigen, dass ein Signal geliefert wurde, ist das sicher. Es gibt jedoch keine Operationen wie Atominkrement definiert in C99.

In der Sprache C11 könnten Sie einen _Atomic int für diesen Zweck verwenden. Operationen dieses Typs funktionieren wie erwartet.

+0

Tut mir leid, aber ich wollte nicht wissen, wie ich dem Compiler sagen soll, dass er eine atomare Operation für mich generieren soll. Ich habe meine Frage aktualisiert, damit sie jetzt gelöscht aussieht. Kannst du es jetzt noch einmal lesen? Vielen Dank! –