ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1012925 Топик полностью
abivan (18.06.2020 15:02, просмотров: 946) ответил fk0 на Допустим, я хочу сделать в threadX логгер. Он будет писать в кольцевой буфер в памяти, из которого медленно и печально будет выпечатываться в компорт. Задача достаточно классическая. Логгировать одновременно могут все потоки. Как сделать кольцевой буфер -- понятно. В принципе он может быть реализован на lockless-алгоритмах, но.... Но поскольку компорт медленный, то буфер может быть в переполненном состоянии (регулярно), то потоки пытающиеся писать в лог должны ожидать
я не знаю за threadX но на тнео, фриртос итд так. 

2 задачи логер и уарт и очередь сообщений

Задача логер ждет появления сообщения в очереди в которую могут отправлять сообщение все потоки

Отправка идет сервисом отправить с таймаутом. При сработке таймаута поток уже сам решает, что ему делать с этим сообщением, пропустить или сохранить локально.

Задача логер имеет очередь на n указателей. Память для данных аллокируется потоком и освобождается задачей логером.

При приходе очередного сообщения данные помещаются в кольцевой буфер и устанавливается семафор для задачи передачи данных из кольцевого буфера в уарт.

Если места в кольцевом буфере нет сообщения из очереди не вычитываются.(ожидаем семафор от уарт о передаче фрэйма и освобождении кольцевого буфера) При заполнении очереди все потоки ставятся на ожидание с таймаутом(написал выше)