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

STM32开发者必看:用J-Link RTT实现彩色日志输出(附代码示例)

STM32调试革命J-Link RTT彩色日志全攻略1. 嵌入式调试的痛点与RTT的崛起调试信息输出一直是嵌入式开发中不可或缺的环节。传统方式通常依赖于串口打印这种方式虽然简单直接但也存在诸多限制需要占用额外的硬件资源UART接口、传输速度受限、可能影响实时性而且在资源受限的小型系统中串口可能根本未被预留。SEGGER的Real-Time TransferRTT技术彻底改变了这一局面。它利用已有的J-Link调试通道实现双向数据传输无需额外硬件引脚速度远超传统串口理论上可达1MB/s以上且几乎不影响目标系统的实时性能。更令人惊喜的是RTT支持彩色日志输出这为调试信息可视化提供了全新可能。2. RTT环境搭建与基础配置2.1 硬件准备与驱动安装要使用RTT功能你需要支持RTT的J-Link调试器V9及以上版本均可STM32开发板本文以STM32F4系列为例安装最新版J-Link软件包官网下载安装完成后在J-Link安装目录的Samples/RTT子目录中可以找到RTT的源码包。我们主要需要以下文件SEGGER_RTT.h SEGGER_RTT.c SEGGER_RTT_printf.c SEGGER_RTT_Conf.h2.2 工程移植步骤在现有STM32工程中创建SEGGER_RTT文件夹将上述文件复制到该文件夹在IDE中添加源文件到工程添加头文件包含路径修改SEGGER_RTT_Conf.h中的缓冲区大小默认1KB通常足够// 示例缓冲区配置 #define BUFFER_SIZE_UP (1024) // 上行缓冲区大小MCU-PC #define BUFFER_SIZE_DOWN (16) // 下行缓冲区大小PC-MCU3. 彩色日志输出实战3.1 基础日志输出RTT提供了简单的API来实现日志输出#include SEGGER_RTT.h int main(void) { SEGGER_RTT_Init(); while(1) { SEGGER_RTT_WriteString(0, 基础日志输出演示\r\n); HAL_Delay(1000); } }3.2 实现彩色输出RTT内置了ANSI转义序列支持可以实现终端彩色输出// 颜色定义宏 #define RTT_CTRL_RESET \x1B[0m #define RTT_CTRL_RED \x1B[31m #define RTT_CTRL_GREEN \x1B[32m #define RTT_CTRL_YELLOW \x1B[33m #define RTT_CTRL_BLUE \x1B[34m void log_error(const char* msg) { SEGGER_RTT_printf(0, %s[ERROR]%s %s\r\n, RTT_CTRL_RED, RTT_CTRL_RESET, msg); } void log_warning(const char* msg) { SEGGER_RTT_printf(0, %s[WARN]%s %s\r\n, RTT_CTRL_YELLOW, RTT_CTRL_RESET, msg); } void log_info(const char* msg) { SEGGER_RTT_printf(0, %s[INFO]%s %s\r\n, RTT_CTRL_GREEN, RTT_CTRL_RESET, msg); }3.3 多级日志系统实现结合颜色定义我们可以构建一个完整的日志系统typedef enum { LOG_LEVEL_DEBUG, LOG_LEVEL_INFO, LOG_LEVEL_WARNING, LOG_LEVEL_ERROR, LOG_LEVEL_CRITICAL } LogLevel; void log_message(LogLevel level, const char* format, ...) { const char* color ; const char* level_str ; switch(level) { case LOG_LEVEL_DEBUG: color \x1B[36m; // 青色 level_str DEBUG; break; case LOG_LEVEL_INFO: color \x1B[32m; // 绿色 level_str INFO; break; case LOG_LEVEL_WARNING: color \x1B[33m; // 黄色 level_str WARNING; break; case LOG_LEVEL_ERROR: color \x1B[31m; // 红色 level_str ERROR; break; case LOG_LEVEL_CRITICAL: color \x1B[41m\x1B[37m; // 白字红底 level_str CRITICAL; break; } char buffer[256]; va_list args; va_start(args, format); vsnprintf(buffer, sizeof(buffer), format, args); va_end(args); SEGGER_RTT_printf(0, %s[%s]%s %s\r\n, color, level_str, RTT_CTRL_RESET, buffer); }4. 高级技巧与性能优化4.1 多终端并行输出RTT支持最多16个虚拟终端可以用于分类输出不同类型的信息void init_rtt_terminals() { // 终端0默认日志 SEGGER_RTT_SetTerminal(0); SEGGER_RTT_WriteString(0, 终端0初始化完成\r\n); // 终端1传感器数据 SEGGER_RTT_SetTerminal(1); SEGGER_RTT_WriteString(0, 终端1初始化完成\r\n); // 终端2网络调试 SEGGER_RTT_SetTerminal(2); SEGGER_RTT_WriteString(0, 终端2初始化完成\r\n); }4.2 printf重定向将标准printf重定向到RTT可以简化代码迁移#include stdio.h int _write(int file, char *ptr, int len) { (void)file; SEGGER_RTT_Write(0, ptr, len); return len; } // 或者使用更完整的实现 int fputc(int ch, FILE *f) { SEGGER_RTT_PutChar(0, ch); return ch; }4.3 性能优化建议缓冲区大小调整根据实际数据量调整SEGGER_RTT_Conf.h中的缓冲区大小非阻塞模式在高实时性要求场景下使用SEGGER_RTT_MODE_NO_BLOCK_SKIP日志级别控制通过宏定义实现运行时日志级别过滤格式化优化避免在循环中使用复杂的格式化输出// 日志级别过滤示例 #define CURRENT_LOG_LEVEL LOG_LEVEL_INFO void optimized_log(LogLevel level, const char* format, ...) { if(level CURRENT_LOG_LEVEL) return; // ... 其余日志实现代码 }5. 实战案例RTOS系统中的彩色日志在RTOS环境中RTT可以完美配合各种RTOS实现线程安全的日志输出// FreeRTOS示例 void vLoggingPrintf(const char *pcFormat, ...) { va_list args; va_start(args, pcFormat); // 获取当前任务名 char *pcTaskName pcTaskGetName(NULL); // 使用任务专用缓冲区 static char buffer[256]; vsnprintf(buffer, sizeof(buffer), pcFormat, args); va_end(args); // 带任务名的彩色输出 SEGGER_RTT_printf(0, \x1B[34m[%s]\x1B[0m %s, pcTaskName, buffer); }对于中断上下文建议使用非阻塞方式void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { SEGGER_RTT_WriteNoLock(0, 中断触发!\r\n, 11); }6. 常见问题与解决方案6.1 中文显示乱码问题现象RTT Viewer中中文显示为乱码解决方案确保源代码文件保存为UTF-8编码在RTT Viewer中尝试切换编码如GB2312或者使用支持UTF-8的终端软件如MobaXterm通过telnet连接6.2 日志输出不完整问题现象长日志被截断解决方案增大上行缓冲区大小降低日志输出频率使用SEGGER_RTT_Write代替SEGGER_RTT_printf减少格式化开销6.3 RTT Viewer无法连接问题现象RTT Viewer显示RTT Control Block not found解决方案确认已正确初始化RTT调用SEGGER_RTT_Init()检查J-Link连接是否正常尝试降低JTAG/SWD时钟速度确认目标芯片已正确供电7. 超越基础RTT的创造性应用7.1 实时数据可视化结合Python脚本可以将RTT数据实时绘制成图表# 示例Python代码需安装pyserial和matplotlib import serial import matplotlib.pyplot as plt ser serial.Serial(COM3, 115200) # 通过虚拟串口连接 plt.ion() fig, ax plt.subplots() data [] while True: line ser.readline().decode().strip() try: value float(line) data.append(value) ax.clear() ax.plot(data) plt.pause(0.01) except ValueError: pass7.2 交互式调试命令通过RTT实现目标系统的交互式控制void process_rtt_commands(void) { char cmd[64]; if(SEGGER_RTT_HasKey()) { int len SEGGER_RTT_Read(0, cmd, sizeof(cmd)-1); cmd[len] \0; if(strcmp(cmd, reset) 0) { NVIC_SystemReset(); } else if(strncmp(cmd, set , 4) 0) { // 处理参数设置命令 } } }7.3 内存监控与性能分析利用RTT实现简易的性能监控uint32_t cycle_counter 0; void task_perf_monitor(void) { uint32_t last_cycle DWT-CYCCNT; while(1) { uint32_t current_cycle DWT-CYCCNT; uint32_t delta current_cycle - last_cycle; last_cycle current_cycle; SEGGER_RTT_printf(0, CPU负载: %d cycles\r\n, delta); osDelay(100); } }8. 最佳实践与经验分享在实际项目中应用RTT时以下几点经验值得分享项目初期规划在架构设计阶段就考虑日志系统定义好日志级别和分类颜色使用规范建立团队统一的颜色编码标准如红色只用于错误性能考量在最终产品中通过宏定义关闭非必要日志输出版本兼容性注意不同版本J-Link软件包的API差异异常处理为RTT操作添加超时机制避免因调试器断开导致系统挂起// 安全的RTT写入实现 bool safe_rtt_write(const char* msg) { uint32_t retry 0; while(SEGGER_RTT_Write(0, msg, strlen(msg)) 0) { if(retry 10) return false; HAL_Delay(1); } return true; }通过本文介绍的技术和方法开发者可以构建一个高效、直观的调试环境大幅提升STM32开发效率。彩色日志不仅使调试信息更易读还能通过颜色快速定位问题真正实现一眼识别关键信息的调试体验。

