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

Embedded 在双缓冲区和环形缓冲区之间选择?,embedded,microcontroller,circular-buffer,double-buffering,Embedded,Microcontroller,Circular Buffer,Double Buffering,我有一个通过微控制器的UART发送的数据包解码问题(固件需要是纯金属的,不支持RTOS)。数据包长32字节,每10毫秒发送一次(连续发送,不停止) 我需要在ISR中执行最小的处理(以保持ISR足够短),并在main()循环中执行延迟处理。我想到了两种方法- 1.使用中断安全环形缓冲区,ISR写入缓冲区并从中读取main()循环。假设头指针和尾指针是我的体系结构的原子类型,以确保缓冲区是中断安全的。请参见示例实现 使用双缓冲方案(乒乓缓冲区),其中main()循环应在ISR写入另一个缓冲区时处理其

我有一个通过微控制器的UART发送的数据包解码问题(固件需要是纯金属的,不支持RTOS)。数据包长32字节,每10毫秒发送一次(连续发送,不停止)

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

  • 使用双缓冲方案(乒乓缓冲区),其中main()循环应在ISR写入另一个缓冲区时处理其中一个缓冲区。假设我可以自动修改指向ISR缓冲区的指针,从而避免关键部分问题
  • UART能够生成RX FIFO非空中断。此外,还提供DMA支持

  • 这里使用的最佳数据结构是什么
  • 这里涉及的权衡是什么

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

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

    您能解释一下,如果输入速度或处理速度不同,为什么双缓冲区不是一个好的选择吗?如果它们变化足够大,生产商可以在消费者处理一个插槽所需的时间内填满两个插槽,没有空闲的插槽可供使用。是的,这是真的,但最终可能与您对环形缓冲区的批评没有什么不同:如果处理不能跟上,某些东西将失败。环形缓冲区和“双缓冲区”并不像您建议的那样相似。环形缓冲区不需要ISR来解码协议,而“双缓冲区”则需要。因此,我不认为这是简单的默认正确答案。在环形缓冲区中维护单独的读写指针非常简单——ISR只修改写指针,主线只修改读指针。相比之下,切换缓冲区要复杂得多。你能解释一下,如果输入速率或处理速率不同,为什么双缓冲区不是一个好的选择吗?如果它们的变化足够大,生产者可以在消费者处理一个缓冲区所需的时间内填满两个缓冲区,那么就没有空闲的缓冲区可供使用。是的,这是真的,但最终,这可能与您对环形缓冲区的批评没有什么不同:如果处理不能跟上,某些东西将失败。环形缓冲区和“双缓冲区”并不像您所建议的那样相似。环形缓冲区不需要ISR来解码协议,而“双缓冲区”则需要。因此,我不认为这是简单的默认正确答案。在环形缓冲区中维护单独的读写指针非常简单——ISR只修改写指针,主线只修改读指针。相比之下,切换缓冲区要复杂得多。在双缓冲区方法中切换缓冲区的标准是什么?我猜你有一种“开始包”的角色可以做到这一点?乍一看,这看起来比简单的环形缓冲区要复杂一些,没有多少好处。此外,从丢失的“数据包启动”中恢复对我来说似乎更困难。双缓冲区要求ISR解码协议和交换缓冲区。相比之下,环形缓冲区不需要ISR来解码协议,但某些代码必须从环形的读取端足够快地读取,以避免填充:该代码通常会将数据复制到另一个缓冲区,解析协议并保留可识别的数据包。IMO环形缓冲区对ISR的要求较低。在双缓冲区方法中,切换缓冲区的标准是什么?我猜你有一种“开始包”的角色可以做到这一点?乍一看,这看起来比简单的环形缓冲区要复杂一些,没有多少好处。此外,从丢失的“数据包启动”中恢复对我来说似乎更困难。双缓冲区要求ISR解码协议和交换缓冲区。相比之下,环形缓冲区不需要ISR来解码协议,但某些代码必须从环形的读取端足够快地读取,以避免填充:该代码通常会将数据复制到另一个缓冲区,解析协议并保留可识别的数据包。IMO环形缓冲区对ISR的要求较低。