|
|
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
Пишу на голом С под микроконтролер. Мне нужно логировать данные. Вот пишу универсальный логер. Натраиваю куда писать (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. В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 11:29 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
Без буферизации и асинхронной записи далеко не уедешь. Но пока тебе до этого далеко. Пока у тебя проблема, что ни *data ни data++ не определены, т.к data - void* ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 11:35 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
SiemarglБез буферизации и асинхронной записи далеко не уедешь. Но пока тебе до этого далеко. Пока у тебя проблема, что ни *data ни data++ не определены, т.к data - void* я заранее не знаю тип данных. это может быть int, float или struct. пользователь конфигурирует что и куда логировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 11:52 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7, в этом случае все равно надо использовать либо char* (приведение data к char*), как в большинстве случаев делается, либо выравненные данные. void* не выравнен. Это первая проблема. Вторая проблема - это то, что в C нельзя выделить массив на стеке с произвольным размером Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 12:13 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
ermak.nnjenya7, в этом случае все равно надо использовать либо char* (приведение data к char*), как в большинстве случаев делается, либо выравненные данные. void* не выравнен. Это первая проблема. [/src] поэтому я делаю приведение типов. обычная процедура. ermak.nnjenya7, Вторая проблема - это то, что в C нельзя выделить массив на стеке с произвольным размером Код: plaintext 1. В IAR есть опция allow VLA (variable length array). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 12:19 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
приведение к char дает ту же ошибку Error[Pe852]: expression must be a pointer to a complete object type ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 12:21 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
посоветовали сделать так Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 13:06 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов.вторая звёздочка не там стоит)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 13:28 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
egorychjenya7В строке buf[i++] = (uint8_t *)(*data++); ругается на приведение типов.вторая звёздочка не там стоит)) точно. нужно так buf[i++] = (*(char*)data)++; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 13:50 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7Пишу на голом С под микроконтролер. Мне нужно логировать данные. Вот пишу универсальный логер. Как бы полно уже готовых библиотек для логирования написано для С или С++, стоит ли делать ещё одну ? Если и стоит, то наверное уж не в таком убогом виде... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:42 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7точно. нужно так buf[i++] = (*(char*)data)++;а теперь ++ не там, кмк )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:49 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
MasterZivjenya7Пишу на голом С под микроконтролер. Мне нужно логировать данные. Вот пишу универсальный логер. Как бы полно уже готовых библиотек для логирования написано для С или С++, стоит ли делать ещё одну ? Если и стоит, то наверное уж не в таком убогом виде... я готовых не нашел для ембедед. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 14:58 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
egorychjenya7точно. нужно так buf[i++] = (*(char*)data)++;а теперь ++ не там, кмк )) тогда так buf[i++] = ((*(char*)data))++; )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 15:00 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
вобще то можно сделать так наверное memcpy(buf, data, sizeof (data)); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 15:02 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше. Дальше всё зависит от цели записи этих данных. Возможно, файл лога может быть текстовым и тогда их надо сериализовывать в текст обычными fprintf(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 15:28 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovjenya7Но как быть дальше? Данные надо сериализовать (упаковать в массив) для передачи дальше. Дальше всё зависит от цели записи этих данных. Возможно, файл лога может быть текстовым и тогда их надо сериализовывать в текст обычными fprintf(). если я логирую на SD то просто вставил в комп и прочитал. а вот если я логирую во флеш тут уже нужны танцы с бубном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 16:25 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
jenya7вобще то можно сделать так наверное memcpy(buf, data, sizeof (data)); Наверное не прокатит , потому как sizeof (data) вернет размер указателя, а не размер памяти, на который он указывает. И вобще sizeof - макрос вычисляемый во время компиляции , а не функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 16:33 |
|
||
|
Логирование данных.
|
|||
|---|---|---|---|
|
#18+
д0kХjenya7вобще то можно сделать так наверное memcpy(buf, data, sizeof (data)); Наверное не прокатит , потому как sizeof (data) вернет размер указателя, а не размер памяти, на который он указывает. И вобще sizeof - макрос вычисляемый во время компиляции , а не функция. да. с размером придется разбираться до передачи его в качестве аргумента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.01.2017, 16:56 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39385920&tid=1340512]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
220ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 495ms |

| 0 / 0 |