相关文章:

STM32开发者必看:用J-Link RTT实现彩色日志输出(附代码示例)

STM32调试革命:J-Link RTT彩色日志全攻略 1. 嵌入式调试的痛点与RTT的崛起 调试信息输出一直是嵌入式开发中不可或缺的环节。传统方式通常依赖于串口打印,这种方式虽然简单直接,但也存在诸多限制:需要占用额外的硬件资源&#x…...

Gofile文件下载工具实战指南:从效率痛点到自动化解决方案

Gofile文件下载工具实战指南:从效率痛点到自动化解决方案 【免费下载链接】gofile-downloader Download files from https://gofile.io 项目地址: https://gitcode.com/gh_mirrors/go/gofile-downloader 在数字化工作流中,文件下载往往是最容易被…...

基于SpringBoot+Vue的城市垃圾分类管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着城市化进程的加速和居民生活水平的提升,城市垃圾产量逐年攀升,传统的垃圾处理方式已难以满足环保和可持续发展的需求。垃圾分类管理成为现代城市治理的重要课题,亟需借助信息化手段提升管理效率。当前许多城市的垃圾分类仍依赖人工监…...

智能文献管理策略:解析六种AI辅助论文引用生成方案

核心工具对比速览 工具名称 核心优势 适用场景 处理速度 AiBiye 智能识别引用格式,自动匹配规范 学术论文初稿 3-5秒/页 AiCheck 深度检测引用缺失,精准定位问题 论文终稿检查 10秒/篇 AskPaper 多语言引用规范支持 国际期刊投稿 5-8秒/页…...

