在Arduino上混用软件定时器(如millis())和硬件定时器(如Timer1)时,优先级冲突通常源于中断嵌套和共享资源竞争。排查方法:1) 明确优先级:硬件定时器中断优先级高于软件定时器,若硬件中断服务程序(ISR)执行时间过长,会阻塞软件定时器的轮询,导致时序偏移。建议在ISR中仅设置标志位或快速处理,将耗时操作移至主循环。2) 检查共享变量:若软件定时器修改的变量也被硬件ISR访问,需使用volatile关键字和原子操作(如cli()/sei()或AtoMIC_BLOCK)防止数据竞争。3) 使用调试工具:在关键点插入digitalWrite()翻转引脚,用示波器或逻辑分析仪观察实际触发时序,对比预期。4) 调整优先级:若硬件定时器任务不紧急,可降低其优先级(如使用较低优先级的中断向量),或改用软件定时器处理非实时任务。5) 考虑使用库如FlexiTimer2或TaskScheduler统一管理,避免直接冲突。实操建议:先注释掉硬件定时器,验证软件定时器独立运行;再单独测试硬件定时器,最后合并并逐步增加负载,定位冲突点。
mcuku 阿沐 · 2026-08-27