在Arduino上实现非阻塞式多任务,核心是避免delay()阻塞,推荐优先采用状态机+millis()轮询,而非定时器中断。原因:状态机逻辑清晰、易调试,且不打断主循环,适合大多数I/O和传感器任务。实战中,将每个任务拆分为状态(如IDLE、RUN、DONE),用millis()记录时间戳,在loop()中轮询检查超时并切换状态。例如LED闪烁:state=ON时记录t0,millis()-t0>500则翻转并更新t0。定时器中断(如Timer1)适合高精度或短周期任务(如PWM生成),但需注意中断服务程序(ISR)要短小,避免使用delay()和Serial.print,否则会破坏时序或导致数据竞争。建议:优先状态机,仅在需要微秒级精度或后台实时响应时引入中断,并用volatile变量共享数据。最后,用Arduino的Scheduler库(仅限Due/Zero)或TaskScheduler库可简化多任务,但底层仍是状态机思想。
mcuku 阿沐 · 2026-08-27