Advertisement

一个简单实用的MCU程序框架用于串口接收环形缓冲区(非操作系统、简单调度任务)

阅读量:

前文阐述了一种简洁高效的MCU程序架构,其中引入了定时节拍机制。本文将探讨如何将串口接收功能整合至该框架中。

在单片机系统中,串口数据的接收通常依赖于中断服务程序实现。若在中断内部直接进行数据解析操作,则可能引发与主程序共享资源之间的冲突问题。正如前文所述,中断本质上具有比主程序更高的优先级,包括定时中断与串口中断在内的各类中断均可视为独立线程。因此,在多线程环境下必然存在资源竞争的风险。如需进一步了解相关细节,可参阅我的另一篇文章:谨慎处理单片机中断,中断等价于比主程序优先级更高的线程 。为避免此类问题,正确的做法是先将接收到的数据缓存至临时存储区,随后在主循环中检测缓冲区是否存在待处理数据,并在确认后进行解析。

最基础的缓冲区模型通常采用一个Buf[size]数组结构,在串口接收中断中通过Buf[len++] = Data的方式写入数据,之后由主程序负责解析。然而深入分析可以发现,在完成数据解析后需要及时清除已处理的数据以防止重复解析问题的发生。因此必须引入一种标志机制来标识哪些数据已被处理过。若采用主程序直接清零缓冲区长度len的方式作为标志,则存在潜在风险:当主程序即将清零len变量(尚未完成)时若发生串口接收中断,则新接收的数据会被写入 Buf[len++] 中;当退出中断返回主程序后执行清零操作时,刚写入的数据将被覆盖丢失。

上述冲突的根本原因在于共用了l

全部评论 (0)

还没有任何评论哟~