
Сообщение от
svofski
Для while() { delay(); } я бы завел булевый флажок, который устанавливается по такому же условию, но из прерывания.
Не вижу смысла, т.к.:
1. Это увеличит код подпрограммы прерывания, что не есть гуд.
2. Обращение к этой булевой переменной в основной программе также должно быть внутри noInterrupts / interrupts.
Лучше сделать нечто такое:
Код:
noInterrupts();
CRB_temp = CRB;
interrupts();
и далее в программе используем CRB_temp, как, собственно рекомендуют по ссылкам выше... И хотя вероятность одновременного чтения и записи переменной CRB крайне низка, это защитит нас от глюка на 100%.
Операция BUFF[lowByte(CWB++)] = SBb должна быть атомарной, то есть в скобке из noInterrupts() - interrupts().
Ну может оно и так, но если принять за аксиому то, что разработчики компиляторов для ардуин -- разумные люди, то запись одного элемента массива ни в коем разе не должна затрагивать как-то другие элементы. А попадание чтения и записи в одну ячейку исключено программно задержкой, поэтому особого смысла выделять эту команду я не вижу.