Я часами пытался ответить на мой вопрос, но не смог найти удовлетворительного ответа.
Поскольку ядра ARM Cortex-M не имеют никаких инструкций для чтения состояния глобальной маски прерывания (регистр PRIMASK) и немедленно отключая его, все платформы используют следующую последовательность из двух инструкций:
mrs r0, PRIMASK ; Read current state
cpsid i ; Mask IRQs
Но нет никакого объяснения, почему этот фрагмент кода считается атомарным ... Что происходит, когда приходит IRQмежду выполнением этих двух инструкций и обработчиком IRQ изменяет состояние PRIMASK? Как и
mrs r0, PRIMASK ; Read current state
; Some weird IRQ handling happens here and changes PRIMASK
cpsid i ; Mask IRQs
Поскольку этот код широко используется, я подозреваю, что такая ситуация никогда не должна возникать из-за (архитектуры?) Дизайна. Может кто-нибудь объяснить мне, почему? :-) Спасибо!