TreeSet |TreeMap|jar包|web包易混淆解答

刷牛客网机试题常见疑惑1 TreeSet是啥?TreeMap又是啥?这俩有啥用?两者都是基于红黑树,那红黑树又是啥?红黑树是一个自平衡的二叉查找树,遍历红黑树就会得到一个升序序列。在实际处理问题中,Set&…...

SAM 3视频分割应用:安防监控中人员/车辆轨迹追踪与区域掩码叠加分析

SAM 3视频分割应用:安防监控中人员/车辆轨迹追踪与区域掩码叠加分析 1. 引言:当监控视频“看懂”了世界 想象一下这个场景:一个大型商场的安保中心,墙上挂满了监控屏幕。值班人员需要时刻盯着屏幕,手动标记可疑人员的…...

智慧树课程自动化学习:高效工具实用指南

智慧树课程自动化学习:高效工具实用指南 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 一、问题引入:网课学习的隐形效率损耗 ⏳ 当你每天需要…...

SketchUp STL插件:数字模型与3D打印的无缝衔接解决方案

SketchUp STL插件:数字模型与3D打印的无缝衔接解决方案 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 一、功能特…...

ContextCapture控制点选择黄金法则:从墙角定位到影像极线校准的6个关键细节

ContextCapture控制点选择黄金法则:从墙角定位到影像极线校准的6个关键细节 在无人机航测领域,控制点的选择与布设直接影响着最终模型的精度与可靠性。许多新手往往将注意力集中在后期处理软件的操作上,却忽视了前期控制点选择这一关键环节。…...

