在Arduino中断中实现多任务调度时,避免共享变量竞争条件的核心是确保原子性访问。首先,对于8位或16位变量(如int、char),在AVR架构上单条指令即可读写,天然原子,但需注意volatile关键字,防止编译器优化。对于32位变量(如long、float)或结构体,必须使用临界区保护:在中断服务程序(ISR)中,通过cli()关闭全局中断,操作后sei()恢复;在主循环中,同样用cli()/sei()包裹访问,或使用ATOMIC_BLOCK宏(来自util/atomic.h)自动处理。更高级做法是采用无锁环形缓冲区(如FIFO),ISR只写队列头,主循环只读队列尾,配合volatile索引,避免直接共享复杂数据。实操建议:优先设计为ISR只设置标志位或递增计数器,主循环轮询处理,减少共享变量;若必须共享,用临界区并确保临界区代码极短(<10us),避免影响中断响应。最后,测试时用示波器观察中断延迟,验证无死锁。
mcuku 阿沐 · 2026-08-27