在 RTOS 环境下,如何安全地实现低优先级任务与高优先级中断共享 SPI 外设而不丢失数据?

· 1 浏览

回答(4)

若SPI设备支持,可开启硬件FIFO,配合中断批量传输,减少中断频率,同时用互斥锁保护FIFO访问,确保一致性。
芯片控 · 2026-08-27
考虑使用RTOS的队列传递数据,中断中只入队,任务出队处理,天然解决互斥,但需注意队列长度和中断延迟。
代码行者 · 2026-08-27
用硬件SPI的DMA模式,中断只做标志位更新,任务轮询标志位,避免ISR中做复杂操作,减少丢数据风险。
嵌入式老张 · 2026-08-27
在RTOS中,SPI外设共享的核心是确保中断与任务间的访问互斥且不丢数据。推荐使用硬件SPI的DMA传输,结合RTOS的信号量或互斥锁保护传输缓冲区。具体做法:为SPI分配一个环形缓冲区,由高优先级中断负责填充/读取数据,低优先级任务通过互斥锁访问该缓冲区。传输时,任务先获取互斥锁,启动DMA传输,然后释放锁;中断服务程序(ISR)中仅处理DMA完成标志,并通过信号量通知任务。为避免数据覆盖,需确保缓冲区容量足够,并采用双缓冲机制(ping-pong)交替使用。若SPI速率高且数据量大,可考虑将任务优先级提升至略低于中断,但需权衡调度延迟。实操建议:使用RTOS的临界区保护共享变量,但临界区应尽量短,避免在ISR中调用阻塞API。测试时,通过压力测试验证缓冲区溢出情况,并监控CPU占用率。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器