华为防火墙URL过滤实战:基于VLAN的精细化黑白名单配置

1. 企业内网访问控制的痛点与解决方案 现代企业网络环境中,不同部门往往需要差异化的上网权限。比如物流部门只需要访问快递查询网站,而客服部门可能需要禁止视频网站以提升工作效率。这种精细化的访问控制需求,正是华为防火墙URL过滤功能的用…...

Chord视频理解工具实现Python爬虫数据智能处理:自动化采集与清洗

Chord视频理解工具实现Python爬虫数据智能处理:自动化采集与清洗 1. 引言 在当今信息爆炸的时代,视频内容已成为网络信息的重要组成部分。新闻媒体每天需要监控数百个视频源,舆情分析团队要处理海量的视频数据,内容创作者需要从…...

Qwen3-TTS-1.7B效果展示:葡萄牙语足球解说+意大利语美食节目主持风格

Qwen3-TTS-1.7B效果展示:葡萄牙语足球解说意大利语美食节目主持风格 声音克隆:Qwen3-TTS-12Hz-1.7B-Base 今天带大家体验一个让我惊艳的语音合成模型——Qwen3-TTS-1.7B。这个模型最厉害的地方是能说10种主要语言,包括中文、英文、日文、韩文…...

避坑指南:Milvus 2.3.1单机版部署常见问题排查(ETCD/MinIO配置详解)

Milvus 2.3.1单机版部署避坑手册:ETCD与MinIO配置深度解析 在向量数据库领域,Milvus凭借其出色的性能和易用性已经成为众多AI应用的首选存储方案。然而在实际部署过程中,即使是单机版环境,ETCD和MinIO这两个核心依赖组件的配置问题…...

旧手机电池重生记:基于IP5306与SX1308的4.35V便携补光灯移动电源DIY

旧手机电池重生记:基于IP5306与SX1308的4.35V便携补光灯移动电源DIY 大家抽屉里是不是都躺着几部旧手机?手机虽然淘汰了,但里面的锂电池往往还有“一战之力”,容量可能还有七八成。直接扔掉太可惜,也不环保。最近我就琢…...

大模型训练中的通信原语实战:从Broadcast到All-Reduce的保姆级解析

大模型训练中的通信原语实战:从Broadcast到All-Reduce的保姆级解析 在当今AI领域,大模型训练已成为推动技术进步的核心动力。随着模型参数规模从亿级迈向万亿级,单机训练早已无法满足需求,分布式训练成为必选项。而分布式训练的核…...

Phi-3-vision-128k-instruct SpringBoot Admin监控面板增强:AI解读系统健康图表

Phi-3-vision-128k-instruct SpringBoot Admin监控面板增强:AI解读系统健康图表 1. 场景痛点:传统监控的局限性 运维团队每天需要面对大量监控图表,但人工分析效率低下且容易遗漏关键指标。SpringBoot Admin虽然提供了丰富的监控数据可视化…...

Qwen3-14b_int4_awq开源可审计:全部部署脚本、配置文件、前端代码均开放可查

Qwen3-14b_int4_awq开源可审计:全部部署脚本、配置文件、前端代码均开放可查 1. 模型简介 Qwen3-14b_int4_awq是基于Qwen3-14b模型的int4量化版本,采用AngelSlim技术进行压缩优化,专门用于高效文本生成任务。该版本通过先进的AWQ&#xff0…...

LaTeX环境设计进阶:从\fbox到minipage,手把手教你封装复杂排版效果

LaTeX环境设计进阶:从\fbox到minipage,手把手教你封装复杂排版效果 在学术写作和技术文档创作中,LaTeX以其卓越的排版质量和稳定性成为专业人士的首选工具。然而,当我们需要实现超出基础排版的复杂视觉效果时,比如代码…...

Docker Compose一键部署Milvus单机版(附Attu可视化工具)

1. 环境准备与前置条件 在开始部署Milvus单机版之前,我们需要确保本地开发环境满足基本要求。我建议使用Ubuntu 20.04或CentOS 7以上版本的操作系统,这两个发行版对Docker的支持最为完善。实测下来,Windows系统通过WSL2也能运行,但…...

