Cortex M - атомарность отключения IRQ - PullRequest
4 голосов
/ 22 октября 2019

Я часами пытался ответить на мой вопрос, но не смог найти удовлетворительного ответа.

Поскольку ядра 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

Поскольку этот код широко используется, я подозреваю, что такая ситуация никогда не должна возникать из-за (архитектуры?) Дизайна. Может кто-нибудь объяснить мне, почему? :-) Спасибо!

1 Ответ

1 голос
/ 23 октября 2019

Что происходит, когда прерывание IRQ появляется между выполнением этих двух инструкций и обработчик IRQ изменяет состояние PRIMASK?

Программа будет случайным образом блокироваться, так как это такжесломать большинство других методов ожидания прерывания (например, volatile переменные).

Помните, что прерывание может произойти, только если оно не замаскировано, поэтому обработчик прерываний может только отключить прерывания. Но глобальное отключение прерываний также предотвратит срабатывание других прерываний - и код, ожидающий некоторого взаимодействия с оборудованием, обычно не повторно разрешает прерывания случайным образом.

Именно поэтому обработчик прерываний считается br0kenкогда он изменяет PRIMASK или FAULTMASK, не восстанавливая его при возврате исключения.

...