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

 
 
> Логирование данных.
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
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 17 2017, 12:21
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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
esaulenka
сообщение Jan 17 2017, 14:19
Сообщение #3


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Сергей Борщ @ Jan 17 2017, 15:21) *
Следующий шаг:
Код
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)) и связанных с этим ошибок.

Не-а. Следующий шаг - это разобраться, зачем вообще копировать данные из data в buf.


Цитата(Сергей Борщ @ Jan 17 2017, 15:21) *
Но противники плюсов будут привычно ныть об "увеличении объема кода и подъедании ограниченных ресурсов".

Да пусть ноют. Какой смысл спорить с людьми, ни устриц не видели, ни Пастернака не читали?

Цитата(Эдди @ Jan 17 2017, 13:31) *
скажем, на 32-битной системе int16_t скорее всего будут с выравниванием по 4 лежать

А можно примеры таких систем? Они ведь очень широко распространены, правда?


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Эдди
сообщение Jan 17 2017, 14:27
Сообщение #4


Знающий
****

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



Цитата(esaulenka @ Jan 17 2017, 17:19) *
Да пусть ноют. Какой смысл спорить с людьми, ни устриц не видели, ни Пастернака не читали?

Если даже абстрагироваться от этого, то есть элементарная причина не использовать С++: зачем учить лишний ЯП, если С за глаза хватает? Вы бы еще на go каком-нибудь предложили код написать ☺
Цитата
А можно примеры таких систем? Они ведь очень широко распространены, правда?

Элементарно. У меня была проблема с портированием старого клиент-серверного кода на 64-битную архитектуру с 32-битной: там мало того, что бинарная структура передавалась и в памяти она безо всякого явного выравнивания хранилась, так еще и нестрогие типы данных использовались. Вот во что это в итоге превратилось. Без #pragma pack(push, 4) данные паковались бы с учетом 64-битности (аналогично и со всеми int'ами и т.п. нестрогими типами), в итоге поля структуры совершенно не соответствовали бы описанным позициям.
Благо, обычно little-endian архитектура, а то пришлось бы еще байты туда-сюда распихивать (а ведь бывают процессоры, в которых little-endian отсутствует!).

Еще во всяких граф. и мат. пакетах для ускорения вычислений данные обычно даже в массивах выравнивают по машинному слову. В итоге тоже может веселуха получиться при переходе между архитектурами.

Поэтому если уж работать с бинарными данными, то строго фиксировать их положение.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Jan 17 2017, 16:00
Сообщение #5


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Эдди @ Jan 17 2017, 17:27) *
Если даже абстрагироваться от этого, то есть элементарная причина не использовать С++: зачем учить лишний ЯП, если С за глаза хватает? Вы бы еще на go каком-нибудь предложили код написать ☺

Можно абстрагироваться и ничего не делать вообще совсем, только языком чесать.
(по большому секрету: BTA_lib можно и нужно писать на плюсах. Там даже подвижки к объектной модели есть).

Цитата(Эдди @ Jan 17 2017, 17:27) *
Элементарно. У меня была проблема с портированием старого клиент-серверного кода на 64-битную архитектуру с 32-битной:

