Cortex M3 supporta una coppia utile di operazioni (comuni anche in molte altre macchine) denominate "Load-Exclusive" (LDREX) e "Store-Exclusive" (STREX). Concettualmente, l'operazione LDREX esegue un caricamento, inoltre imposta un hardware speciale per osservare se la posizione che è stata caricata potrebbe essere scritta da qualcos'altro. L'esecuzione di uno STREX all'indirizzo utilizzato dall'ultimo LDREX causerà la scrittura di tale indirizzo solo se nient'altro lo ha scritto per primo . L'istruzione STREX caricherà un registro con 0 se il negozio ha avuto luogo o 1 se è stato interrotto.
Si noti che STREX è spesso pessimista. Esistono diverse situazioni in cui potrebbe decidere di non eseguire il negozio anche se la posizione in questione non è stata effettivamente toccata. Ad esempio, un interruzione tra un LDREX e STREX provocherà che lo STREX presuma che la posizione sotto osservazione potrebbe essere stata colpita. Per questo motivo, in genere è una buona idea ridurre al minimo la quantità di codice tra LDREX e STREX. Ad esempio, considera qualcosa di simile al seguente:
inline void safe_increment (uint32_t * addr)
{
uint32_t new_value;
fare
{
new_value = __ldrex (addr) + 1;
} while (__ strex (new_value, addr));
}
che si compila in qualcosa del tipo:
; Supponiamo che R0 contenga l'indirizzo in questione; r1 cestinato
lp:
ldrex r1, [r0]
aggiungi r1, r1, # 1
strex r1, r1, [r0]
cmp r1, # 0; Test se diverso da zero
bne lp
.. il codice continua
La maggior parte delle volte che il codice viene eseguito, tra LDREX e STREX non accadrà nulla per "disturbarli", quindi STREX avrà successo senza ulteriori indugi. Se, tuttavia, si verifica un interruzione immediatamente dopo l'istruzione LDREX o ADD, lo STREX non eseguirà il negozio, ma il codice tornerà a leggere il valore (possibilmente aggiornato) di [r0] e calcolerà un nuovo valore incrementato basato su quello.
L'uso di LDREX / STREX per formare operazioni come safe_increment rende possibile non solo la gestione di sezioni critiche, ma anche in molti casi per evitarne la necessità.