"Костыль" ПМСМ начинается уже тут
masterspammer wrote:Прерывания запрещать нельзя
, а не тут

:
Костыльно можно сделать так:
1. цикл устанавливает флажок (хоть в памяти, хоть в регистре)
2. цикл обрабатывает конфликтный ресурс
3. цикл сбрасывает флажок
4. цикл делает все остальные дела
, которое, вообще-то, уже не костыль сам по себе, а вполне разумный подход в сложившихся обстоятельствах.
А прерывание никогда не меняет флажок, но может проверить, что он установлен и в этот раз не трогать конфликтный ресурс (так как он точно не освободится до завершения прерывания и передачи управления основному циклу), иначе с конфликтным ресурсом можно делать всё, что угодно.
---
Вопрос - можно ли как-то реализовать не так костыльно и более общим случаем?
Более общий случай - это как раз что-то типа enterCritical() и exitCritical() , внутри этих скобок обрамление из запрета и разрешения прерываний.
То есть, вы, вероятно, считаете костылем то, что при таком вынужденном подходе прерывание будет иногда отрабатываться вхолостую, если случается, что ресурс трогать нельзя. Согласен, это нужно учитывать и принимать не всегда изящные меры. Заперт прерывания как раз для таких случаев, запрос никогда не отрабатывается вхолостую (и нету каких-то ветвлений в зависимости от чего-то), просто обработка может быть чуть задержана, если попали на момент апдейта атомарного.
А так, DMA еще бывает, если что.