/ / Spinlock im IRQ auf einem kleinen Embedded System - Deadlock, Interrupt, Spinlock, isr

Spinlocks in IRQ auf einem kleinen Embedded-System - Deadlock, Interrupt, Spinlock, isr

Ich entwickle ein klein Embedded System auf einem ARM-Mikrocontroller OHNEEIN BETRIEBSSYSTEM. Es gibt verschiedene Arten von Interrupts (Tastendruck, A / D-Umwandlung, Timer usw.) und nur ein einzelner Thread läuft.

Ich möchte, dass eine FIFO-Warteschlange mit Ereignissen verarbeitet wirdJede Interrupt-Service-Routine fügt ihr Ereignis zur Warteschlange hinzu, und der Haupt-Thread (und nur der Thread) entfernt die Ereignisse aus der Warteschlange, die verarbeitet werden sollen. Ein eindeutiger Zugriff auf die Warteschlangendatenstruktur in der Interrupt-Service-Routine ist gefährlich, aber ein Spinlock verursacht Deadlock Wenn der Haupt-Thread die Sperre hat und ein Interrupt auftritt, wartet die ISR für immer auf die Sperre.

Natürlich weiß ich bereits, dass ich Interrupts deaktivieren kann, während der Haupt-Thread sich mit der Warteschlange beschäftigt. Dies ist jedoch nicht ideal.

Wie gehe ich am besten vor?

Vielen Dank EIN

Antworten:

0 für die Antwort № 1

Wenn Sie mit einer festen Warteschlange umgehen können,Sie brauchen nichts Kompliziertes (ich gehe davon aus, dass Interrupts in der ISR deaktiviert sind), da es nur einen Leser gibt - Ihren Kernel-Thread -, der den Endzeiger aktualisiert, und einen Writer - ISR, der den Kopfzeiger aktualisiert Verknüpft / Store-bedingt laden Anweisungen zur Implementierung eines Schloßfreie Warteschlange.