SEGGER-RTT调试(代替串口printf输出)的使用方法

本文介绍如何在无串口输出的情况下,利用SEGGER-RTT进行嵌入式系统的调试。通过安装jlink驱动,配置SEGGER-RTT源文件到项目,实现使用SEGGER_RTT_printf()函数进行实时打印输出。

在没有串口printf输出的情况下,可以使用SEGGER-RTT进行嵌入式开发调试。
RTT Real Time Terminal 即jink的实时终端
使用方法

1. 安装jlink V5.02或以上版本的驱动

在这里插入图片描述
我装的是V5.02d版本Jlink,可以在网上找到安装包进行安装。

安装完成后,打开安装路径,可以看到以下应用程序:

这里写图片描述

我们用到的是头两个。

2. 将SEGGER-RTT的源文件配置到项目程序中

网上下载源文件RTT_Implementation_140925解压得到

这里写图片描述

将RTT文件夹和Syscalls文件夹复制到工程路径下,并在工程中添加文件

SEGGER_RTT.c、SEGGER_RTT.h、SEGGER_RTT_Conf.h、SEGGER_RTT_printf.c和RTT_Syscalls_KEIL.c,如果用的是其他IDE,就添加RTT_Syscalls_IAR.c或RTT_Syscalls_GCC.c。

这里写图片描述

在“Options for Target”中包含头文件路径。

3. 应用示例

在这里插入图片描述

如图,添加头文件“SEGGER_RTT,h”和“SEGGER_RTT_Conf.h”,

然后调用SEGGER_RTT_Init()初始化

此时便可以使用SEGGER_RTT_printf()函数进行打印输出了

打开以下两个程序

这里写图片描述

这里写图片描述

这里写图片描述

此时还没有连接上设备,在J-Link RTT Logger中提示输入设备信息

这里写图片描述

头三项实际填写,相关信息在Keil中可以找到,其他选择默认,一路Enter
J-Link RTT Logger显示如下

这里写图片描述

J-Link RTT Client显示已连接,并成功输出打印内容

这里写图片描述




### 使用 SEGGER RTT 替代标准 `printf` 的方法 SEGGER RTT(Real-Time Transfer)是一种高效的嵌入式调试工具,支持通过 J-Link 调试器实现与目标设备的高速实时通信。在嵌入式开发中,`printf` 是常用的调试手段之一,但其依赖串口硬件资源,可能受限于引脚复用或硬件设计限制。使用 SEGGER RTT 可以替代标准 `printf`,不仅节省了硬件资源,还提升了调试效率。 #### 集成 SEGGER RTT 到项目中 要将 SEGGER RTT 作为 `printf` 的替代方案,首先需要将其源码集成到工程中。具体步骤如下: 1. **获取 SEGGER RTT 源文件** 可从 Segger 官网或 J-Link 安装目录下的示例代码中获取相关文件,通常包括: - `SEGGER_RTT.c` - `SEGGER_RTT.h` - `SEGGER_RTT_Conf.h` - `SEGGER_RTT_printf.c` - 对应编译器的系统调用文件(如 `RTT_Syscalls_KEIL.c`、`RTT_Syscalls_GCC.c` 等) 2. **配置工程路径与头文件包含** 将上述文件添加到项目目录,并确保在编译选项中包含对应的头文件路径。 3. **初始化 RTT 模块** 在程序入口处调用 `SEGGER_RTT_Init()` 函数进行初始化,以便后续可以使用 RTT 功能输出调试信息[^5]。 #### 使用宏定义替换 `printf` 为了简化调试过程并保持代码风格一致性,可以通过宏定义将 `printf` 替换为 `SEGGER_RTT_printf`,具体方式如下: ```c #include "SEGGER_RTT.h" // 将 printf 替换为 SEGGER_RTT_printf #define printf(...) SEGGER_RTT_printf(0, __VA_ARGS__) int main(void) { SEGGER_RTT_Init(); // 初始化 RTT printf("Hello, World!\n"); // 使用 RTT 输出 return 0; } ``` 其中,`##__VA_ARGS__` 的使用是为了处理可变参数为空的情况,防止编译器报错。这种方式可以让开发者像使用标准 `printf` 一样使用 RTT 输出调试信息,同时避免额外的硬件开销[^4]。 #### 支持格式化输出与日志级别控制 除了基本的字符串输出外,SEGGER RTT 还支持更复杂的格式化输出,例如打印变量值、浮点数等。此外,还可以通过自定义宏来实现日志级别控制,例如区分 `INFO`、`WARNING` 和 `ERROR` 日志类型: ```c #define LOG_INFO(fmt, ...) SEGGER_RTT_printf(0, "[INFO] %s: " fmt "\r\n", __FUNCTION__, ##__VA_ARGS__) #define LOG_WARN(fmt, ...) SEGGER_RTT_printf(0, "[WARNING] %s: " fmt "\r\n", __FUNCTION__, ##__VA_ARGS__) #define LOG_ERROR(fmt, ...) SEGGER_RTT_printf(0, "[ERROR] %s: " fmt "\r\n", __FUNCTION__, ##__VA_ARGS__) ``` 这样的设计不仅提升了调试信息的可读性,还能帮助开发者更快地定位问题所在[^1]。 #### 实时调试与中断上下文中的使用 SEGGER RTT 的一大优势是可以在中断服务程序中安全使用,不会影响系统的实时性。这对于调试某些关键路径或异常处理逻辑非常有用。例如,在中断中打印当前计数值或状态标志: ```c void SysTick_Handler(void) { static uint32_t counter = 0; counter++; if (counter % 100 == 0) { SEGGER_RTT_printf(0, "Counter value: %lu\r\n", counter); } } ``` 这种能力使得 RTT 成为嵌入式系统中一种非常灵活且高效的调试手段[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值