Цитата Сообщение от Improver Посмотреть сообщение
1. Это увеличит код подпрограммы прерывания, что не есть гуд.
2. Обращение к этой булевой переменной в основной программе также должно быть внутри noInterrupts / interrupts.
Увеличит на то же количество инструкций, которое эта же операция займет внутри секции с запрещенными прерываниями в основном цикле. И это пренебрежимо малое время в любом случае.

Опрос такого флага в основной программе не нужно прятать в критическую секцию, потому что она только читается, это флажок - один байт, суть чтение атомарное, и никаких попыток одновременной модификации не делается. Запрет прерывания вокруг проверки просто ничего не изменит.

Вариант с копированием переменной в критической секции тоже будет работать, но он не лучше. Это просто другой способ сделать то же самое.

Цитата Сообщение от Improver Посмотреть сообщение
разработчики компиляторов для ардуин -- разумные люди
Дело не в компиляторе, а в том, что эта простая строчка на C++ прячет в себе много операций, каждая из которых может быть прервана:
- вычисление смещения
- запись
- инкремент
- запись
каждая из этих операций тоже не атомарна, 16-битные инкременты, например, и тоже может быть разбита прерыванием.

Если вычисление флажка делать в прерывании, то операция записи должна быть в критической секции, чтобы флажок не вычислился с непонятным значением CWB. Если проверка условия c копированием итд в основном цикле, то операция копирования должна быть в критической секции. В принципе это дело вкуса.

Но все это из совершенно другой категории, чем подгонка буферов через delay(). delay() просто старается обойти проблему стороной, а правильная реализация взаимодействия между потоками исключает конфликтную ситуацию в принципе. То есть, если есть желание разбираться, то начинать надо с убирания delay().

Цитата Сообщение от KTSerg Посмотреть сообщение
А запрет прерывания не приведёт к потере прерывания и соответственно удлинениям импульсов ?
Флаг запроса прерывания висит, пока его не сбросят вручную, или автоматом при вызове обработчика (лучше мне не верить, а почитать даташыт, страница 112, Timer/Counter Interrupt Flag Register – TIFR).