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 窗口记录命令与脚本输出,是脚本调试的重要依据。这些窗口可以自由停靠、浮动或保存为工作区,便于在不同调试任务间切换。
命令语法与 .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 底层自动化调试打下基础。