c - Linux 中断与轮询

标签 c linux linux-kernel real-time interrupt

我正在开发一个带有 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/

相关文章:

c++ - 将 C++ vector 转换为 C

c - 如何隐藏Linux静态库的本地符号

c++ - 在Linux中编译Windows Qt代码并更改库

linux - AWK- 读取 excel 文件 (CSV) 并制作另一个

linux-kernel - Linux内核命令行开关上的三连字符

java - 如何开发使用 Android 源代码中的 C 文件的应用程序

C - 移动数组

c - Queue中的node_add,只插入前3个作为前中后

c - 有没有类似qsort()的函数可以用在内核空间?

linux-kernel - drmDropMaster 需要 root 权限?