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

 
 
> Логирование данных в файл.
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
Ответов
Jenya7
сообщение Mar 20 2018, 10:12
Сообщение #2


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

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



Если подвести итог вышесказанному получиться что то такое
Код
FILE *g_log_fp;
int g_log_file_size;

void LOG_LogMessage(char *file, char *message, int value, int close)
{
    int file_size = 0;
    
    char buff[256] = { '\0' };
    char sval[10];
    
    ItoA(value, sval);
    strcat(buff, message);
    strcat(buff, sval);

    if (g_log_fp == NULL)
    {
        g_log_fp = fopen(file, "a+");
        
        if (g_log_fp != NULL)
            fputs(buff, g_log_fp);
    }
    else
        fputs(buff, g_log_fp);
    
    fseek(g_log_fp, 0, SEEK_SET);
    fseek(g_log_fp, 0, SEEK_END);
    file_size = ftell(g_log_fp);
            
    if (close)
        fclose(g_log_fp);
    else
        fflush(g_log_fp);
    
    if (file_size >= MAX_LOG_FILE_SIZE)
    {
        //LOG_Clear() ???
        //go to the next file ???
    }    
}

или я что то упустил в логике?

или через очередь ?
Код
char log_buffer[1024];
MSG_Q_ID log_messages_Q;

void LOG_Init(void)
{
    log_messages_Q = msgQCreate(100, 1024, 0);
}

void LOG_SengQ(char *message, int value)
{
    int size = strlen(message) + 4; //4 - for value
    char sval[10];
    
    log_buffer[0] = '\0';
    
    ItoA(value, sval);
    strcat(log_buffer, message);
    strcat(log_buffer, sval);
    
    msgQSend(log_messages_Q, log_buffer, size, NO_WAIT, MSG_PRI_NORMAL);
}

и потом в отдельном потоке msgQReceive(log_messages_Q, log_buffer, 1024, NO_WAIT); ?

я не думаю что очередь дает какие то преимущества.

Сообщение отредактировал Jenya7 - Mar 20 2018, 10:29
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Mar 20 2018, 13:02
Сообщение #3


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (Jenya7 @ Mar 20 2018, 18:12) *
я не думаю что очередь дает какие то преимущества.

Эстетические) Процессы асинхронно просто вызывают некую функцию
CODE
pushMsgToLog(...)
, которая уже внутри помещает сообщение в очередь. Получается естественно.
Другая задача асинхронно читает очередь, и получив очередное сообщение, форматирует его, готовит к записи в соответствующий файл.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 20 2018, 13:08
Сообщение #4


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!
Цитата(haker_fox @ Mar 20 2018, 16:02) *
Эстетические) ...

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

Удачи! Rob.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 13:15
Сообщение #5


Гуру
******

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



Цитата(RobFPGA @ Mar 20 2018, 15:08) *
логровать например из прерываний или из других нехороших мест куда обычному printf вход заказан.

Заказан кем? Достаточный размер стека и... вуаля! - sprintf прекрасно работает и из ISR. rolleyes.gif
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 20 2018, 13:30
Сообщение #6


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!

Цитата(jcxz @ Mar 20 2018, 16:15) *
Заказан кем? Достаточный размер стека и... вуаля! - sprintf прекрасно работает и из ISR. rolleyes.gif

Вобще то printf и sprintf это немного разные пчелы - жужжат по разному.
И стек этот наверное прямо в мозгу программиста будет - чтобы инфу получал без IO функций. wacko.gif

Удачи! Rob.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 15:10
Сообщение #7


Гуру
******

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



Цитата(RobFPGA @ Mar 20 2018, 15:30) *
Вобще то printf и sprintf это немного разные пчелы - жужжат по разному.
И стек этот наверное прямо в мозгу программиста будет - чтобы инфу получал без IO функций. wacko.gif

Вы не поверите, но практически одинаковые! Так как внутри они почти сразу вызывают указанную мной _Printf().
Только одна в первом аргументе передаёт ей указатель на callback-функцию записи в ОЗУ, а другая - на callback-функцию записи в поток ввода/вывода.
У меня, например, среди прочего _Printf() пишет прямо в поток TCP-сокета (расчленяя вывод на лету на отдельные кадры без промежуточного буфера и поддерживая ретрансмиссию тоже без буфера).
Свои callback-функции для _Printf() невероятно расширяют её возможности. Всё ограничивается только фантазией программиста. rolleyes.gif
А уж тривиальный вывод в буфер ограниченного размера делается через _Printf() на раз.
Go to the top of the page
 
+Quote Post
RobFPGA
сообщение Mar 20 2018, 15:30
Сообщение #8


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

Группа: Свой
Сообщений: 1 214
Регистрация: 23-12-04
Пользователь №: 1 643



Приветствую!
Цитата(jcxz @ Mar 20 2018, 18:10) *
Вы не поверите, но практически одинаковые! Так как внутри они почти сразу вызывают указанную мной _Printf().
Только одна в первом аргументе передаёт ей указатель на callback-функцию записи в ОЗУ, а другая - на callback-функцию записи в поток ввода/вывода.

Да неужели? поверю Вам на слово sm.gif
Но если они для Вас так одинаковы - что мешает Вам использовать printf в прерывании?

Цитата(jcxz @ Mar 20 2018, 18:10) *
У меня, например, среди прочего _Printf() пишет прямо в поток TCP-сокета (расчленяя вывод на лету на отдельные кадры без промежуточного буфера и поддерживая ретрансмиссию тоже без буфера).
Свои callback-функции для _Printf() невероятно расширяют её возможности. Всё ограничивается только фантазией программиста. rolleyes.gif
А уж тривиальный вывод в буфер ограниченного размера делается через _Printf() на раз.

То есть пока ACK для сегмента не получим из printf не уйдем ?
Да уж - фантазия программиста страшная штука - но моя только заставляла меня свои _Printf() писать падла wink.gif

Удачи! Rob.
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
|- - 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
|- - jcxz   Цитата(RobFPGA @ Mar 20 2018, 17:30) Но е...   Mar 20 2018, 15:57
|- - RobFPGA   Приветствую! Цитата(jcxz @ Mar 20 2018, ...   Mar 20 2018, 16:56
- - AlexandrY   Цитата(Jenya7 @ Mar 20 2018, 11:02) Как в...   Mar 20 2018, 10:40
|- - Jenya7   Цитата(AlexandrY @ Mar 20 2018, 15:40) Я ...   Mar 20 2018, 10:50
|- - jcxz   Цитата(Jenya7 @ Mar 20 2018, 12:50) так в...   Mar 20 2018, 12:00
|- - Jenya7   Цитата(jcxz @ Mar 20 2018, 17:00) Если у ...   Mar 20 2018, 12:14
|- - jcxz   Цитата(Jenya7 @ Mar 20 2018, 14:14) у мен...   Mar 20 2018, 12:28
|- - Jenya7   Цитата(jcxz @ Mar 20 2018, 17:24) Как тут...   Mar 20 2018, 12:31
|- - jcxz   Цитата(Jenya7 @ Mar 20 2018, 14:30) а я в...   Mar 20 2018, 12:38
|- - 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 Текстовая версия Сейчас: 15th July 2025 - 19:33
Рейтинг@Mail.ru


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