ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
3 декабря
1557616 Топик полностью
Nikolay_Po (Вчера, 18:03, просмотров: 78) ответил LightElf на Используйте в main интринсики __LDREX()/__STREX() и будет вам благорастворение воздусей.
Я как-то попробовал с Cortex-M3. Со вложенностью не вышло. Оно на уровне одного прерывания работает, а если вложено - то... Деталей не помню, то ли риск зависнуть, то ли прерванный код имеет шанс не увидеть изменения, так как его проверил уже прервавший вторым уровнем код. 

См. по тегу LDREX

https://caxapa.ru/1429545.html


P.S. Вот, вспомнил: оно не сработает, если нужно защитить доступ шире, чем выровненные 32 бита:

"Увы, так не заработает. Я прикидывал и не нашёл способа атомарно обновить, при помощи этой пары инструкций, что-либо больше 32 бит. Если у STM32F адрес не проверяется, то для обоих переменных достаточно одной обёртки. Но это будет противоречить документации, где явно указано, что нужно проверять сохранность эксклюзивности доступа именно по указанному адресу и именно указанной ширины. А это лишь один адрес с шириной данных до 32 бит."

До 32 бит - сработает, годно.