c-访谈问题-如何在不丢失数据的情况下连续读取缓冲区



我是一名嵌入式工程师,经验不多。我参加了一次面试,有人问我一个问题,我想这不是什么新鲜事,已经有了答案:

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

问题如下:

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

感谢您的帮助。谢谢

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

在";老派;方法是设置一个rx中断。如果数据可以不规则地到达,并且我们不允许丢失数据,那么中断几乎是唯一明智的方式。特别是如果有计划支持不同的baudrate。

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

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

相关内容

最新更新