我正在开发一个带有 DSP 和 ARM 的系统。 ARM上有一个linux操作系统。我有一个 DSP 向 ARM (Linux) 发送数据 - 在 Linux 中,有一个内核模块读取从 DSP 接收到的数据。内核模块被唤醒以读取数据,使用 DSP 和 ARM 之间的硬件中断。
我想编写一个用户空间应用程序,每次有新数据从 DSP 到达时,它都会从内核空间(内核模块)读取数据。
问题是:
有什么更好的方法可以做到这一点,是从内核到用户空间的软件中断,还是每 10 毫秒从用户空间进行轮询(使用内核读取已知的内存地址)?
知道:
- 从DSP到内核的数据必须在非常短的时间内到达——100us。
- 数据从内核到用户空间可能需要 10 毫秒到 30 毫秒。
- 正在读取的数据被认为很小 - 大约 100 字节。
我将创建一个设备并打开用户态程序块read
。无需等待 10 毫秒,这是通过阻塞有效处理的。
使用意义上的轮询poll
(是的,我明白这不是你的意思)可以正常工作,但是没有理由调用两个函数(首先poll
进而read
)当一个函数无论如何都可以做到这一点时。不需要每10ms做一次,可以立即调用poll
在处理完上次阅读的内容后再次进行。
每 10 毫秒检查一次已知内存位置的轮询是不可取的。这不仅是一个丑陋的黑客行为,而且比你想象的更复杂(你必须将包含该内存位置的页面映射到用户空间),而且是一种不必要地消耗 CPU 的忙碌等待形式,它的平均延迟为 5 毫秒,最坏情况下的延迟为 10 毫秒,这是完全没有必要的。平均和最坏情况延迟read
大约为零(嗯,不完全是,但几乎如此......它与唤醒被阻止的任务一样快)。
中断(即信号)非常有效,但与简单的读取和阻塞相比,使程序变得更加复杂/扭曲(必须编写信号处理程序,不得在处理程序中使用某些函数,必须与主应用程序通信等)。虽然从技术上讲这是一个很好的解决方案,但我建议不要使用它们,因为程序不需要比必要的更复杂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)