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

