Я вот только не пойму, как эти LDREX/STREX юзать на практике...
Допустим,тот же пример из того же DHT0008A
Код
LDR r1, =locked
1: LDREX r2, [r0]
CMP r2, r1; Test if mutex is locked or unlocked
BEQ %f2; If locked - wait for it to be released, from 2
STREXNE r2, r1, [r0]; Not locked, attempt to lock it
CMPNE r2, #1; Check if Store-Exclusive failed
BEQ %b1; Failed - retry from 1
; Lock acquired
DMB; Required before accessing protected resource
BX lr
2; Take appropriate action while waiting for mutex to become unlocked
WAIT_FOR_UPDATE
B %b1; Retry from 1
Допустим,
1. тред1 выполнил LDREX r2, [r0] (r0=mutex1)
2. тред3 выполнил LDREX r2, [r0] (r0=mutex2), допустим даже отработал до конца(тк время отведенное ему довольно много, по сравнению с размером данной фунцкии), т.е взял mutex2, и что-то там еще делал
3. тред1 продолжнил выполнятся, дошел до STREXNE r2, r1, [r0] (r0=mutex1) и приплыли (из arm_architecture_v7m_reference):
Цитата
The result of executing a Store-Exclusive instruction to an address that is different from that used in the preceding Load-Exclusive instruction is unpredictable.
Получается LDREX...STREX надо пихать в критическую секцию или выполнять в SVC-обработчике, так зачем они тогда нужны ? ну разве что в приложении только 1 мютекс

)