В плане прерывание меняет память скажем, а в этот момент ее читал основной цикл.
Самое простое - ничего не менять в прерываниях, только поднимать флаг, а уже в основном цикле по флагу выполнять соответствующий код.
Мьютексы же. Ну, или флаги. В задаче с АЦП я бы запускал дма стрим в прерывании от ноги и по концу приёма выставлял флаг/отдавал мьютекс, сигнализирую мэйну о том, что можно пользовать память.
Мютексы в прерывании? Подумали перед тем как отвечать?
Либо флагами либо горячий-холодный буффер
Вполне. Мьютексы во фриртос во всю юзаются в прерывании без особых накладных расходов.
Допустим, поток захватил мютекс, происходит прерывание. Что делать в прерывании? Ожидать освобождение? — нет, ожидание в прерывании неприемлемо
То, что они тяжелее бинарных семафоров и директ ту таск нотификейшн - другой вопрос.
Как раз захватывать в прерывании мьютекс не надо, его надо освобождать по концу приёма.
А захватывает его как раз мэйн.
Захват в потоке и отдача в исключении? Так, что ещё из идей будет?
То есть реализации с мьютексами вас не смутили по приведённой ссылке?) И что не так с освобождением примитива синхронизации в прерывании?)
Не смущает реализация без оверхеда с двойным буфером
Не так? - Запуск планировщика
Двойной буффер нужен для того что обработка данных может занимать больше времени чем поступление новых данных
Подробнее, пожалуйста. При чём тут планировщик? Задача стояла по синхронизации приёма от АЦП по внешнему прерыванию. Вопрос не про дополнительное место под буффер. И да, двойная буферизация - это оверхед по памяти.
Обсуждают сегодня