当前位置: 首页 > news >正文

利用条件编译实现RTT可控的调试输出

在嵌入式开发中,调试信息的输出通常对定位问题至关重要。然而,为了保证代码在正式发布时的性能和体积,调试信息往往需要在不修改主逻辑代码的前提下禁用。

代码一览

// debug.h
#pragma once// #define DEBUG#ifdef DEBUG#include "SEGGER_RTT.h"#define DEBUG_PRINT(...) SEGGER_RTT_printf(0, __VA_ARGS__)
#else#define DEBUG_PRINT(...) do {} while (0)
#endif

设计目的

这段代码的核心目的是:根据是否定义了 DEBUG 宏来决定是否启用调试打印功能。它的设计符合以下几个关键需求:

  1. 编译期控制调试开关,无需手动删除调试代码;
  2. 避免无用代码膨胀,在非调试版本中编译器能优化掉;
  3. 统一调试接口,通过 DEBUG_PRINT 宏调用,使用简单。

逐行解析

  • #pragma once:防止头文件被多次包含,是一种常用的 include guard。

  • // #define DEBUG:默认注释掉,表示发布版默认关闭调试。如果需要开启调试,只需取消注释。

  • #ifdef DEBUG:检查是否定义了 DEBUG 宏。

    • 如果定义了,说明是调试版本:

      • 引入 SEGGER_RTT.h,它是 SEGGER 提供的高效调试输出工具;
      • 定义 DEBUG_PRINT(...) 宏,展开为 SEGGER_RTT_printf 调用。
    • 如果没有定义:

      • DEBUG_PRINT(...) 宏将被替换成空语句 do {} while (0),这是一种确保宏语法安全的惯用写法。

SEGGER RTT 简介

SEGGER RTT (Real-Time Transfer) 是 SEGGER 提供的用于 J-Link 调试器的高效数据传输方式,具有以下特点:

  • 不依赖串口,速度快;
  • 实时性强,适合嵌入式系统调试;
  • 与 Keil、IAR、SEGGER Embedded Studio 等集成良好。

使用方法

  1. 开启调试输出:在 debug.h 中取消 #define DEBUG 的注释;

  2. 调用调试打印

    DEBUG_PRINT("Sensor value: %d\n", sensor_value);
    
  3. 发布前禁用调试:注释掉 #define DEBUG 即可,无需修改其他文件。

相关文章:

  • 精准核验,实时响应-身份证实名认证接口-身份证二要素核验
  • TCP为什么是三次握手,而不是二次?
  • Solana 数据实时访问的三大工具对比:哪种最适合你的应用?
  • PHP实现签名类
  • 外卖跑腿小程序评价系统框架搭建
  • 嵌入式鸿蒙openharmony应用开发环境搭建与工程创建实现
  • android studio第一次编译apk,用时6分钟
  • HarmonyOS NEXT 使用 relationalStore 实现数据库操作
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 一键生成专业流程图:Draw.io与AI结合的高效绘图指南
  • 蓝桥杯2025.5.23每日一题-儿童数
  • DAY 34 GPU训练及类的call方法
  • 如果教材这样讲---开关电源的拓扑结构
  • FTP Bounce Attack:原理、影响与防御
  • DL00912-基于自监督深度聚类的高光谱目标检测含数据集
  • 通过对音频信号提取梅尔频谱图并转换为对数梅尔频谱图得到的。它的形状主要由以下参数决定 转换成图片 64*64像素
  • 第九天的尝试
  • android property 系统
  • SpringAI(GA版)的Advisor:快速上手+源码解读
  • OCC导入进度显示
  • 深圳做律师网站公司/优搜云seo
  • 网站开发怎样/seo排名快速优化
  • 申请个网站要多少钱/青岛网络科技公司排名
  • 只做汽车的网站/直接进网站的浏览器
  • 批量域名注册查询/智谋网站优化公司
  • wordpress音乐源码/济南百度seo