Ниже приведен пример реализации спин-блокировки в руководстве ARM. Пожалуйста, проверьте здесь: http://infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus_Tests_and_Cookbook_A08.pdf. Раздел «Использование ожидания для события (WFE) и отправки события (SEV) с помощью замков».Использование STREXEQ вместо STREX для реализации спин-блокировки в ARM
Блокировка Код:
Loop:
LDREX R5, [R1] ; read lock
CMP R5, #0 ; check if 0
WFENE ; sleep if the lock is held
STREXEQ R5, R0, [R1] ; attempt to store new value
CMPEQ R5, #0 ; test if store suceeded
BNE Loop ; retry if not
DMB ; ensures that all subsequent accesses are observed after the
; gaining of the lock is observed
; loads and stores in the critical region can now be performed
Код блокировки выпуска:
MOV R0, #0
DMB ; ensure all previous accesses are observed before the lock is cleared
STR R0, [R1] ; clear the lock.
DSB ; ensure completion of the store that cleared the lock before sending the event
SEV
Вопрос: Почему используется STREXEQ? Что делать, если вместо этого используется STREX? Насколько я понимаю, strexeq будет выполняться, только если установлен флаг EQ. Но в любом случае, если EQ не установлен, WFENE обеспечит, чтобы мы ждали события? Так что не STREX EQ не нужно?
Заранее благодарен!
Thank you. В этом есть смысл. Я должен был больше обратить внимание на инструкцию wfene. – piscianemperor