You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 19:13:02