树莓派Pico(RP2040)下machine.Timer与_thread共用异常问题
故障原因分析
- 无阻塞死循环抢占全部执行资源:
balance()是无任何阻塞逻辑的死循环,全程占用Python解释器的执行权,不会主动让出CPU。树莓派上的Python运行环境中,Timer触发的回调函数不会直接在中断上下文执行,而是先进入内部事件调度队列,等待解释器空闲时再执行。balance持续占满执行资源,导致解释器始终没有空隙处理队列中的定时器回调事件。 - 定时器频率过高队列溢出:你设置的Timer触发频率为3000Hz,也就是每333微秒就会生成一个回调事件,高频率下事件快速堆积,调度队列很快被占满,最终定时器直接停止调度后续回调。
- 全局对象资源竞争风险:
balance线程和定时器回调同时操作motor1、motor2两个全局对象,虽然当前场景未直接触发报错,但属于不稳定隐患,极端情况下会导致对象状态异常。 - 冗余代码不影响运行:
issr函数声明了全局变量i但未实际使用,属于代码冗余,不会导致回调停止。
修复方案
- 在
balance的死循环中添加极短延时释放执行权,比如增加time.sleep_us(10),既不会影响set_speed的控制逻辑,也能给定时器回调留出足够的执行窗口。 - 结合步进电机的实际驱动需求适当降低Timer的触发频率,减少不必要的调度压力。
- 如果确实需要3kHz及以上的高频脉冲输出,建议改用硬件PWM或者C层面的中断逻辑实现,不要在Python层面处理高频定时器回调。
内容的提问来源于stack exchange,提问作者AntCwo
相关产品推荐
相关产品推荐

