Le Cortex M3 prend en charge une paire utile d'opérations (communes à de nombreuses autres machines également) appelées "Load-Exclusive" (LDREX) et "Store-Exclusive" (STREX). Sur le plan conceptuel, l'opération LDREX effectue une charge, définit également un matériel spécial pour observer si l'emplacement qui a été chargé peut être écrit par autre chose. L'exécution d'un STREX à l'adresse utilisée par le dernier LDREX entraînera l'écriture de cette adresse uniquement si rien d'autre ne l'a écrite en premier . L'instruction STREX chargera un registre avec 0 si le stockage a eu lieu, ou 1 s'il a été abandonné.
Notez que STREX est souvent pessimiste. Il existe une variété de situations où il peut décider de ne pas exécuter le magasin même si l'emplacement en question n'a pas été effectivement touché. Par exemple, une interruption entre un LDREX et un STREX amènera le STREX à supposer que l'emplacement surveillé a peut-être été atteint. Pour cette raison, c'est généralement une bonne idée de minimiser la quantité de code entre LDREX et STREX. Par exemple, considérez quelque chose comme ceci:
inline void safe_increment (uint32_t * addr)
{
uint32_t new_value;
faire
{
new_value = __ldrex (addr) + 1;
} while (__ strex (nouvelle_valeur, addr));
}
qui se compile en quelque chose comme:
; Supposons que R0 détient l'adresse en question; r1 saccagé
lp:
ldrex r1, [r0]
ajouter r1, r1, # 1
strex r1, r1, [r0]
cmp r1, # 0; Test si différent de zéro
bne lp
.. le code continue
La grande majorité du temps où le code s'exécute, rien ne se passera entre le LDREX et le STREX pour les "déranger", donc le STREX réussira sans plus attendre. Si, cependant, une interruption se produit immédiatement après l'instruction LDREX ou ADD, le STREX n'effectuera pas le stockage, mais à la place, le code reviendra pour lire la valeur (éventuellement mise à jour) de [r0] et calculer une nouvelle valeur incrémentée sur la base de cela.
L'utilisation de LDREX / STREX pour former des opérations comme safe_increment permet non seulement de gérer les sections critiquesm, mais aussi dans de nombreux cas d'éviter leur besoin.