Gol*_*ish 10 c linux real-time interrupt linux-kernel
我正在开发一个带有DSP和ARM的系统.在ARM上有一个Linux操作系统.我有一个DSP向ARM(Linux)发送数据 - 在Linux中有一个内核模块,它读取从DSP接收的数据.内核模块正在唤醒以使用DSP与ARM之间的硬件中断来读取数据.
我想编写一个用户空间应用程序,每次有来自DSP的新数据时,它将从内核空间(内核模块)读取数据.
问题是:
有什么方法可以做到这一点,从内核到用户空间的软件中断,或者每隔10ms从用户空间轮询(用内核读取已知的内存地址).
知道:
我会创建一个设备并打开userland程序块read.无需等待10毫秒,这可以通过阻塞有效地处理.
使用意义上的轮询poll(是的,我明白这不是你的意思)可以正常工作,但是当一个函数无论如何都没有理由调用两个函数(第一个poll然后再调用read).无需每10分钟执行一次,您可以poll在处理完上次读取后的内容后立即再次呼叫.
在每10ms检查已知存储位置的意义上的轮询是不可取的.这不仅是一个丑陋的黑客,而且比你想象的更复杂(你必须将包含该内存位置的页面映射到用户空间),以及繁忙等待的形式,它不必要地消耗CPU,它还具有5ms的平均延迟和最糟糕的延迟为10毫秒,这是完全没必要的.平均和最差情况下的延迟read大约为零(嗯,不完全,但几乎如此......它与唤醒被阻止的任务一样快).
中断(即信号)非常有效,但与简单的读取和阻塞(必须编写信号处理程序,可能不使用处理程序中的某些功能,必须与主应用程序通信等)相比,使程序更加复杂/扭曲.虽然技术上是一个很好的解决方案,但我会反对他们,因为程序不需要比必要的复杂.