реклама на сайте
подробности

 
 
> Логирование данных в файл.
Jenya7
сообщение Mar 20 2018, 09:02
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



У меня по всему коду разбросанны сообщения типа
printf ("LIB ID = %d\n", lib_id);
сообщения выводятся серийно на терминал.

Сейчас нужно некоторые сообщения логировать в файл на SD карте.
Возникли вопросы по алгоритмике логирования данных
1. Прежде всего проверить есть ли место на SD - вопрос как это сделать? и если нет места? очистить файл и начать писать сначала?
2. Если файл открыт - добавить данные в файл, посмотреть флаг закрыть файл или нет.(я не хочу часто дергать файл - открывать\закрывать)
тогда что - держать глобальный указатель на файл?
3.Если файл закрыт - открыть с опцией "а+", добавить данные в файл, посмотреть флаг закрыть файл или нет.
Как вообще сделать покрасивше?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexandrY
сообщение Mar 20 2018, 10:40
Сообщение #2


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Jenya7 @ Mar 20 2018, 11:02) *
Как вообще сделать покрасивше?

Я исследовал быстродействие FatFS.
Результаты
Как видно время открытия и закрытия не такое уж критичное.
Поэтому у меня задача лога всегда открывает и закрывает файл после каждой инспекции очереди сообщений. Задача лога имеет самый низкий приоритет.
Очередь сообщений циклическая, особое внимание требует разруливание ситуаций переполнения очереди, поскольку это частая ошибка когда код начинает случайно логить в цикле.
А вот операция получения объема свободного места очень затратная по времени.
Так же не рекомендую создавать много мелких файлов, это увеличит время открытия и закрытия файлов.
Надо также думать сколько открытых файлов может одновременно поддерживать файловая система и сколько это занимает памяти.
Лучше не держать долго открытые файлы. Тогда лог будет иметь меньше влияния на остальной код который тоже может применять FS.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 20 2018, 10:50
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(AlexandrY @ Mar 20 2018, 15:40) *
Я исследовал быстродействие FatFS.
Результаты
Как видно время открытия и закрытия не такое уж критичное.
Поэтому у меня задача лога всегда открывает и закрывает файл после каждой инспекции очереди сообщений. Задача лога имеет самый низкий приоритет.
Очередь сообщений циклическая, особое внимание требует разруливание ситуаций переполнения очереди, поскольку это частая ошибка когда код начинает случайно логить в цикле.
А вот операция получения объема свободного места очень затратная по времени.
Так же не рекомендую создавать много мелких файлов, это увеличит время открытия и закрытия файлов.
Надо также думать сколько открытых файлов может одновременно поддерживать файловая система и сколько это занимает памяти.
Лучше не держать долго открытые файлы. Тогда лог будет иметь меньше влияния на остальной код который тоже может применять FS.

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

Сообщение отредактировал Jenya7 - Mar 20 2018, 10:50
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 12:00
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Mar 20 2018, 12:50) *
так все таки с очередями лучше чем первый вариант? я не вижу существенной разницы. только в первый вариант нужно добавить семафор.

Если у вас суперцикл - разницы нет.
Если многозадачная ОС - без понимания работы в многопоточном окружении можете писать только шлак.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 20 2018, 12:14
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Mar 20 2018, 17:00) *
Если у вас суперцикл - разницы нет.
Если многозадачная ОС - без понимания работы в многопоточном окружении можете писать только шлак.

у меня ОС с задачами. выделить одну задачу на забор пакетов из очереди и записи в файл? я SD не задушу потоком сообщений?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 12:28
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Mar 20 2018, 14:14) *
у меня ОС с задачами. выделить одну задачу на забор пакетов из очереди и записи в файл?

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

Цитата(Jenya7 @ Mar 20 2018, 14:24) *
какие? только не говорите sprintf sm.gif

Нет.
Я говорил уже не раз на форуме: stdlib IAR-а (и многих других компиляторов) имеет внутреннюю функцию:
extern "C" int _Printf( void *(*)(void *, int), void *, const char *, va_list *);
Она не декларирована в IAR-овских хидерах, но все прочие декларированные вовне printf, sprintf, vsprintf и всё это семейство внутри вызывают именно её.
Она обладает максимальными возможностями из всего этого семейства printf*, включает всё.
Я у себя в проектах IAR использую только её. И никаких других sprintf() или чего-то ещё.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 20 2018, 12:31
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(jcxz @ Mar 20 2018, 17:24) *
Как тут уже сказали - должна быть отдельная задача, которая вычитывает данные из очереди и пишет их в файл.
Но кроме того, и многозадачное добавление данных в очередь тоже должно быть потокобезопасным.

а я вот туплю - как инициализировать семафор. я пользовался уже готовыми semTake, semGive.

