Чтобы развернуть ответ из @DinhQC, все инструкции с одним результатом для 16- и 32-битных типов данных являются «атомарными» по отношению к прерываниям в Cortex-M, если данныеправильно выровнен (и вы должны очень стараться, чтобы компилятор C выдал вам невыровненные данные, потому что невыровненный доступ медленный и требует особой обработки).Операции с несколькими результатами, такие как LDM
и STM
, могут прерываться и возобновляться в большинстве реализаций, но гарантируется целостность каждой отдельной 32-битной передачи в пределах LDM
или STM
.
Важно понимать, являются ли выполняемые вами операции отдельными инструкциями на уровне машины или нет.Например, если вы увеличиваете разделяемую переменную, для этого потребуются три инструкции: чтение, изменение и запись.Если между чтением и записью возникает прерывание, а подпрограмма обслуживания прерываний изменяет одну и ту же переменную, эта модификация будет перезаписана при возврате ISR.
Безопасный способ - использовать какое-то оборудование-поддерживаемый механизм для обеспечения атомарности или взаимного исключения ваших общих данных.Однако в Cortex-M есть более мощные, более гибкие и более быстрые подходы к взаимному исключению, чем отключение и повторное включение прерываний, в частности, инструкции STREX
и LDREX
(которые также доступны в C).Посмотрите на мой ответ на этот другой вопрос для получения дополнительной информации.