使用Python调用Trace32的CMM脚本时,如何等待脚本执行完成以避免Practice栈深度错误
使用Python调用Trace32的CMM脚本时,如何等待脚本执行完成以避免Practice栈深度错误
我之前也碰到过一模一样的问题,靠time.sleep()硬等的方式真的很鸡肋——要么等太久浪费时间,要么遇到复杂场景脚本执行超时又触发错误。给你几个更可靠的解决思路,亲测有效:
方案一:轮询Trace32的Practice栈深度
Trace32在运行CMM脚本时会占用Practice栈空间,脚本执行完成后栈深度会回到初始状态(通常是0或者一个很小的固定值)。你可以在Python里写个循环,定期查询栈深度,直到它恢复正常:
# 先获取初始栈深度(可选,避免环境初始栈非0的情况) initial_depth = int(instance.cmd("PRACTICE.STACK.Depth?")) instance.cmm("testScript.cmm") # 轮询等待栈深度回到初始值 while True: current_depth = int(instance.cmd("PRACTICE.STACK.Depth?")) if current_depth == initial_depth: break time.sleep(0.1) # 短间隔轮询,平衡资源占用和响应速度 instance.cmd("SYStem.Mode Go")
这个方法的优势是不需要修改CMM脚本本身,直接通过Trace32的内置命令获取状态。
方案二:让CMM脚本主动标记完成状态
修改你的testScript.cmm,在脚本最后添加一行设置全局标志的命令,让脚本主动告知Python自己执行完了:
# 这是testScript.cmm的最后一行 GLOBAL.SET test_script_finished = 1
然后在Python代码里轮询这个全局变量:
# 先重置标志位,避免上次执行的残留值影响 instance.cmd("GLOBAL.SET test_script_finished = 0") instance.cmm("testScript.cmm") # 等待标志位被设置为1 while True: finished_flag = int(instance.cmd("GLOBAL.GET test_script_finished?")) if finished_flag == 1: break time.sleep(0.1) instance.cmd("SYStem.Mode Go")
这个方法逻辑更清晰,尤其是当你的CMM脚本有嵌套调用或者异步操作时,比栈深度轮询更可靠。
方案三:检查脚本任务是否存在
Trace32的TASK命令可以查看当前运行的脚本任务,你可以用TASK.EXIST来判断目标CMM脚本是否还在运行:
instance.cmm("testScript.cmm") # 轮询检查脚本任务是否已结束 while True: # TASK.EXIST会返回1(存在)或0(不存在) task_running = int(instance.cmd('TASK.EXIST("testScript.cmm")?')) if task_running == 0: break time.sleep(0.1) instance.cmd("SYStem.Mode Go")
注意:如果你的CMM脚本是作为子任务被调用的,可能需要调整查询的任务名称,比如加上路径或者父任务标识。
关于timeout=None无效的说明
你提到的timeout=None参数没生效,大概率是因为cmm()方法的timeout只是控制Python等待Trace32响应这个调用命令的时间,而不是等待CMM脚本内部执行完成。Trace32收到cmm("testScript.cmm")指令后,会立即返回确认,然后在后台执行脚本,所以这个参数无法帮你等待脚本跑完。
备注:内容来源于stack exchange,提问作者BeanBoy
相关产品推荐
相关产品推荐