Это всё прекрасно. Баек "как сделать плохо" я и сам могу рассказать.
Только я задавал совсем другой вопрос.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Jenya7   Логирование данных.   Jan 17 2017, 09:31
- - novikovfb   Цитата(Jenya7 @ Jan 17 2017, 13:31) В стр...   Jan 17 2017, 09:38
|- - Jenya7   Цитата(novikovfb @ Jan 17 2017, 15:38) da...   Jan 17 2017, 09:47
|- - haker_fox   QUOTE (Jenya7 @ Jan 17 2017, 17:47) то ес...   Jan 17 2017, 10:06
|- - Jenya7   Цитата(haker_fox @ Jan 17 2017, 16:06) Да...   Jan 17 2017, 10:14
- - Эдди   Лучше сериализовать данные, а не передавать их в б...   Jan 17 2017, 10:23
|- - Jenya7   Цитата(Эдди @ Jan 17 2017, 16:23) Лучше с...   Jan 17 2017, 10:27
|- - haker_fox   QUOTE (Эдди @ Jan 17 2017, 18:23) Иначе с...   Jan 17 2017, 10:51
|- - Эдди   Цитата(haker_fox @ Jan 17 2017, 13:51) TC...   Jan 17 2017, 11:08
- - Эдди   Тогда в самом начале сохраняйте информацию о типе ...   Jan 17 2017, 10:31
- - aiwa   Цитата(Jenya7 @ Jan 17 2017, 11:31) В стр...   Jan 17 2017, 10:38
- - Эдди   Еще проще и быстрее по производительности было бы ...   Jan 17 2017, 10:41
|- - Jenya7   Цитата(Эдди @ Jan 17 2017, 16:41) Еще про...   Jan 17 2017, 10:55
- - aiwa   Цитата(Эдди @ Jan 17 2017, 12:41) Еще про...   Jan 17 2017, 10:44
|- - Jenya7   Цитата(Сергей Борщ @ Jan 17 2017, 18:21) ...   Jan 17 2017, 14:02
||- - jorikdima   Цитата(Jenya7 @ Jan 17 2017, 06:02) подоз...   Jan 17 2017, 16:38
||- - Jenya7   Цитата(jorikdima @ Jan 17 2017, 21:38) В ...   Jan 18 2017, 06:46
||- - haker_fox   QUOTE (Jenya7 @ Jan 18 2017, 14:46) потом...   Jan 18 2017, 08:06
||- - Сергей Борщ   QUOTE (Jenya7 @ Jan 18 2017, 08:46) вот е...   Jan 18 2017, 08:53
||- - mdmitry   Цитата(Jenya7 @ Jan 18 2017, 10:46) .... ...   Jan 18 2017, 15:39
||- - Jenya7   Цитата(mdmitry @ Jan 18 2017, 20:39) Посм...   Jan 18 2017, 17:06
|- - Jenya7   Цитата(esaulenka @ Jan 17 2017, 20:19) Не...   Jan 17 2017, 14:26
||- - Сергей Борщ   QUOTE (Эдди @ Jan 17 2017, 16:27) Если да...   Jan 17 2017, 15:03
|||- - Jenya7   Цитата(Сергей Борщ @ Jan 17 2017, 21:03) ...   Jan 17 2017, 15:17
|||- - Эдди   Цитата(Jenya7 @ Jan 17 2017, 18:17) на эт...   Jan 17 2017, 15:23
|||- - Сергей Борщ   QUOTE (Jenya7 @ Jan 17 2017, 17:17) так я...   Jan 17 2017, 16:34
|||- - Jenya7   Цитата(Сергей Борщ @ Jan 17 2017, 22:34) ...   Jan 17 2017, 17:02
||- - Эдди   Цитата(esaulenka @ Jan 17 2017, 19:00) BT...   Jan 17 2017, 16:28
|- - zltigo   Цитата(esaulenka @ Jan 17 2017, 16:19) А ...   Jan 18 2017, 18:40
|- - Сергей Борщ   QUOTE (zltigo @ Jan 18 2017, 20:40) Поско...   Jan 18 2017, 19:16
- - Jenya7   кстати а как мне вычислить размер void *data? size...   Jan 17 2017, 14:38
|- - Сергей Борщ   QUOTE (Jenya7 @ Jan 17 2017, 16:38) кстат...   Jan 17 2017, 14:52
|- - Jenya7   Цитата(Сергей Борщ @ Jan 17 2017, 20:52) ...   Jan 17 2017, 14:59
|- - Эдди   Цитата(Сергей Борщ @ Jan 17 2017, 17:52) ...   Jan 17 2017, 15:11
- - Jenya7   сделал такую структуру. Кодtypedef struct LOG_PAR...   Jan 17 2017, 16:17
- - Сергей Борщ   QUOTE (Эдди @ Jan 17 2017, 17:11) 32-битн...   Jan 17 2017, 16:23
- - aiwa   Цитата(Эдди @ Jan 17 2017, 16:27) Если да...   Jan 18 2017, 22:54


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

 


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


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