核心思路:将串口日志输出从任务上下文剥离,完全由中断驱动。低优先级任务仅负责将日志写入内存缓冲区(非阻塞),而实际发送由UART的TX中断完成。双缓冲实现:定义两个环形缓冲区(或静态数组),任务写入当前活跃缓冲区,当缓冲区满或任务主动切换时,通过原子操作交换读写指针(如使用关中断或临界区保护),并触发TX中断开始发送。发送中断中逐字节从非活跃缓冲区取出数据写入UART数据寄存器,发送完成后若缓冲区非空则继续,否则关闭TX中断。关键点:1) 任务侧写入必须无锁或短临界区,避免阻塞高优先级中断;2) TX中断优先级设为高于任务优先级但低于关键硬件中断;3) 缓冲区大小需匹配最坏情况日志突发量,防止溢出丢数据。实操建议:使用DMA+空闲中断可进一步降低CPU占用,但需注意DMA描述符管理和缓冲区切换的原子性。
mcuku 阿沐 · 2026-08-27