Цитата Сообщение от svofski Посмотреть сообщение
Вместо двух вложенных циклов будет просто цикл.
Можно и так, это изменение имеет свои плюсы и минусы: цикл записи всегда будет "идти по пятам" чтения, т.е. если случится событие "в буфере нет места", то этот цикл начнёт с максимальной для ардуины скоростью проверять условие, опрашивать переменную CRB и запись продолжится, как только CRB увеличится на единицу. А если учесть, что, для безопасности, в основной программе все обращения к CRB должно быть внутри noInterrupts/interrupts, то получится совсем скверно для работы таймера и прерываний. Мне кажется, наличие второго вложенного цикла с ожиданием -- это тот костыль, который помогает. :-) Либо, опять же, можно вынести проверку условия "в буфере нет места" в подпрограмму обработки прерывания, но тогда окружать noInterrupts/interrupts прийдётся переменную CWB.

Еще можно сразу после заполнения буфера загонять ардуину в сон (тут надо долго читать, какой именно из режимов сна правильно будет работать). Она будет просыпаться только на прерывание и забивание буфера, остальное время потреблять какой-то там наноампер.
А это уже интересная идея.

- - - Добавлено - - -

Цитата Сообщение от KTSerg Посмотреть сообщение
Я вот чет притормозил... А зачем вообще необходима атомарность в BUFF[lowByte(CWB)] = SBb; ?
В прерывании вообще нет обращения к CWB, его модификация не происходит (где-то в другом месте кода), ну разорвётся эта запись на прерывание, и чем это грозит? (если не считать, случай когда CRB догнал CWB...), Но опять-же, индекс CWB ведь не изменяется до окончания записи в буфер, значит и проблемы не должно быть...
Да, именно так.
Интересное наблюдение -- в программе сейчас нет проверки на то, что чтение из буфера обгонит запись, хотя теоретически это возможно, например, в случае, если SD-карта не читается. Надо будет сделать проверку и на это событие...