Вот моя реализация инкремента/декремента, обмена и сравнения-обмена для разных типов:
CODE
PUBLIC _Z9AtomicIncPVh, _Z9AtomicDecPVh
PUBLIC _Z10AtomicSwapPVhj, _Z10AtomicSwapPVtj _Z10AtomicSwapPVjj
PUBLIC _Z13AtomicCmpSwapPVhjj, _Z13AtomicCmpSwapPVtjj, _Z13AtomicCmpSwapPVjjj
;uint AtomicInc(u8 volatile *);
_Z9AtomicIncPVh:
aInc8_01: LDREXB R3, [R0]
ADDS R1, R3, #1
STREXB R2, R1, [R0]
CMP R2, #0
BNE aInc8_01
MOV R0, R3
BX LR
;uint AtomicDec(u8 volatile *);
_Z9AtomicDecPVh:
aDec8_01: LDREXB R3, [R0]
SUBS R1, R3, #1
STREXB R2, R1, [R0]
CMP R2, #0
BNE aDec8_01
MOV R0, R3
BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u8.
;uint AtomicSwap(u8 volatile *, uint);
_Z10AtomicSwapPVhj:
aSwap8_01: LDREXB R3, [R0]
STREXB R2, R1, [R0]
CMP R2, #0
BNE aSwap8_01
MOV R0, R3
BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u16.
;uint AtomicSwap(u16 volatile *, uint);
_Z10AtomicSwapPVtj:
aSwap16_01: LDREXH R3, [R0]
STREXH R2, R1, [R0]
CMP R2, #0
BNE aSwap16_01
MOV R0, R3
BX LR
;АтомарнаЯ операциЯ "обмен" длЯ типа u32.
;u32 AtomicSwap(u32 volatile *, u32);
_Z10AtomicSwapPVjj:
aSwap32_01: LDREX R3, [R0]
STREX R2, R1, [R0]
CMP R2, #0
BNE aSwap32_01
MOV R0, R3
BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u8.
;uint AtomicCmpSwap(u8 volatile *ptr, uint newVal, uint cmpVal);
_Z13AtomicCmpSwapPVhjj:
aCmpSwap8_01: LDREXB R12, [R0]
CMP R12, R2
ITT EQ
STREXBEQ R3, R1, [R0]
CMPEQ R3, #1
BEQ aCmpSwap8_01
MOV R0, R12
BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u16.
;uint AtomicCmpSwap(u16 volatile *ptr, uint newVal, uint cmpVal);
_Z13AtomicCmpSwapPVtjj:
aCmpSwap16_01: LDREXH R12, [R0]
CMP R12, R2
ITT EQ
STREXHEQ R3, R1, [R0]
CMPEQ R3, #1
BEQ aCmpSwap16_01
MOV R0, R12
BX LR
;АтомарнаЯ операциЯ "сравнение и обмен" длЯ типа u32.
;u32 AtomicCmpSwap(u32 volatile *ptr, u32 newVal, u32 cmpVal);
_Z13AtomicCmpSwapPVjjj:
aCmpSwap32_01: LDREX R12, [R0]
CMP R12, R2
ITT EQ
STREXEQ R3, R1, [R0]
CMPEQ R3, #1
BEQ aCmpSwap32_01
MOV R0, R12
BX LR
си++ - хидеры:
Код
uint AtomicInc(u8 volatile *);
uint AtomicDec(u8 volatile *);
uint AtomicSwap(u8 volatile *, uint);
uint AtomicSwap(u16 volatile *, uint);
u32 AtomicSwap(u32 volatile *, u32);
uint AtomicCmpSwap(u8 volatile *, uint newVal, uint cmpVal);
uint AtomicCmpSwap(u16 volatile *, uint newVal, uint cmpVal);
u32 AtomicCmpSwap(u32 volatile *, u32 newVal, u32 cmpVal);
Все остальные операции сможете сами реализовать если прочитаете доку о командах LDREX/STREX.