6 Stimmen

Verwendung von STREXEQ anstelle von STREX für die Spinlock-Implementierung in ARM

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!

6voto

ali-hussain Punkte 501

Nein, WFE bietet nicht die Garantien, an die du denkst. Das ARM-Handbuch beschreibt eine große Anzahl von Ereignissen, die dich dazu bringen müssen, aus WFE auszusteigen, aber der Kern darf auch aus anderen Gründen aufwachen. Zum Beispiel darf ein Kern eine Timeout-Funktion in seiner WFE-Implementierung implementieren. Diese Ereignisse sind dieselben wie die Ereignisse für WFI, mit der zusätzlichen Anweisung eines Prozessors, einen SEV-Befehl auszuführen. Es besteht jedoch keine Anforderung, dass er schlafen bleibt. Tatsächlich ist NOP eine architektonisch gültige, wenn auch energiehungrige Implementierung von WFE. Es ist niemals sicher anzunehmen, dass du aufgewacht bist, weil du einen SEV gesehen hast. Zum Beispiel könnte es ein Interrupt gegeben haben, der Prozessor verarbeitete den Interrupt und gab die Kontrolle an den Thread zurück. Der Thread führte dann die nächste Anweisung in der Sequenz aus, das STREX.

1voto

auselen Punkte 26562

SEV, WFI und WFE sind Stromsparhinweise für die CPU, sie haben nichts mit Speichersynchronisation zu tun. Auch WFE / SEV sind nicht so gekoppelt, dass sie sich beeinflussen.

Aus ARM ARM:

A8.8.168: Send Event ist eine Hinweis-Anweisung. Es löst ein Ereignis für alle Prozessoren im Multiprozessorsystem aus.

A8.8.425: Der WFI-Befehl gibt einen Hinweis, dass nichts getan werden muss, bis der Prozessor einen Interrupt oder eine ähnliche Ausnahme behandelt.

A8.8.424: Der WFE-Befehl gibt einen Hinweis, dass nichts getan werden muss, bis entweder eine SEV-Anweisung ein Ereignis auslöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X