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?
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. –
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
@kkrambo Entschuldigung, ich habe meine Frage aktualisiert, damit sie jetzt gelöscht aussieht. Können Sie es jetzt beantworten? Vielen Dank! –