面试题——如何在不丢失数据的情况下连续读取缓冲区

Interview question - How to continuosly read a buffer without losing data

我是一名嵌入式工程师,经验不多。我在面试时被问到一个问题,我想这个问题不是新问题并且已经有了答案:

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

问题如下:

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

感谢您的帮助。谢谢。

基本上他们是在检查你是否曾经为一些串行外围设备编写过程序,所以这是一个很好的面试问题来检查一个人是否是一个完全的初学者。

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

然后可以将过滤器检查放在 ISR 中(在 CAN 中除外,此类检查实际上是由硬件完成的)。从那里开始,有效数据被传递到软件环形缓冲区。这最大限度地减少了 ISR 内部的执行时间,同时解决了硬件缓冲区有限的问题。数据re-entrancy保护最好需要通过ring buffer代码进行。

如果微控制器支持的话,现代方法宁愿避免中断而使用 DMA。这减轻了 CPU 处理频繁 rx 中断的负担。然后我们可以在每次缓冲区满时交换 DMA 缓冲区目标地址,并从那里使用原始缓冲区。或者,如果我们出于某种原因无法交换 DMA 缓冲区地址,则直接将整个 DMA 缓冲区粗略地硬拷贝到其他地方。