面试问题-如何连续读取缓冲区而不会丢失数据

问题描述

我是一名嵌入式工程师,经验不足。我在接受采访时被问到一个问题,我想这不是新问题,已经有了答案:

您有一个不断接收来自外部世界的输入的外围设备,该外围设备有一个缓冲区。输入速率不时更改。外设需要读取输入缓冲区并进行处理。它检查输入消息,并查看其是否与配置的过滤器匹配。如果匹配则将其转发,否则将被丢弃。

问题就像:

  1. 您如何管理此事?
  2. 如果缓冲区已满怎么办?您只有有限大小的缓冲区吗?外设只能以一定的速度处理缓冲区消息。
  3. 如何使缓冲区适应不同的输入速度?

感谢您的帮助。谢谢。

解决方法

基本上,他们正在检查您是否曾经为某个串行外围设备编写过程序,因此检查某人是否是一个完整的初学者是一个很好的面试问题。

以“老派”方式执行此操作的通常方法是设置一个rx中断。如果数据可能会不规则地到达并且不允许我们丢失数据,那么中断几乎是唯一明智的方法。尤其是如果有计划也支持不同的波特率。

然后可以将过滤器检查放置在ISR内部(在CAN中除外,在CAN中,检查实际上是由硬件完成的)。然后,有效数据将从此传递到软件环形缓冲区。这样可以最大程度地减少ISR内部的执行时间,同时可以解决硬件缓冲区有限的问题。数据重入保护最好需要通过环形缓冲区代码来执行。

如果微控制器支持,现代的方法是避免中断,而使用DMA。这使CPU不必处理频繁的rx中断。然后,我们可以在每次缓冲区满时交换DMA缓冲区目标地址,然后从那里处理原始缓冲区。或者,如果我们由于某些原因无法交换DMA缓冲区地址,则可以将整个DMA缓冲区粗略地硬拷贝到其他位置。