Cortex M3 mendukung pasangan operasi operasi yang berguna (umum di banyak mesin lain juga) yang disebut "Load-Exclusive" (LDREX) dan "Store-Exclusive" (STREX). Secara konseptual, operasi LDREX melakukan beban, juga menetapkan beberapa perangkat keras khusus untuk mengamati apakah lokasi yang dimuat mungkin ditulis oleh sesuatu yang lain. Melakukan STREX ke alamat yang digunakan oleh LDREX terakhir akan menyebabkan alamat itu ditulis hanya jika tidak ada yang menulisnya terlebih dahulu . Instruksi STREX akan memuat register dengan 0 jika toko berlangsung, atau 1 jika dibatalkan.
Perhatikan bahwa STREX sering pesimistis. Ada berbagai situasi di mana mungkin memutuskan untuk tidak melakukan toko bahkan jika lokasi yang dimaksud sebenarnya belum tersentuh. Misalnya, interupsi antara LDREX dan STREX akan menyebabkan STREX menganggap lokasi yang sedang ditonton mungkin terkena. Untuk alasan ini, biasanya ide yang baik untuk meminimalkan jumlah kode antara LDREX dan STREX. Misalnya, pertimbangkan sesuatu seperti berikut:
inline void safe_increment (uint32_t * addr)
{
uint32_t new_value;
melakukan
{
new_value = __ldrex (addr) + 1;
} while (__ strex (new_value, addr));
}
yang mengkompilasi ke sesuatu seperti:
; Asumsikan R0 menyimpan alamat yang dimaksud; r1 dibuang
lp:
ldrex r1, [r0]
tambahkan r1, r1, # 1
strex r1, r1, [r0]
cmp r1, # 0; Tes jika tidak nol
bp l
.. kode berlanjut
Sebagian besar waktu kode dijalankan, tidak ada yang akan terjadi antara LDREX dan STREX untuk "mengganggu" mereka, sehingga STREX akan berhasil tanpa basa-basi lagi. Namun, jika interupsi terjadi segera mengikuti instruksi LDREX atau ADD, STREX tidak akan melakukan store, tetapi kode akan kembali untuk membaca nilai (mungkin diperbarui) dari [r0] dan menghitung nilai tambahan baru. berdasarkan itu.
Menggunakan LDREX / STREX untuk membentuk operasi seperti safe_increment memungkinkan untuk tidak hanya mengelola bagian kritis, tetapi juga dalam banyak kasus untuk menghindari kebutuhan mereka.