4. PowerView调试环境与脚本基础

TRACE32 的调试能力并不只体现在“能连上 ECU、能下断点”,更体现在能否把重复的调试动作沉淀为可复用的脚本。PowerView 是 TRACE32 的图形化调试前端,它把底层调试命令、窗口视图和脚本执行统一在一个界面里。理解 PowerView 的布局与常用窗口,是后续编写 .cmm 脚本、实现自动化调试任务的前提。

PowerView 界面布局与常用窗口

PowerView 启动后,界面通常由菜单栏、工具栏、命令输入区、状态栏和若干可停靠窗口组成。菜单栏提供文件、调试、窗口、脚本等入口;工具栏放置最常用的运行、停止、单步、复位等按钮;命令输入区(Command Line)是 PowerView 的核心,几乎所有图形操作最终都会转化为一条 TRACE32 命令,例如点击“运行”实际执行的是 Go,点击“单步”执行的是 Step。状态栏显示当前 CPU 状态、连接状态和当前调试会话信息。

常用窗口包括:Frame 窗口显示函数调用栈,用于定位当前执行位置;Register 窗口显示 CPU 寄存器,调试底层驱动时经常需要观察 SP、PC、LR 等;Data.List 窗口按地址显示内存数据,适合查看 ECU 中的标定量、RAM 变量;Var 窗口按符号名显示变量,比 Data.List 更直观;List 窗口显示反汇编代码,用于核对编译器生成的指令;Breakpoint 窗口管理断点;Trace 窗口显示指令或数据跟踪结果;Log 窗口记录命令与脚本输出,是脚本调试的重要依据。这些窗口可以自由停靠、浮动或保存为工作区,便于在不同调试任务间切换。

PowerView 界面布局与常用窗口 File Debug Window Script Help 菜单栏 ▶ Go ■ Stop ⏭ Step ⏭ StepOver ↺ Reset ⏸ Break 工具栏 B:: Go 命令输入区 Frame 窗口 main() EcuM_Init() CanIf_Init() Can_Init() ← 当前执行位置 Register 窗口 PC = 0x8000_1234 SP = 0x7000_FF00 LR = 0x8000_1200 R0 = 0x0000_0001 CPSR= 0x6000_0013 Data.List 窗口 0x7000_1000: 00 01 02 03 0x7000_1004: 04 05 06 07 0x7000_1008: 08 09 0A 0B 0x7000_100C: 0C 0D 0E 0F 按地址查看内存 Var 窗口 EngineSpeed = 1500 CoolantTemp = 85 ThrottlePos = 12 BatteryVolt = 13.8 按符号名查看变量 List 窗口 0x80001234: MOV R0,#1 0x80001238: STR R0,[R1] 0x8000123C: B 0x80001250 0x80001240: NOP 反汇编视图 Log 窗口 B:: Go B:: Break B:: PRINT EngineSpeed EngineSpeed = 1500 命令与脚本输出记录 CPU: TriCore TC397 | State: Stopped | Session: ECU_Debug_01 状态栏

命令语法与 .cmm 脚本编写

TRACE32 命令通常由“命令名 + 参数”构成,命令名不区分大小写,但参数中的符号名区分大小写。例如 Data.Set EngineSpeed 2000 把变量 EngineSpeed 设为 2000;Break.Set main /Program 在 main 函数入口设置程序断点;Go 让 CPU 运行;Step 单步执行一条指令。命令前可加访问类前缀,如 B:: 表示对当前调试目标执行,A:: 表示对另一个核或另一个调试目标执行,这在多核 ECU 调试中很常见。

.cmm 脚本本质上是按行排列的 TRACE32 命令集合,扩展名为 .cmm。脚本可以包含注释,注释以 ; 或 // 开头。一个最简单的脚本如下:

; 初始化并运行到 main
SYStem.Up
Break.Set main /Program
Go
WAIT !STATE.RUN()
PRINT "Reached main"

脚本通过 DO <file.cmm> 执行,也可以在 PowerView 菜单 Script 中加载。脚本中的命令与在命令输入区逐条输入完全等价,因此调试时可以先在命令行验证命令,再写入脚本。

变量与宏定义

脚本中可以使用局部变量和宏。局部变量用 &变量名 引用,例如 &speed=1500,之后用 PRINT &speed 输出。宏用 #define 定义,例如 #define TARGET_ECU "TC397",在脚本中通过 &TARGET_ECU 引用。宏适合存放路径、目标名、阈值等常量,便于脚本复用。变量与宏的区别在于:宏在脚本解析阶段展开,变量在运行阶段赋值,二者可以配合使用。

条件执行与循环

脚本支持条件判断和循环,使自动化调试成为可能。条件语句使用 IF / ELSE / ENDIF,例如:

&volt=13.8
IF &volt < 11.0
  PRINT "Undervoltage!"
ELSE
  PRINT "Voltage OK"
ENDIF

循环使用 WHILE / RePeat,例如等待某个变量达到目标值:

&count=0
WHILE &count < 10
  Go
  WAIT 100.ms
  PRINT "Run " &count
  &count=&count+1
ENDWHILE

这类循环常用于“运行—等待—采样—判断”的调试模式,例如反复读取 EngineSpeed 直到超过阈值,或反复复位直到某个故障不再出现。

脚本调试与日志记录

脚本出错时,PowerView 会在 Log 窗口输出错误行号和错误信息。常用调试手段包括:在关键位置插入 PRINT 输出变量值;用 WAIT 暂停观察状态;用 ON ERROR 捕获错误并跳转处理。日志记录可通过 PRinTer.FileName 把 Log 输出重定向到文件,例如:

PRinTer.FileName "C:\trace\log\debug.log"
PRinTer.OPEN
PRINT "Test start"
; ... 调试命令 ...
PRinTer.CLOSE

这样每次自动化调试都会留下可追溯的日志,便于复盘和对比不同轮次的结果。

自动化调试任务入门

把上述能力组合起来,就可以完成一个入门级自动化调试任务。例如“上电后等待 ECU 进入正常运行,连续采样 10 次发动机转速并记录,若出现欠压则停止并报警”。脚本骨架如下:

SYStem.Up
Break.Set main /Program
Go
WAIT !STATE.RUN()
&i=0
WHILE &i < 10
  Go
  WAIT 200.ms
  PRINT "Sample " &i & ": Speed=" EngineSpeed
  IF BatteryVolt < 11.0
    PRINT "Undervoltage detected, stop."
    Break
    ENDDO
  ENDIF
  &i=&i+1
ENDWHILE
PRINT "Automation finished."

执行后,Log 窗口会依次输出每次采样的转速值;若某次采样发现电压低于 11.0 V,脚本会打印报警并停止运行。判断任务是否成功的依据是:Log 中是否出现预期的采样记录、是否在异常时正确触发停止、以及最终是否输出 “Automation finished.”。通过这种方式,原本需要人工反复点击的操作被固化为可重复执行的脚本,为后续更复杂的 ECU 底层自动化调试打下基础。