powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Логирование данных.
18 сообщений из 18, страница 1 из 1
Логирование данных.
    #39385914
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу на голом С под микроконтролер.
Мне нужно логировать данные. Вот пишу универсальный логер. Натраиваю куда писать (SD, Flash, UART) и какие данные писать. Я планирую передавать указатель на переменную или структуру которые надо логировать. Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше. И тут я застрял.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
void LOG_Send(uint32_t storage, void *data, uint32_t size)
{
    uint8_t buf[size]; //size of data???
    uint32_t i = 0;
    while (data)
    {
        buf[i++] = (uint8_t *)(*data++);
    }
    
    switch (storage)
    {
        case SD:
          SD_Log("log.txt", buf);
        break;
        case FLASH:
          Flash_Log(log_addr, buf);
        break;
        case UART:
          UART_SendString(UART2, buf);
        break;
    }
}


В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов.
...
Рейтинг: 0 / 0
Логирование данных.
    #39385920
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без буферизации и асинхронной записи далеко не уедешь.
Но пока тебе до этого далеко.

Пока у тебя проблема, что ни *data ни data++ не определены, т.к data - void*
...
Рейтинг: 0 / 0
Логирование данных.
    #39385946
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SiemarglБез буферизации и асинхронной записи далеко не уедешь.
Но пока тебе до этого далеко.

Пока у тебя проблема, что ни *data ни data++ не определены, т.к data - void*

я заранее не знаю тип данных. это может быть int, float или struct. пользователь конфигурирует что и куда логировать.
...
Рейтинг: 0 / 0
Логирование данных.
    #39385967
ermak.nn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7, в этом случае все равно надо использовать либо char* (приведение data к char*), как в большинстве случаев делается, либо выравненные данные. void* не выравнен. Это первая проблема.
Вторая проблема - это то, что в C нельзя выделить массив на стеке с произвольным размером
Код: plaintext
1.
    uint8_t buf[size]; //size of data???
...
Рейтинг: 0 / 0
Логирование данных.
    #39385976
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ermak.nnjenya7, в этом случае все равно надо использовать либо char* (приведение data к char*), как в большинстве случаев делается, либо выравненные данные. void* не выравнен. Это первая проблема.
[/src]
поэтому я делаю приведение типов. обычная процедура.

ermak.nnjenya7,
Вторая проблема - это то, что в C нельзя выделить массив на стеке с произвольным размером
Код: plaintext
1.
    uint8_t buf[size]; //size of data???


В IAR есть опция allow VLA (variable length array).
...
Рейтинг: 0 / 0
Логирование данных.
    #39385978
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
приведение к char дает ту же ошибку
Error[Pe852]: expression must be a pointer to a complete object type
...
Рейтинг: 0 / 0
Логирование данных.
    #39386023
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
посоветовали сделать так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 char buf[size]; //size of data???
    char *data_p = data;
    uint32_t i = 0;
    while (data)
    {
        buf[i++] = (*data_p++);
    }
...
Рейтинг: 0 / 0
Логирование данных.
    #39386042
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов.вторая звёздочка не там стоит))
...
Рейтинг: 0 / 0
Логирование данных.
    #39386059
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychjenya7В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов.вторая звёздочка не там стоит))
точно. нужно так buf[i++] = (*(char*)data)++;
...
Рейтинг: 0 / 0
Логирование данных.
    #39386111
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Пишу на голом С под микроконтролер.
Мне нужно логировать данные. Вот пишу универсальный логер.

Как бы полно уже готовых библиотек для логирования написано для С или С++,
стоит ли делать ещё одну ? Если и стоит, то наверное уж не в таком убогом виде...
...
Рейтинг: 0 / 0
Логирование данных.
    #39386116
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7точно. нужно так buf[i++] = (*(char*)data)++;а теперь ++ не там, кмк ))
...
Рейтинг: 0 / 0
Логирование данных.
    #39386122
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivjenya7Пишу на голом С под микроконтролер.
Мне нужно логировать данные. Вот пишу универсальный логер.

Как бы полно уже готовых библиотек для логирования написано для С или С++,
стоит ли делать ещё одну ? Если и стоит, то наверное уж не в таком убогом виде...

я готовых не нашел для ембедед.
...
Рейтинг: 0 / 0
Логирование данных.
    #39386124
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychjenya7точно. нужно так buf[i++] = (*(char*)data)++;а теперь ++ не там, кмк ))
тогда так buf[i++] = ((*(char*)data))++; ))
...
Рейтинг: 0 / 0
Логирование данных.
    #39386126
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вобще то можно сделать так наверное
memcpy(buf, data, sizeof (data));
...
Рейтинг: 0 / 0
Логирование данных.
    #39386148
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше.
Дальше всё зависит от цели записи этих данных. Возможно, файл лога может быть текстовым и тогда их надо сериализовывать в текст обычными fprintf().
...
Рейтинг: 0 / 0
Логирование данных.
    #39386209
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovjenya7Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше.
Дальше всё зависит от цели записи этих данных. Возможно, файл лога может быть текстовым и тогда их надо сериализовывать в текст обычными fprintf().
если я логирую на SD то просто вставил в комп и прочитал. а вот если я логирую во флеш тут уже нужны танцы с бубном.
...
Рейтинг: 0 / 0
Логирование данных.
    #39386216
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jenya7вобще то можно сделать так наверное
memcpy(buf, data, sizeof (data));
Наверное не прокатит , потому как sizeof (data)
вернет размер указателя, а не размер памяти, на который он указывает.
И вобще sizeof - макрос вычисляемый во время компиляции , а не функция.
...
Рейтинг: 0 / 0
Логирование данных.
    #39386235
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
д0kХjenya7вобще то можно сделать так наверное
memcpy(buf, data, sizeof (data));
Наверное не прокатит , потому как sizeof (data)
вернет размер указателя, а не размер памяти, на который он указывает.
И вобще sizeof - макрос вычисляемый во время компиляции , а не функция.
да. с размером придется разбираться до передачи его в качестве аргумента.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Логирование данных.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]