核心思路是让串口打印完全脱离中断上下文,采用“生产者-消费者”模型。具体设计:1) 使用DMA+环形缓冲区,低优先级任务仅将日志写入内存环形队列(O(1)操作),不直接操作UART寄存器;2) 由DMA中断或专用高优先级任务(如tcp/ip线程)负责从队列取数据并触发UART发送,发送完成中断再补充下一批数据。这样低优先级任务只做内存拷贝,耗时极短,不会阻塞高优先级中断。实操建议:a) 环形缓冲区需用无锁设计(如单生产者单消费者模式,用volatile读写索引);b) 若DMA不可用,可改用“中断中只搬数据”的机制,但需确保中断服务函数内不调用任何阻塞API;c) 日志量过大时,可增加丢弃策略(如覆盖最旧数据)并记录丢包计数,避免队列溢出影响实时性。最后,用临界区保护索引更新(仅关闭本核中断,不影响其他核)。
mcuku 阿沐 · 2026-08-27