Хочу поделится простым способом для отладки приложения на основе макросов.
Отлаживая USB или Ethernet проходит огромное количество вызовов функций и чтобы во всем этом разбираться надо просто логировать так , чтобы было сразу понятно из какой функции вызывается текущая функция и какие функции она вызывает по ходу выполнения программы.
Мучаясь с отладкой LWIP я пришел лично к одному простому варианту. Он подходит для чужого кода , в котором надо быстро разобраться.
Делаем сначала хедер h с нашими двумя макросами и его с файл:
myDebug.h
#define PRINTF_LEFT(num) for( uint8_t ii = 0 ; ii < num ; ii++ ){ \
printf(" "); }
#define PRINTF_FILL(num,str) for( uint8_t ii = 0 ; ii < num ; ii++ ){ \
printf("%s",str); }
#define PRINTF(num,message) PRINTF_LEFT(num); \
printf message
extern volatile uint32_t LEFT_MARGIN;
#ifdef DEBUG_FUNC_CALLS
#define ENTER_FUNC(name) { \
taskENTER_CRITICAL(); \
LEFT_MARGIN ++; \
PRINTF(0,("\n%d : " , xTaskGetTickCount())); \
PRINTF_FILL(LEFT_MARGIN<<2,"-");\
printf(" > %s\n",name); \
taskEXIT_CRITICAL(); \
}
#define EXIT_FUNC(name) { \
taskENTER_CRITICAL(); \
PRINTF(0,("%d : " , xTaskGetTickCount())); \
if(LEFT_MARGIN==0) { \
PRINTF(LEFT_MARGIN,("stop LEFT_MARGIN=%d" , LEFT_MARGIN)); \
PRINTF(0,("\n")); \
while(1) ; \
} \
PRINTF_FILL(LEFT_MARGIN<<2,"-");\
printf(" < %s\n",name); \
LEFT_MARGIN--; \
taskEXIT_CRITICAL(); \
}
#else
#define ENTER_FUNC(name)
#define EXIT_FUNC(name)
#endif
myDebug.c
Тут только одна строка будет. Это глобальная переменная для учета количества входов в функции и выходов из них.
volatile uint32_t LEFT_MARGIN = 0;
Далее в любом коде , выполнение которого вас интересует в самом начале прописываем макрос ENTER_FUNC(__func__) , а в конце функции и перед всеми return из функции прописываем EXIT_FUNC(__func__) .
И вот примерный результат лога (небольшой кусок):
47026 : -------------------------------- > tcp_close_shutdown
47026 : ------------------------------------ > tcp_send_fin
47026 : ------------------------------------ < tcp_send_fin
47027 : ------------------------------------ > tcp_output
47027 : ------------------------------------ < tcp_output
47027 : -------------------------------- < tcp_close_shutdown
47027 : ---------------------------- < http_close_or_abort_conn
47028 : ------------------------ < http_eof
47028 : -------------------- < http_send
47028 : ---------------- < http_recv
По-моему очень нативно и понятно где мы находимся и что делает программа.