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

 
 
 
Reply to this topicStart new topic
> функция (макрос?) DEBUG, отправка сообщений в порт
toweroff
сообщение Sep 20 2015, 18:10
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Добрый вечер!

Хочется реализовать дебажную функцию, чтобы было что-то типа

DEBUG("Var rct=%d\n", rct);

в общем аналог printf

Все упирается в то, что fputc уже переопределен для других целей. Нужно как-то в этой DEBUG задействовать sprintf и отправлять это дело по дебажному USART

Подскажите, как? Или как вообще такие вещи делаются? Где-то встречал подобное некоторое время назад, да позабыл где, никак не найду sad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 20 2015, 18:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Код
#include <stdarg.h>

char buff[12345];

int my_printf(const char *fmt, ...)
{
     va_list ap;
     int n = 0;

     va_start(ap, fmt);
     if((n = vsnprintf(buff, sizeof(buff), fmt, ap)) > 0)
     {
         // Отправляем строку
     }
     va_end(ap);
     return n;
}
Go to the top of the page
 
+Quote Post
toweroff
сообщение Sep 20 2015, 19:08
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Спасибо!
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Sep 20 2015, 19:35
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(toweroff @ Sep 20 2015, 19:10) *
Добрый вечер!

Хочется реализовать дебажную функцию, чтобы было что-то типа

DEBUG("Var rct=%d\n", rct);

в общем аналог printf
Подскажите, как? Или как вообще такие вещи делаются? Где-то встречал подобное некоторое время назад, да позабыл где, никак не найду sad.gif


Google: "variadic macros"
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 20 2015, 20:00
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (CrimsonPig @ Sep 20 2015, 22:35) *
Google: "variadic macros"

Это для другого - для обертки функций с переменным числом аргуменов в макросы. Тоже, конечно, удобно для отладочных макросов, например:
CODE
#define dprintf( debug_flags, args ... ) if( debug_flags & debug_config ){ xprintf( args ); }

но не то, что хотел Автор.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Sep 20 2015, 20:06
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(zltigo @ Sep 20 2015, 21:00) *
Это для другого - для обертки функций с переменным числом аргуменов в макросы. Тоже, конечно, удобно для отладочных макросов, например:
но не то, что хотел Автор.


Ну не знаю, чего ТС конкретно хотел, но получить макросы (с разделением debug/release) и работающие как printf (с переменным числом параметров) это точно к variadic macros.
а что уж внутри делать с va_arg, это как пойдет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 20 2015, 20:06
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aaarrr @ Sep 20 2015, 21:39) *
CODE
     int n = 0;
}

"= 0" глаз режет sad.gif.
Ну и в общем лишний промежуточный буфер, который в общем случае очевидно придется перекидывать в какой-то другой, который уже будет разгружаться.



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 20 2015, 20:13
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(zltigo @ Sep 20 2015, 23:06) *
"= 0" глаз режет sad.gif .

Лишний, да. Просто код выкорчевал неаккуратно.

Цитата(zltigo @ Sep 20 2015, 23:06) *
Ну и в общем лишний промежуточный буфер, который в общем случае очевидно придется перекидывать в какой-то другой, который уже будет разгружаться.

ТС хотел sprintf, пример дан.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Sep 20 2015, 20:18
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (aaarrr @ Sep 20 2015, 23:13) *
ТС хотел sprintf, пример дан.

В принципе годится, просто указатель буфера vsnprintf() двигать нужно в буфере. Тогда этот-же буфер и для разгрузки использовать можно.
P.S.
Я для отладки использую свой простенький, но зато максимально быстрый "printf()".


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:36
Рейтинг@Mail.ru


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