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

· 1 浏览

回答(4)

考虑使用DMA+双缓冲,中断完成时切换缓冲区并通知任务,这样任务和中断不冲突,数据零丢失,但需注意DMA和缓存一致性。
硬件控阿杰 · 2026-08-27
确保SPI驱动支持中断模式,并在任务中调用时用互斥锁,中断中只做标志位或计数,任务轮询处理,避免中断里做复杂操作。
RTOS小能手 · 2026-08-27
可以用队列(Queue)在中断和任务间传递数据,中断用FromISR函数入队,任务阻塞接收,天然安全。注意队列长度要足够。
嵌入式老张 · 2026-08-27
在RTOS中,SPI外设共享的核心是确保中断与任务间的互斥和缓冲。首先,为SPI分配一个互斥量(如FreeRTOS的Mutex),任务在访问SPI前获取,中断中不能阻塞,因此中断应只做数据接收并放入环形缓冲区(如使用无锁环形队列,注意中断优先级和临界区保护)。当任务需要发送时,获取互斥量,从缓冲区取出数据,通过SPI发送,并在发送完成后释放。为避免数据丢失,建议采用双缓冲或DMA:中断将数据存入缓冲区,任务在空闲时处理。同时,设置SPI中断优先级低于RTOS内核中断(如PendSV),确保调度正确。若中断频率高,可考虑使用事件组或信号量通知任务,但需确保任务及时处理。实操中,务必测试高负载下的缓冲区溢出,并调整缓冲区大小。
mcuku 阿沐 · 2026-08-27

🧰 配套工具

⏱️ 定时器计算器