野火STM32学习笔记--调试技巧

/*信息输出*/
#define EEPROM_DEBUG_ON         0
  • 含义:定义一个调试开关 EEPROM_DEBUG_ON,值为 0。
  • 作用
    • 当 EEPROM_DEBUG_ON 为 0 时,调试信息(EEPROM_DEBUG 宏)不会输出。
    • 当修改为 1 时,启用调试信息输出。
    • 这是一个全局控制,用于在开发和生产环境中切换是否打印调试日志。
#define EEPROM_INFO(fmt,arg...)           printf("<<-EEPROM-INFO->> "fmt"\n",##arg)


示例
EEPROM_INFO("Value = %d", 42);
输出
<<-EEPROM-INFO->> Value = 42
  • 含义:定义一个信息输出宏 EEPROM_INFO,用于打印普通信息。
  • 参数
    • fmt:格式化字符串,类似于 printf 的格式(如 "%d"、"%s")。
    • arg...:可变参数列表,表示传递给格式化字符串的参数。
  • 展开
    • printf("<<-EEPROM-INFO->> "fmt"\n",##arg):
      • 前缀 <<-EEPROM-INFO->> 表示这是 EEPROM 模块的信息日志。
      • fmt 是用户指定的格式化内容。
      • \n 确保每条信息换行。
      • ##arg 是 GCC 扩展语法,用于处理可变参数(如果没有参数,自动忽略逗号)。
#define EEPROM_ERROR(fmt,arg...)          printf("<<-EEPROM-ERROR->> "fmt"\n",##arg)

示例
EEPROM_ERROR("Write failed at address %d", 11);
输出

<<-EEPROM-ERROR->> Write failed at address 11
  • 含义:定义一个错误输出宏 EEPROM_ERROR,用于打印错误信息。
  • 参数
    • 同 EEPROM_INFO,fmt 是格式化字符串,arg... 是可变参数。
  • 展开
    • printf("<<-EEPROM-ERROR->> "fmt"\n",##arg):
      • 前缀 <<-EEPROM-ERROR->> 表示这是 EEPROM 模块的错误日志。
      • 功能与 EEPROM_INFO 类似,但用于标识错误情况。
#define EEPROM_DEBUG(fmt,arg...)          


                                  do{\
                                  if(EEPROM_DEBUG_ON)\
                                  printf("<<-EEPROM-DEBUG->> [%d]"fmt"\n",__LINE__,##arg);\
                                     }while(0)


示例

EEPROM_DEBUG("Reading %d bytes", 8);

输出

<<-EEPROM-DEBUG->> [50]Reading 8 bytes
  • 含义:定义一个调试输出宏 EEPROM_DEBUG,用于打印调试信息,受 EEPROM_DEBUG_ON 控制。
  • 展开
    • do { ... } while(0):
      • 这是一个宏定义的常见技巧,确保宏在任何上下文中(例如 if 语句中)都能正确展开为单条语句。
    • if (EEPROM_DEBUG_ON):
      • 检查调试开关,只有当 EEPROM_DEBUG_ON 为非 0 时才执行 printf。
    • printf("<<-EEPROM-DEBUG->> [%d]"fmt"\n", __LINE__, ##arg):
      • 前缀 <<-EEPROM-DEBUG->> 表示调试日志。
      • [%d] 输出当前代码行号(通过 __LINE__ 获取)。
      • fmt 是用户指定的格式化内容。
      • ##arg 处理可变参数。

1. 可变参数宏(arg... 和 ##arg)
  • arg... 是 C99 标准支持的可变参数宏语法,允许传递任意数量的参数。
  • ##arg 是 GCC 扩展,用于处理空参数情况:
    • 如果没有参数,## 会移除多余的逗号,避免语法错误。
    • 例如:

      c

      收起自动换行复制

      EEPROM_INFO("Test"); // 展开为 printf("<<-EEPROM-INFO->> Test\n")

2. __LINE__
  • 含义:C 预处理器内置宏,表示当前代码的行号。
  • 作用:在 EEPROM_DEBUG 中输出行号,帮助开发者定位日志来源。
3. do { ... } while(0)
  • 目的:确保宏展开后是一个完整的语句块。

你可能感兴趣的:(stm32,学习,笔记)