2. TRACE32工具链与目标板连接
在嵌入式Linux内核调试中,TRACE32并不是一个单一软件,而是由PC端软件、调试探针、目标接口与初始化脚本共同构成的调试链路。任何一环配置不当,都会表现为“连不上”“连上但跑飞”“多核只停一个核”等现象。本节围绕这条链路的搭建展开:先完成TRACE32安装与授权配置,再根据目标SoC选择调试探针,随后完成JTAG/SWD物理连接,最后用初始化脚本把多核与AMP/SMP目标带入可控状态。
一、TRACE32安装与基础配置
TRACE32的PC端安装通常包含两部分:安装包(如t32_2024.09)与授权文件。安装完成后,目录结构大致为:bin/存放可执行程序,config/存放配置文件,demo/存放示例脚本。以Linux主机为例,安装后需确认可执行文件权限,并设置环境变量:
export T32SYS=/opt/t32
export PATH=$T32SYS/bin:$PATH
export T32CONFIG=$T32SYS/config
授权方面,TRACE32支持USB加密狗与软授权两种方式。软授权需将.lic文件放入config/目录,并在启动时通过-lic参数指定。启动命令示例:
t32marm -c config.t32 -lic /opt/t32/config/trace32.lic
其中t32marm表示ARM架构调试程序,若目标为ARM64则使用t32marm64。启动后应能在TRACE32主界面看到探针识别状态,若显示“No debugger found”,说明PC与探针通信未建立,需检查USB驱动或网络配置。
二、调试探针选型
TRACE32探针按接口与性能分为多个系列,选型时主要看三点:目标接口类型、调试通道带宽、是否支持多核同步。常见型号对比如下:
| 型号 | 接口 | 典型场景 | 多核支持 |
|---|---|---|---|
| LA-3505 | JTAG/SWD | 单核MCU、低带宽调试 | 有限 |
| LA-4505 | JTAG/SWD/ETM | 中端SoC、指令跟踪 | 支持 |
| LA-7705 | JTAG/SWD/ETM/ETB | 多核AMP/SMP、Linux内核 | 完整支持 |
对于嵌入式Linux内核调试,推荐至少选择支持ETM指令跟踪与多核同步的型号。若目标板仅引出SWD两线接口,则需确认探针是否支持SWD模式,并注意SWD在高速下对布线更敏感。
三、JTAG/SWD物理连接
JTAG标准为20针或14针接口,SWD通常为10针或4针。连接前必须确认目标板JTAG/SWD接口的引脚定义,尤其是VTref参考电压与nTRST复位信号。典型20针JTAG引脚中,关键信号包括:
TCK:时钟,由探针驱动;TMS:模式选择;TDI:数据输入;TDO:数据输出;VTref:目标板参考电压,用于电平匹配;nSRST:系统复位,可选但建议连接。
连接时需注意:探针地线与目标板地线必须共地;VTref必须接到目标板I/O电压,否则探针无法识别目标电平。若目标板JTAG接口被复用为GPIO,需在目标板启动阶段通过引脚复用寄存器将其切回JTAG功能,否则探针无法建立连接。
SWCLK、SWDIO、GND、VTref四根线,但SWDIO需上拉,SWCLK需下拉,否则空闲电平不确定会导致连接失败。四、多核与AMP/SMP目标初始化脚本
多核目标上电后,各核可能处于不同状态:有的核在ROM中等待,有的核已被BootROM释放,有的核处于WFE/WFI低功耗状态。TRACE32需要通过初始化脚本依次完成:复位控制、核间同步、内存映射配置、符号加载。以下是一个面向四核ARM64 SMP目标的初始化脚本示例:
; 1. 系统复位与探针同步
SYStem.RESet
SYStem.CPU Cortex-A55
SYStem.JtagClock 10MHz
SYStem.Mode Attach
; 2. 多核配置:四核SMP
SYStem.CONFIG.CORE 0 0 0
SYStem.CONFIG.CORE 1 0 1
SYStem.CONFIG.CORE 2 0 2
SYStem.CONFIG.CORE 3 0 3
SYStem.CONFIG.SMP ON
; 3. 内存映射:DDR与设备区
MMU.ON
MMU.MAP 0x00000000--0x3FFFFFFF 0x00000000
MMU.MAP 0x40000000--0x7FFFFFFF 0x40000000
; 4. 加载内核符号
Data.LOAD.Elf vmlinux /NoCode
; 5. 停止所有核并同步
SYStem.Mode Go
WAIT 200ms
SYStem.Mode Attach
Break
对于AMP架构,各核运行独立操作系统或裸机程序,初始化脚本需分别指定每个核的入口地址与符号文件:
; AMP:核0运行Linux,核1运行RTOS
SYStem.CONFIG.CORE 0 0 0
SYStem.CONFIG.CORE 1 0 1
SYStem.CONFIG.AMP ON
SYStem.CONFIG.CORE 0 /Symbols linux.elf
SYStem.CONFIG.CORE 1 /Symbols rtos.elf
脚本执行后,应通过SYStem.Mode与SYStem.CONFIG命令确认各核状态。若某核显示“Running”而无法停止,通常是该核未进入调试模式,需检查目标板是否将调试使能引脚拉高,或该核是否被安全启动流程锁定。
完成上述配置后,可通过SYStem.CONFIG查看各核状态,通过Data.LOAD.Elf确认符号是否加载成功。若内核已启动,可在Break后使用Frame或List查看当前执行位置,验证调试链路是否真正可用。多核场景下,建议先用SYStem.Mode Attach附着而不复位,避免破坏已运行的系统状态;只有在需要从复位开始调试时才使用SYStem.RESet。