我正在开发带有DSP和ARM的系统。在ARM上有一个Linux OS。我有一个DSP将数据发送到ARM(Linux)-在Linux中,有一个内核模块可以读取从DSP接收的数据。使用DSP与ARM之间的硬件中断,内核模块正在唤醒以读取数据。

我想编写一个用户空间应用程序,每次从DSP收到新数据时,该应用程序将从内核空间(内核模块)读取数据。
问题是:



知道:

  • 从DSP到内核的数据必须在很短的时间内到达-100us。
  • 从内核到用户空间的数据可能需要10到30毫秒。
  • 正在读取的数据被认为很小-大约100个字节。
  • 最佳答案

    我将创建一个设备,并在read上使用userland程序块。无需等待10ms,这可以通过阻塞有效地处理。

    从某种意义上讲,使用poll进行轮询(是的,我明白这不是您的意思)可以正常工作,但是当一个函数仍然可以执行时,没有理由调用两个函数(第一个pollread)。无需每10毫秒执行一次,您可以在处理完上次读取的内容后立即再次调用poll

    建议每10毫秒检查一次已知的内存位置,以进行轮询。这不仅是一个丑陋的黑客,而且比您想象的要复杂(您必须将包含该内存位置的页面映射到用户空间),并且是一种不必要地占用CPU的繁忙等待形式,而且平均延迟为5毫秒,最坏的情况是10ms的延迟,这完全没有必要。 read的平均和最坏情况下的延迟大约为零(嗯,虽然不完全,但是几乎如此……与唤醒被阻止的任务一样快)。

    中断(即信号)非常有效,但与简单的读取和阻塞(必须编写信号处理程序,可能不使用处理程序中的某些功能,必须与主应用程序通信等)相比,使程序变得更加复杂/扭曲。从技术上讲,这是一个很好的解决方案,但我建议您不要这样做,因为程序的复杂程度不必比必需的复杂。

    关于c - Linux中断与轮询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22662806/

    10-12 16:16