- В плюсах можно сделать шикарнейший логгер. Во-первых не занимающий
програмной памяти или памяти данных (оперирует адресами текста в
ELF-файле, сам текст в Flash -- отсутствует), во-вторых работающий
быстро, в-третьих умеющий распечатывать enum'ы и другие типы,
в-третьих выдающий компактный бинарный вывод. Который можно имея
ELF файл от этой версии прошивки восстановить в текст. В языке "C"
лучшее что можно сделать -- только первый пункт и последний, причём
последний fk0(2074 знаков, 12.09.2020 02:10, ссылка, ссылка)
- Допустим, я хочу сделать в threadX логгер. Он будет писать в
кольцевой буфер в памяти, из которого медленно и печально будет
выпечатываться в компорт. Задача достаточно классическая.
Логгировать одновременно могут все потоки. Как сделать кольцевой
буфер -- понятно. В принципе он может быть реализован на
lockless-алгоритмах, но.... Но поскольку компорт медленный, то
буфер может быть в переполненном состоянии (регулярно), то потоки
пытающиеся писать в лог должны ожидать fk0(1061 знаков, 18.06.2020 14:15)
- Я бы использовал очередь, в потоке, который логирует ошибку dxWAk(447 знаков, 18.06.2020 15:05, картинка)
- Собственно и вопрос-то в том как сделать самодельную очередь.
Потому, например, что готовая очередь может по каким-то причинам не
подходить. Например, работает только с сообщениями фиксированного
размера. Да, можно пересылать указатели на сообщения, но тогда на
каждое нужно выделять память. Кроме того, если очередь реализована,
условно, через системный вызов -- то работа с такой очередью
становится очень тяжёлой, по сравнению с другими примитивами
синхронизации, которые по fk0(213 знаков, 18.06.2020 15:13)
- я не знаю за threadX но на тнео, фриртос итд так. abivan(788 знаков, 18.06.2020 15:02)
- Бинарный семафор. Самый приоритетный из ожидающих проснется,
заберет семафор, проверит место. Если места достаточно - отправит
данные. Если недостаточно - снова встанет на этом же самом
семафоре. - LightElf(18.06.2020 15:01)
- +1. Проблемы с детектированием наезда, на необработанные данные,
обгона указателя чтения, можно решить, если использовать не
указатели, а индексы -- тогда освободятся старшие биты, в которых
можно хранить счётчик. Ну или если есть 64-битные атомики. А если
потеря данных не допустима, то увы, нужен семафор и условная
переменная. fk0(1191 знаков, 17.05.2020 12:53, ссылка, картинка)
- Нормальный логгер, к сожалению, делается только на C++... На C сам язык начинает сильно мешать. Что потенциально можно было бы сделать, и какие есть сложности: fk0(8363 знаков, 11.12.2019 12:39)
- Так рассуждать, труды автора fmtlib тоже не оправданы. Мол есть printf, он всё делает. Но это не так, очень даже оправданы. Там много ньюансов. Основной -- вынос парсинга строки формата в compile time, потому, что printf работает не быстро. По fk0(2963 знаков, 13.11.2019 08:58 - 09:09, ссылка, картинка)
- Использование gdb для распечатки значений в контрольных точках. Демонстрация концепции по ссылке. fk0(1822 знаков, dao, полностью, 08.11.2019 20:14, ссылка)
- Помимо прочего при нормальном программировании всегда делается какой-то "логгер" ведущий протокол работы программы. Потому, что когда она грохнется не всегда уже можно понять почему. И этот протокол должен выводиться или в какой-либо интерфейс fk0(863 знаков, 10.08.2019 12:43)