ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
1005253 Топик полностью
Связанные сообщения
Logger
[protodb] Protocol Debugger. Отладка и реверс-инжиниринг протоколов.2023-11-12
В плюсах можно сделать шикарнейший логгер. Во-первых не занимающий програмной памяти или памяти данных (оперирует адресами текст...2020-09-12
Допустим, я хочу сделать в threadX логгер. Он будет писать в кольцевой буфер в памяти, из которого медленно и печально будет вып...2020-06-18
Нормальный логгер, к сожалению, делается только на C++... На C сам язык начинает сильно мешать. Что потенциально можно было бы ...2019-12-11
Так рассуждать, труды автора fmtlib тоже не оправданы. Мол есть printf, он всё делает. Но это не так, очень даже оправданы. Там ...2019-11-13
Использование gdb для распечатки значений в контрольных точках. Демонстрация концепции по ссылке.2019-11-08
Помимо прочего при нормальном программировании всегда делается какой-то "логгер" ведущий протокол работы программы. Потому, что ...2019-08-10
fk0, легенда (17.05.2020 12:53, просмотров: 950) ответил RxTx на Не надо запрещать, поскольку именно эта схема "Один Писатель - Один Читатель" с двумя изолированными и "догоняющими" друг друга readpos и writepos переменными сравниваемыми в одном месте LockFree.
+1. Проблемы с детектированием наезда, на необработанные данные, обгона указателя чтения, можно решить, если использовать не указатели, а индексы -- тогда освободятся старшие биты, в которых можно хранить счётчик. Ну или если есть 64-битные атомики. А если потеря данных не допустима, то увы, нужен семафор и условная переменная. 

Кстати при работе с аудио интересен кольцевой буфер с тремя указателями:


В основном коде:

1) запись проигрываемых данных;

2) чтение оцифрованных (с микрофона) данных;


И в прерываниях:

3) указатель данных для записи в ЦАП и он же для чтения из АЦП.


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


Кстати можно сделать, странно, что в библитечных функциях такого нет, кольцевой буфер способный хранить объекты переменного размера _непрерывно_ (т.е. к ним, пока они хранятся, можно обращаться как к объектам), и сохраняющий остальные свойства. Причём очень удобно на C++ получается: не нужно ломать голову над адресной арифметикой, а нужно переопределить арифметические операторы и итераторы и представить, что работаешь с "бесконечной лентой".


Если в кольцевой буфер пишется предсмертный лог, то чтоб вывести его, условно, одной функцией printf (и не натыкаться на конец с заворотом на начало) можно содержимое "провернуть" через std::rotate так, что начало текста будет в начале буфера. Для голого C см. алгоритм в приложенном файле ("block swap algorithm"):

s02b.pdf



Ссылки по теме:


https://en.wikipedia.org/wiki/Circular_buffer

[ZX]