Цитата(jcxz @ Mar 20 2018, 17:28) *
Нет.
Я говорил уже не раз на форуме: stdlib IAR-а (и многих других компиляторов) имеет внутреннюю функцию:
extern "C" int _Printf( void *(*)(void *, int), void *, const char *, va_list *);
Она не декларирована в IAR-овских хидерах, но все прочие декларированные вовне printf, sprintf, vsprintf и всё это семейство внутри вызывают именно её.
Она обладает максимальными возможностями из всего этого семейства printf*, включает всё.
Я у себя в проектах IAR использую только её. И никаких других sprintf() или чего-то ещё.

вы уж меня извините но тащить этого монстра в свой проект я не буду. sm.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 12:38
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Jenya7 @ Mar 20 2018, 14:30) *
а я вот туплю - как инициализировать семафор. я пользовался уже готовыми semTake, semGive.

Я не знаю как это делать в vxWork - не использовал её.
Но да - потокобезопасное добавление данных в очередь можно сделать на базе семафора. Это один из вариантов.
Другие варианты: а) критическая секция; б) интерфейс на базе аналога InterlockedCompareExchangePointer() + дин.память; в)...?

Цитата(Jenya7 @ Mar 20 2018, 14:31) *
вы уж меня извините но тащить этого монстра в свой проект я не буду. sm.gif

В смысле?? wacko.gif
А это разве не Ваше?:
Цитата(Jenya7 @ Mar 20 2018, 11:02) *
У меня по всему коду разбросанны сообщения типа
printf ("LIB ID = %d\n", lib_id);

Читайте внимательнее мои посты:
Любая printf*-функция внутри вызывает _Printf() (в IAR). Воспользуйтесь отладчиком чтобы убедиться.
Так что Вы затащили ещё большего "монстра" к себе biggrin.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Логирование данных в файл.   Mar 20 2018, 09:02
- - RobFPGA   Приветствую! Цитата(Jenya7 @ Mar 20 2018,...   Mar 20 2018, 09:43
- - HardEgor   Цитата(Jenya7 @ Mar 20 2018, 16:02) Сейча...   Mar 20 2018, 09:48
- - haker_fox   QUOTE (Jenya7 @ Mar 20 2018, 17:02) 1. Пр...   Mar 20 2018, 10:01
- - Jenya7   Если подвести итог вышесказанному получиться что т...   Mar 20 2018, 10:12
|- - andrew_b   Цитата(Jenya7 @ Mar 20 2018, 13:12) Код c...   Mar 20 2018, 11:25
||- - Jenya7   Цитата(andrew_b @ Mar 20 2018, 16:25) Что...   Mar 20 2018, 12:01
||- - andrew_b   Цитата(Jenya7 @ Mar 20 2018, 15:01) IAR д...   Mar 20 2018, 12:13
||- - jcxz   Цитата(andrew_b @ Mar 20 2018, 14:13) Есл...   Mar 20 2018, 12:21
||- - Jenya7   Цитата(jcxz @ Mar 20 2018, 17:21) IAR име...   Mar 20 2018, 12:24
|- - haker_fox   QUOTE (Jenya7 @ Mar 20 2018, 18:12) я не ...   Mar 20 2018, 13:02
|- - RobFPGA   Приветствую! Цитата(haker_fox @ Mar 20 20...   Mar 20 2018, 13:08
|- - jcxz   Цитата(RobFPGA @ Mar 20 2018, 15:08) логр...   Mar 20 2018, 13:15
|- - RobFPGA   Приветствую! Цитата(jcxz @ Mar 20 2018, ...   Mar 20 2018, 13:30
|- - jcxz   Цитата(RobFPGA @ Mar 20 2018, 15:30) Вобщ...   Mar 20 2018, 15:10
|- - RobFPGA   Приветствую! Цитата(jcxz @ Mar 20 2018, 1...   Mar 20 2018, 15:30
|- - jcxz   Цитата(RobFPGA @ Mar 20 2018, 17:30) Но е...   Mar 20 2018, 15:57
|- - RobFPGA   Приветствую! Цитата(jcxz @ Mar 20 2018, ...   Mar 20 2018, 16:56
|- - Jenya7   Цитата(jcxz @ Mar 20 2018, 17:38) Я не зн...   Mar 20 2018, 12:53
|- - jcxz   Цитата(Jenya7 @ Mar 20 2018, 14:53) но в ...   Mar 20 2018, 12:59
- - k155la3   Цитата(Jenya7 @ Mar 20 2018, 12:02) У мен...   Mar 20 2018, 12:13
- - haker_fox   QUOTE (jcxz @ Mar 20 2018, 21:15) Заказан...   Mar 21 2018, 01:43
- - AlexandrY   Цитата(haker_fox @ Mar 21 2018, 03:43) Оп...   Mar 21 2018, 05:51
- - jcxz   Цитата(haker_fox @ Mar 21 2018, 03:43) Оп...   Mar 21 2018, 08:39


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016