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

 
 
> Логирование данных в файл.
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
andrew_b
сообщение Mar 20 2018, 11:25
Сообщение #3


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Mar 20 2018, 13:12) *
Код
    char buff[256] = { '\0' };
     strcat(buff, message);
     strcat(buff, sval);


Что, 255 байт хватит всем?
Никогда не используйте функции, не контролирующие выход за границу буфера. Используйте strncat, уж если на то пошло. Или strlcat.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Mar 20 2018, 12:01
Сообщение #4


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

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



Цитата(andrew_b @ Mar 20 2018, 16:25) *
Что, 255 байт хватит всем?
Никогда не используйте функции, не контролирующие выход за границу буфера. Используйте strncat, уж если на то пошло. Или strlcat.

IAR давал мне возможность
Код
int size = strlen(message);
char buff[size ] = { '\0' };

в vxWorks я такую возможность не нашел вот и извращаюсь. динамическую алокацию отвергаю по возможности.

Сообщение отредактировал Jenya7 - Mar 20 2018, 12:11
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Mar 20 2018, 12:13
Сообщение #5


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

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(Jenya7 @ Mar 20 2018, 15:01) *
IAR давла мне возможность
Код
int size = strlen(message);
char buff[size ] = { '\0' };

в vxWorks я такую возможность не нашел
Это C99 как минимум.
Цитата
вот и извращаюсь. динамическую алокацию отвергаю по возможности.

Вы не поняли.
Если вы выделили под сообщение буфер определённого размера, то strncat не позволит выйти за границу буфера. Она просто обрежет сообщение по длине.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 20 2018, 12:21
Сообщение #6


Гуру
******

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



Цитата(andrew_b @ Mar 20 2018, 14:13) *
Если вы выделили под сообщение буфер определённого размера, то strncat не позволит выйти за границу буфера. Она просто обрежет сообщение по длине.

IAR имеет более эффективные средства печати в буфер (в памяти) ограниченного размера, чем собирать его strncat() или чем то ещё.
Т.е. - естественно не сам IAR, а stdlib которую он использует.
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   Цитата(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
- - 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 Текстовая версия Сейчас: 20th July 2025 - 09:43
Рейтинг@Mail.ru


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