SOC常用的debug宏

该代码段展示了在嵌入式系统中使用SEGGER_RTT库进行调试日志输出的一系列宏定义,包括初始化、字符串输出、错误处理、指针检查、变参数打印等功能。当宏LOG_RTT_ENABLE开启时,这些宏会将日志信息通过SEGGER_RTT写入到终端。
摘要由CSDN通过智能技术生成
#ifndef __LOG_OUT_H__ 
#define __LOG_OUT_H__

#ifdef  LOG_RTT_ENABLE
#include "SEGGER_RTT.h"

#define JBF_DEBUG_LOG_INIT() \
    do                       \
    {                        \
        SEGGER_RTT_Init();   \
    } while (0);

#define JBF_DEBUG_STRING_LOG(STRING) SEGGER_RTT_WriteString(0, RTT_CTRL_TEXT_BRIGHT_WHITE##STRING)
#define JBF_DEBUG_STRING_ERROR(STRING) SEGGER_RTT_WriteString(0, RTT_CTRL_TEXT_BRIGHT_RED##STRING)

#define JBF_DEBUG_ASSERT_PRINTF(filename, line)                                                       \
    do                                                                                                \
    {                                                                                                 \
        SEGGER_RTT_printf(0, RTT_CTRL_TEXT_BRIGHT_RED##"@%s: Line:%d: Abort!!!\r\n", filename, line); \
    } while (0);

#define JBF_DEBUG_POINT_NULL_ERROR(ptr)                                                                                  \
    do                                                                                                                   \
    {                                                                                                                    \
        if (ptr == NULL)                                                                                                 \
        {                                                                                                                \
            (SEGGER_RTT_printf(0, RTT_CTRL_TEXT_BRIGHT_RED##"@%s: Line:%d: NULL !!! %s", __FUNCTION__, __LINE__, #ptr)); \
        }                                                                                                                \
    } while (0);

#define JBF_DEBUG_PRINTF_LOG(format, arg...)                                                       \
    do                                                                                             \
    {                                                                                              \
        SEGGER_RTT_printf(0, RTT_CTRL_TEXT_BRIGHT_GREEN##"@%s: Line:%d:", __FUNCTION__, __LINE__); \
        SEGGER_RTT_printf(0, format, ##arg);                                                       \
    } while (0);

#define JBF_DEBUG_PRINTF_HEX(str, ptr, len)                                                              \
    do                                                                                                   \
    {                                                                                                    \
        int i = 0;                                                                                       \
        SEGGER_RTT_printf(0, RTT_CTRL_TEXT_CYAN##"@%s: Line:%d: Hexs:%s ", __FUNCTION__, __LINE__, str); \
        for (i = 0; i < len; i++)                                                                        \
            SEGGER_RTT_printf(0, "%x ", ptr[i]);                                                         \
        SEGGER_RTT_printf(0, RTT_CTRL_RESET##"\r\n");                                                    \
    } while (0);

#define JBF_DEBUG_PRINTF_HEX_ERROR(str, ptr, len)                                                              \
    do                                                                                                         \
    {                                                                                                          \
        int i = 0;                                                                                             \
        SEGGER_RTT_printf(0, RTT_CTRL_TEXT_BRIGHT_RED##"@%s: Line:%d: Hexs:%s ", __FUNCTION__, __LINE__, str); \
        for (i = 0; i < len; i++)                                                                              \
            SEGGER_RTT_printf(0, "%x ", ptr[i]);                                                               \
        SEGGER_RTT_printf(0, RTT_CTRL_RESET##"\r\n");                                                          \
    } while (0);

#define JBF_DEBUG_PRINTF_ERROR(format, arg...)                                                                  \
    do                                                                                                          \
    {                                                                                                           \
        SEGGER_RTT_printf(0, RTT_CTRL_TEXT_BRIGHT_RED##"@%s: Line:%d:" RTT_CTRL_RESET, __FUNCTION__, __LINE__); \
        SEGGER_RTT_printf(0, format, ##arg);                                                                    \
    } while (0);

#define JBF_DEBUG_PRINTF_TIME(TIMER_T)                                 \
    do                                                                 \
    {                                                                  \
        JBF_DEBUG_PRINTF_LOG("%d/%d/%d %d/%d/%d %d\r\n", TIMER_T.year, \
                             TIMER_T.month,                            \
                             TIMER_T.day,                              \
                             TIMER_T.hour,                             \
                             TIMER_T.minute,                           \
                             TIMER_T.second,                           \
                             TIMER_T.week);                            \
    } while (0);

#else
 
#define JBF_DEBUG_STRING_LOG(STRING)          
#define JBF_DEBUG_STRING_ERROR(STRING)         
#define JBF_DEBUG_POINT_NULL_ERROR(ptr) 
#define JBF_DEBUG_PRINTF_LOG(format, arg...)                      
#define JBF_DEBUG_PRINTF_ERROR(format, arg...)  
#define JBF_DEBUG_PRINTF_TIME(TIMER_T)    
#define JBF_DEBUG_PRINTF_HEX(str, ptr, len)
#define JBF_DEBUG_PRINTF_HEX_ERROR(str, ptr, len)             
#define JBF_DEBUG_ASSERT_PRINTF(filename, line) 
#endif

#endif

如果有条件自带 变参库的话,也可以直接这么搞:

void chkm_Log(
    const char *file,
    const  char *function,
    const int32_t line,
    const char *fmt,...)
{
    va_list args;
    size_t length = 0;
    char log_buffer[1024] = {0};

    snprintf(log_buffer, sizeof(log_buffer), "%s[%s:%s():%d] ",CHECK_LOG_TAG, file, function,line);
    length = strlen(log_buffer);
    va_start(args, fmt);
    vsnprintf(log_buffer + length, sizeof(log_buffer) - length, fmt, args);
    va_end(args);

    size_t total_length = strlen(log_buffer);
    if (total_length > 0 && total_length < (sizeof(log_buffer) - 1)
        && log_buffer[total_length - 1] != '\n'){
        log_buffer[total_length] = '\n';
    }

    printf("%s",log_buffer);
    return;
}

#define chkmLog( fmt, args ... ) chkm_Log(GET_FILE_NAME(__FILE__), __func__, __LINE__, fmt,## args )
#define eLog(fmt, ...)  chkmLog( fmt, ##__VA_ARGS__)
#define wLog(fmt, ...)  chkmLog( fmt, ##__VA_ARGS__)
#define iLog(fmt, ...)  chkmLog( fmt, ##__VA_ARGS__)
#define aLog(fmt, ...)  chkmLog( fmt, ##__VA_ARGS__)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值