在双缓冲区和环形缓冲区之间进行选择?

时间:2019-02-12 10:02:28

标签: embedded microcontroller circular-buffer double-buffering

我在解码通过微控制器的UART发送的数据包时遇到问题(固件必须是裸机,不支持RTOS)。数据包的长度为32个字节,每10毫秒发送一次(连续不断,没有任何停止)。

我需要在ISR中进行非常少的处理(以使ISR足够短),并在main()循环中进行延迟处理。我想到两种方法- 1.使用中断安全的环形缓冲区,ISR写入缓冲区,并从中读取main()循环。头和尾指针被假定为我的体系结构的原子类型,以确保缓冲区是中断安全的。请参阅示例实现here

  1. 使用双缓冲方案(乒乓缓冲区),其中main()循环应在ISR写入另一个缓冲区的同时处理其中一个缓冲区。假设我可以原子地修改指向ISR缓冲区的指针,从而避免了关键部分问题。

UART能够产生RX FIFO非空中断。还提供DMA支持。

  1. 在此使用哪种最佳数据结构?
  2. 这里涉及的权衡是什么?

1 个答案:

答案 0 :(得分:2)

双缓冲区只是一种特殊的环形缓冲区,只有两个在生产者和使用者之间交换的插槽。如果您的处理时间相差不大,那么就足够了。如果输入速率或处理时间不同,环形缓冲区可能会有所帮助,但是当处理无法跟上时,您很可能需要一些流量控制来降低输入速率。