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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Логирование данных.
Jenya7
сообщение Jan 17 2017, 09:31
Сообщение #1


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

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



Мне нужно логировать данные. Вот пишу универсальный логер. Натраиваю куда писать (SD, Flash, UART) и какие данные писать. Я планирую передавать указатель на переменную или структуру которые надо логировать. Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше. И тут я застрял.
Код
void LOG_Send(uint32_t storage, void *data, uint32_t size)
{
    char buf[size];  //size of data???
    uint32_t i = 0;
    while (data)
    {
        buf[i++] = (char *)(*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++] = (char *)(*data++); ругается на приведение типов.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jan 17 2017, 09:38
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Jenya7 @ Jan 17 2017, 13:31) *
В строке buf[i++] = (char *)(*data++); ругается на приведение типов.

data имеет тип void*, его инкрементировать нельзя (размер указываемой области не определен). Самое простое - скопировать data в обычный указатель на char и не мучиться.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 17 2017, 09:47
Сообщение #3


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

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



Цитата(novikovfb @ Jan 17 2017, 15:38) *
data имеет тип void*, его инкрементировать нельзя (размер указываемой области не определен). Самое простое - скопировать data в обычный указатель на char и не мучиться.

понял. сделал так.
Код
    char buf[size]; //size of data???
    char *data_p = data;
    uint32_t i = 0;
    while (data)
    {
        buf[i++] = (*data_p++);
    }

кстати а если я логирую во флеш и хочу потом вытащить данные - их надо десириализовать? то есть надо где то хранить информацию о днных которые я логировал?
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 17 2017, 10:06
Сообщение #4


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

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



QUOTE (Jenya7 @ Jan 17 2017, 17:47) *
то есть надо где то хранить информацию о днных которые я логировал?

Да, конечно. В противном случае вы будете иметь сырые данные, которые только на глаз и можно будет разглядеть rolleyes.gif


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 17 2017, 10:14
Сообщение #5


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

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



Цитата(haker_fox @ Jan 17 2017, 16:06) *
Да, конечно. В противном случае вы будете иметь сырые данные, которые только на глаз и можно будет разглядеть rolleyes.gif

понял. спасибо. не все так просто. придется поломать голову.
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 17 2017, 10:23
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Лучше сериализовать данные, а не передавать их в бинарной форме. Как вариант — JSON использовать или просто строки "параметр = значение".
Иначе смена даже разрядности процессора может привести к куче геморроя.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 17 2017, 10:27
Сообщение #7


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

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



Цитата(Эдди @ Jan 17 2017, 16:23) *
Лучше сериализовать данные, а не передавать их в бинарной форме. Как вариант — JSON использовать или просто строки "параметр = значение".
Иначе смена даже разрядности процессора может привести к куче геморроя.

если это SD то да , есть такая возможность. но если это Flash - нужно писать побайтово. я хочу сделать что то универсальное.

Сообщение отредактировал Jenya7 - Jan 17 2017, 10:28
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 17 2017, 10:31
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Тогда в самом начале сохраняйте информацию о типе данных (фиксированном, т.е. не int, а, скажем, int32_t), конечности (big/little/mid), выравнивании (скажем, на 32-битной системе int16_t скорее всего будут с выравниванием по 4 лежать) и количестве данных.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jan 17 2017, 10:38
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Jenya7 @ Jan 17 2017, 11:31) *
В строке buf[i++] = (char *)(*data++); ругается на приведение типов.

Вы приводите к указателю содержимое data, а не data.
Нужно так:
buf[i++] = *((char*)data)++;

Сообщение отредактировал aiwa - Jan 17 2017, 10:42
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 17 2017, 10:41
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Еще проще и быстрее по производительности было бы вызвать memcpy. Хотя, если содержимое data не меняется, то зачем вообще его куда-то копировать?
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jan 17 2017, 10:44
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Эдди @ Jan 17 2017, 12:41) *
Еще проще и быстрее по производительности было бы вызвать memcpy. Хотя, если содержимое data не меняется, то зачем вообще его куда-то копировать?

Или data передавать в функции в качестве аргумента.
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jan 17 2017, 10:51
Сообщение #12


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

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



QUOTE (Эдди @ Jan 17 2017, 18:23) *
Иначе смена даже разрядности процессора может привести к куче геморроя.

Да быть этого не может. Если вы их правильно положите, и правильно извлечёте. TCP/IP пакет - это бинарные данные, а гоняются между всеми возможными платформами.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jan 17 2017, 10:55
Сообщение #13


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

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



Цитата(Эдди @ Jan 17 2017, 16:41) *
Еще проще и быстрее по производительности было бы вызвать memcpy. Хотя, если содержимое data не меняется, то зачем вообще его куда-то копировать?

я заранее не знаю тип данных. это может быть int, float или struct. пользователь конфигурирует что и куда логировать. вобще это в основном показания датчиков или системные ошибки.

кстати да. memcpy (buf, data, sizeof (data)) вполне работает

Сообщение отредактировал Jenya7 - Jan 17 2017, 11:05
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 17 2017, 11:08
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 825
Регистрация: 16-04-15
Из: КЧР, Нижний Архыз
Пользователь №: 86 250



Цитата(haker_fox @ Jan 17 2017, 13:51) *
TCP/IP пакет - это бинарные данные, а гоняются между всеми возможными платформами.

И постоянно вызываются функции вроде htoa и т.п.
Но TCP/IP — понятно, там потоки большие. А вот если данных немного, лучше не заморачиваться.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 17 2017, 12:21
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Следующий шаг:
CODE
template<typename T>
void LOG_Send(uint32_t storage, T const & data)
{
     LOG_Send(storage, &data, sizeof(T));
}
Позволяет писать в каждой точке вызова LOG_send(storage, my_struct) вместо LOG_send(storage, &my_struct, sizeof(my_struct)) и связанных с этим ошибок.
Но противники плюсов будут привычно ныть об "увеличении объема кода и подъедании ограниченных ресурсов".


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


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


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