老旧笔记本升级值不值?华硕A456U换固态+光驱改机械硬盘的真实性能测试

老旧笔记本性能重生指南:华硕A456U硬件升级全解析 当你的笔记本电脑开始出现卡顿、响应迟缓时,先别急着把它扔进垃圾桶。以华硕A456U为例,这台服役近十年的机器通过合理的硬件升级,完全有可能重获新生。本文将带你深入探讨老旧笔记…...

美国亚太部署是“撤退”还是“重配”?

当我们都在关注美国从日韩“抽调”军事力量时,一个逆向问题值得追问:抽调的同时,美国是否仍在强化亚太部署?这两者是矛盾,还是同一战略的两面? 答案是:既是“拆东墙”,也是“砌新墙”。 美国正在重新配置其亚太军事资产——从中日韩等传统核心基地,向菲律宾等“外环”…...

3个核心功能解决多平台直播推流痛点:OBS Multi RTMP插件实战指南

3个核心功能解决多平台直播推流痛点:OBS Multi RTMP插件实战指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 在多平台内容分发成为主流的今天,内容创作者面临…...

API管理工具——五款主流方案的场景化解读与对照

API(应用程序编程接口)作为现代软件架构的“连接件”,其集成与管理能力已从单纯的技术工具演变为企业核心竞争力的关键组成部分。然而,面对市场上理念不同、功能各异的API集成平台,技术决策者往往陷入选择困境&#xf…...

Zepp Life步数自动化同步工具:从技术实现到场景落地的全方位指南

Zepp Life步数自动化同步工具:从技术实现到场景落地的全方位指南 【免费下载链接】mimotion 小米运动刷步数(微信支付宝)支持邮箱登录 项目地址: https://gitcode.com/gh_mirrors/mimo/mimotion 引导语:重新定义健康数据管…...

蓝桥杯备赛题

P1025 [NOIP 2001 提高组] 数的划分 - 洛谷 #include <bits/stdc.h> using namespace std;int n,k; int path,ret;void dfs(int pos,int begin) {if(pos k){if(path n){ret;}return;}for(int i begin;i < n;i){if(path i*(k - pos) > n) return;path i;dfs(p…...

码农江湖:西二旗的996与理想国

程序员的江湖西二旗地铁站的晚高峰&#xff0c;永远拥挤。背着双肩包的年轻人鱼贯而出&#xff0c;面容疲惫&#xff0c;眼神却亮——那是在屏幕前浸泡一天后&#xff0c;见到自然光时的生理反应。他们四散消失在回龙观的楼群里&#xff0c;像退潮的鱼&#xff0c;回到自己栖息…...

卷积神经网络原理与OFA模型应用:理解视觉特征提取

卷积神经网络原理与OFA模型应用&#xff1a;理解视觉特征提取 1. 引言 如果你对AI如何“看懂”图片感到好奇&#xff0c;比如它怎么认出照片里是猫还是狗&#xff0c;或者怎么给一段文字配上一张合适的图&#xff0c;那么你很可能已经听说过卷积神经网络&#xff08;CNN&…...

联发科设备变砖不用愁?MTKClient高效修复方案全解析

联发科设备变砖不用愁&#xff1f;MTKClient高效修复方案全解析 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 当联发科设备遭遇系统崩溃、刷机失败或密码锁定等问题时&#xff0c;传统维…...

RENPY中文游戏字体替换全攻略:从字体选择到gui.rpy配置,一步步教你避开坑

RENPY中文游戏字体替换实战指南&#xff1a;从选型到调试的完整解决方案 当你打开自己精心制作的RENPY中文游戏&#xff0c;却发现对话文本显示为生僻字框框或系统默认字体时&#xff0c;那种挫败感我深有体会。三年前我的第一个视觉小说项目就因为这个看似简单的问题卡了两周—…...

海景美女图-一丹一世界FLUX.1GPU算力适配:多模型并行推理资源分配

海景美女图-一丹一世界FLUX.1GPU算力适配&#xff1a;多模型并行推理资源分配 1. 引言&#xff1a;当AI绘画遇上GPU资源管理 想象一下这个场景&#xff1a;你部署了一个很棒的AI图像生成服务&#xff0c;专门用来画海景美女图。一开始用的人不多&#xff0c;服务器轻轻松松就…...