Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 面试问题-如何在不丢失数据的情况下继续读取缓冲区_C_Embedded Linux_I2c_Spi_Can Bus - Fatal编程技术网

C 面试问题-如何在不丢失数据的情况下继续读取缓冲区

C 面试问题-如何在不丢失数据的情况下继续读取缓冲区,c,embedded-linux,i2c,spi,can-bus,C,Embedded Linux,I2c,Spi,Can Bus,我是一名嵌入式工程师,没有多少经验。我在一次采访中被问到一个问题,我想这不是新问题,已经有了答案: 你有一个不断从外部世界接收输入的外设,外设有一个缓冲区。输入的速率不时地变化。外围设备需要读取输入缓冲区并对其进行处理。它检查输入消息并查看它是否与配置的筛选器匹配。如果匹配,则转发,否则丢弃 问题如下: 你是如何做到这一点的 如果缓冲区满了怎么办?你只有有限大小的缓冲区?外围设备只有一定的处理缓冲区消息的速度 如何使缓冲区适应不同的输入速度 谢谢你的帮助。谢谢。基本上,他们是在检查你是否为某个串

我是一名嵌入式工程师,没有多少经验。我在一次采访中被问到一个问题,我想这不是新问题,已经有了答案:

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

问题如下:

  • 你是如何做到这一点的
  • 如果缓冲区满了怎么办?你只有有限大小的缓冲区?外围设备只有一定的处理缓冲区消息的速度
  • 如何使缓冲区适应不同的输入速度

  • 谢谢你的帮助。谢谢。

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

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

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


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

    谢谢您的回答。这是非常合乎逻辑的。中断是最好的选择。这是否适用于所有串行通信协议,如SPI、I2C等。。?蹩脚的问题:如果输入的速度很高怎么办?由于中断不能排队,如果ISR不够快,我们不会丢失输入数据吗?(ISR需要时间处理中断+时间检查过滤器+时间将数据复制到SW缓冲区)@Naveen是的,以上是所有串行总线通用的。如果输入的速度是CPU无法处理的,那么再多的队列也救不了你。处理实际数据本身的时间很可能比中断开销+延迟时间更长,因此,如果您甚至不能及时接收数据,您希望如何有时间在以后对其进行有意义的处理?。1工程师的做法是编写一个合理的规范,2工程师的做法是质疑该规范是否合理。因此,如果有一些10MHz SPI轰击8MHz系统时钟上运行的糟糕AVR,问题不在于如何让AVR及时响应(这不会发生),但对整个系统的设计提出了质疑,对波特率和微控制器的选择提出了质疑。