1. 项目背景与需求解析
在嵌入式开发调试过程中,日志输出是最基础的调试手段之一。SEGGER_RTT作为一款轻量级、高性能的日志输出工具,相比传统串口输出具有明显优势:它通过J-Link调试器直接在内存中开辟环形缓冲区,实现高速日志传输,避免了串口波特率的限制。而SecureCRT作为老牌终端仿真软件,其稳定的连接性和丰富的功能使其成为工程师的首选。
但在实际开发中,我们经常遇到这样的痛点:每次调试都需要手动打开两个SecureCRT窗口,分别配置不同的RTT通道(通常Channel 0用于标准输出,Channel 1用于错误输出),重复的配置操作既耗时又容易出错。特别是在需要频繁重启调试会话的场合,这种低效操作会严重影响开发效率。
2. 技术方案设计
2.1 核心组件选型
本方案采用Windows批处理脚本(.bat)作为自动化工具,主要基于以下考量:
- 批处理脚本是Windows原生支持的技术,无需额外安装运行环境
- 对进程启动、参数传递等基础操作支持良好
- 开发调试周期短,修改验证快速
- 与SecureCRT命令行参数完美配合
SecureCRT提供了完善的命令行接口支持,关键参数包括:
/T:以标签页形式打开新会话/N:指定会话名称/L:指定日志文件路径/serial:指定串口参数(虽然我们使用RTT,但SecureCRT仍需要此参数占位)
2.2 通道分离设计原理
SEGGER_RTT支持多通道设计,默认配置为:
- Channel 0:标准输出(stdout)
- Channel 1:标准错误(stderr)
- Channel 2:用户自定义通道
我们的方案将同时打开两个SecureCRT窗口,分别监听Channel 0和Channel 1。这种分离设计的好处在于:
- 不同级别的日志可以分开查看,避免信息混杂
- 错误日志可以单独高亮显示,便于快速定位问题
- 两个窗口可以独立滚动查看,互不干扰
3. 完整实现步骤
3.1 基础环境准备
首先确保系统中已安装:
- SEGGER J-Link软件包(包含RTT Viewer)
- SecureCRT 8.0及以上版本
- 目标设备已正确连接并识别J-Link调试器
在SecureCRT中需要预先配置两个会话:
RTT_Channel0:用于Channel 0输出RTT_Channel1:用于Channel 1输出
配置要点:
- 连接类型选择"Serial"
- 端口号可以任意(实际不会使用)
- 波特率设置为115200(仅为占位值)
- 在"Log File"选项卡中启用自动日志记录
3.2 批处理脚本实现
创建start_rtt_logging.bat文件,内容如下:
batch复制@echo off
setlocal enabledelayedexpansion
:: 配置区 - 根据实际环境修改
set SECURE_CRT_PATH="C:\Program Files\VanDyke Software\SecureCRT\SecureCRT.exe"
set SESSION_CH0="RTT_Channel0"
set SESSION_CH1="RTT_Channel1"
set LOG_DIR="D:\ProjectLogs"
set JLINK_EXE="C:\Program Files (x86)\SEGGER\JLink_V640\JLink.exe"
:: 创建日志目录
if not exist %LOG_DIR% mkdir %LOG_DIR%
:: 启动RTT Server
start "JLink RTT Server" %JLINK_EXE% -device Cortex-M4 -if SWD -speed 4000 -autoconnect 1 -RTTTelnetPort 19021
:: 等待RTT初始化
timeout /t 3 >nul
:: 启动Channel 0日志窗口
start "RTT Channel 0" %SECURE_CRT_PATH% /T /N %SESSION_CH0% /L %LOG_DIR%\rtt_ch0_%date:~0,4%%date:~5,2%%date:~8,2%.log /serial COM1
:: 启动Channel 1日志窗口
start "RTT Channel 1" %SECURE_CRT_PATH% /T /N %SESSION_CH1% /L %LOG_DIR%\rtt_ch1_%date:~0,4%%date:~5,2%%date:~8,2%.log /serial COM2
echo RTT日志系统已启动,Channel 0和Channel 1已就绪
3.3 关键参数说明
-
JLink启动参数:
-device:指定目标芯片型号-if:指定调试接口(SWD/JTAG)-speed:设置调试时钟频率-RTTTelnetPort:指定RTT的TCP端口号
-
SecureCRT参数:
/L:日志文件路径,使用日期作为文件名后缀/serial:虽然RTT不使用串口,但必须提供此参数
-
日期处理:
%date:~0,4%:提取年份%date:~5,2%:提取月份%date:~8,2%:提取日期
4. 高级配置与优化
4.1 多设备支持
当需要同时调试多个设备时,需要为每个设备分配不同的RTT端口号。修改脚本如下:
batch复制:: 在配置区添加设备编号
set DEVICE_ID=1
:: 修改RTT端口号
set RTT_PORT=1902%DEVICE_ID%
:: 修改日志文件名
set LOG_SUFFIX=_dev%DEVICE_ID%_%date:~0,4%%date:~5,2%%date:~8,2%.log
4.2 自动重连机制
增加错误检测和自动重连功能:
batch复制:retry_jlink
start "JLink RTT Server" %JLINK_EXE% -device Cortex-M4 -if SWD -speed 4000 -autoconnect 1 -RTTTelnetPort %RTT_PORT%
timeout /t 5 >nul
:: 检查进程是否正常运行
tasklist /FI "WINDOWTITLE eq JLink RTT Server" 2>NUL | find /I /N "JLink.exe">NUL
if "%ERRORLEVEL%"=="0" goto start_securecrt
echo JLink启动失败,10秒后重试...
timeout /t 10 >nul
goto retry_jlink
:start_securecrt
...
4.3 日志轮转管理
为防止日志文件过大,添加日志文件大小检查:
batch复制:: 检查日志文件大小(超过10MB则备份)
for %%F in (%LOG_DIR%\rtt_ch0*.log) do (
if %%~zF GTR 10000000 (
move %%F %%~dpnF_%time:~0,2%%time:~3,2%%time:~6,2%.bak
)
)
5. 常见问题与解决方案
5.1 RTT连接失败
现象:SecureCRT窗口显示连接超时
排查步骤:
- 确认JLink进程是否正常运行
- 检查任务管理器是否有多个JLink.exe进程(可能是之前的未退出)
- 验证目标板是否正常供电并连接
- 尝试手动启动JLink RTT Viewer测试连接
解决方案:
batch复制:: 在脚本开头添加JLink进程清理
taskkill /F /IM JLink.exe >nul 2>&1
5.2 日志输出混乱
现象:两个通道的日志混在一起
原因:SecureCRT会话配置错误
解决方法:
- 确保两个会话使用不同的端口号(即使不使用)
- 在SecureCRT会话属性中取消"Share connection"选项
- 为两个会话设置不同的颜色方案以便区分
5.3 性能优化建议
当日志量非常大时,可以:
- 增大RTT缓冲区大小(修改SEGGER_RTT_Conf.h中的BUFFER_SIZE)
- 在SecureCRT中关闭实时滚动显示
- 调整批处理脚本的启动顺序,先启动JLink再启动SecureCRT
6. 实际应用案例
以一个智能家居网关项目为例,系统日志分为:
- Channel 0:业务逻辑日志(设备状态、用户操作等)
- Channel 1:网络通信日志(MQTT消息、WiFi状态等)
通过本方案实现:
- 开发阶段:快速定位网络连接问题与业务逻辑错误的关联性
- 测试阶段:并行记录压力测试时的系统输出和错误信息
- 现场调试:通过分开的日志文件分析偶发性故障
典型日志命名示例:
code复制D:\ProjectLogs\
├── rtt_ch0_20230815_dev1.log
├── rtt_ch1_20230815_dev1.log
├── rtt_ch0_20230815_dev2.log
└── rtt_ch1_20230815_dev2.log
7. 扩展应用场景
本方案还可应用于:
- 多核调试:为每个CPU核心分配独立的RTT通道
- RTOS任务跟踪:不同任务输出到不同通道
- 性能分析:专用通道输出时间戳和性能数据
- 自动化测试:结合Python脚本实现日志自动分析
进阶改进方向:
- 集成到CI/CD流程,实现自动化测试日志收集
- 增加日志分级过滤功能
- 开发图形化监控界面
- 支持云端日志存储和分析
