我正在开发一个带有 DSP 和 ARM 的系统。在 ARM 上有一个 linux 操作系统。我有一个 DSP 向 ARM (Linux) 发送数据——在 Linux 中有一个内核模块可以读取从 DSP 接收到的数据。内核模块正在唤醒以读取数据,使用 DSP 与 ARM 之间的硬件中断。
我想编写一个用户空间应用程序,每当有新数据从 DSP 到达时,它将从内核空间(内核模块)读取数据。
问题是:
What is better approach to do that, a software interrupt from the kernel to the user-space or polling from the user-space (reading a known memory address with the kernel) every 10ms..?
知道:
- 数据从 DSP 到内核必须在很短的时间内到达 - 100us。
- 从内核到用户空间的数据可能需要 10 毫秒到 30 毫秒。
- 正在读取的数据被认为很小——大约 100 字节。
最佳答案
我会创建一个设备并在读取
时让用户态程序 block 。无需在两者之间等待 10 毫秒,这可以通过阻塞有效地处理。
使用 poll
进行轮询(是的,我知道这不是你的意思)可以正常工作,但没有理由调用两个函数(第一个 poll
然后 read
) 当一个函数无论如何都可以完成时。无需每 10 毫秒执行一次,您可以在处理完上次读取的内容后立即再次调用 poll
。
从每 10 毫秒检查一次已知内存位置的意义上来说,轮询是不可取的。这不仅是一个丑陋的 hack 并且比你想象的更复杂(你必须将包含该内存位置的页面映射到用户空间),以及一种不必要地消耗 CPU 的忙碌等待形式,它还有 5ms 的平均延迟和最坏情况下的延迟为 10 毫秒,这是完全没有必要的。 read
的平均和最坏情况下的延迟大约为零(好吧,不完全是,但几乎是这样......它与唤醒阻塞任务一样快)。
中断(即信号)非常有效,但与简单的读取和阻塞相比,使程序更加复杂/扭曲(必须编写信号处理程序,不能在处理程序中使用某些功能,必须与主应用程序通信,等等.).虽然从技术上讲这是一个很好的解决方案,但我会反对他们,因为程序不需要比必要的更复杂。
关于c - Linux 中断与轮询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22662806/