Im ARM-Handbuch finden Sie eine Beispielimplementierung für eine Spin-Lock. Bitte schauen Sie hier nach: http://infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus_Tests_and_Cookbook_A08.pdf. Abschnitt über die "Verwendung von Wait For Event (WFE) und Send Event (SEV) mit Schlössern".
Sperrcode:
Loop:
LDREX R5, [R1] ; Lese-Schloss
CMP R5, #0 ; Prüfe, ob 0
WFENE ; Warte, wenn das Schloss gehalten wird
STREXEQ R5, R0, [R1] ; Versuche Wert zu speichern
CMPEQ R5, #0 ; Teste, ob Speichern erfolgreich war
BNE Loop ; Wiederholung, falls nicht
DMB ; stellt sicher, dass alle nachfolgenden Zugriffe nach dem
; Erhalten des Schlosses beobachtet werden
; Lade- und Speicherzugriffe im kritischen Bereich können jetzt durchgeführt werden
Sperrfreigabecode:
MOV R0, #0
DMB ; Stellt sicher, dass alle vorherigen Zugriffe beobachtet wurden, bevor das Schloss freigegeben wird
STR R0, [R1] ; Schloss freigeben
DSB ; Stellt sicher, dass die Speicherung, die das Schloss freigab, abgeschlossen ist, bevor das Ereignis gesendet wird
SEV
Frage: Warum wird STREXEQ verwendet? Was ist, wenn stattdessen STREX verwendet wird? Soweit ich weiß, wird strexeq nur ausgeführt, wenn EQ-Flag gesetzt ist. Aber wenn EQ nicht gesetzt ist, wird durch WFENE sichergestellt, dass auf das Ereignis gewartet wird? Ist STREX EQ also unnötig?
Vielen Dank im Voraus!