【发布时间】:2014-03-26 13:41:20
【问题描述】:
我正在开发一个带有 DSP 和 ARM 的系统。在 ARM 上有一个 linux 操作系统。我有一个 DSP 向 ARM (Linux) 发送数据 - 在 Linux 中有一个内核模块,它读取从 DSP 接收到的数据。内核模块正在唤醒以读取数据,使用 DSP 到 ARM 之间的硬件中断。
我想编写一个用户空间应用程序,它会在每次有来自 DSP 的新数据到达时从内核空间(内核模块)读取数据。
问题是:
有什么更好的方法来做到这一点,从内核到用户空间的软件中断或每 10 毫秒从用户空间轮询一次(使用内核读取已知的内存地址)..?
知道:
- 从 DSP 到内核的数据必须在很短的时间内到达 - 100us。
- 从内核到用户空间的数据可能需要 10 毫秒到 30 毫秒。
- 正在读取的数据被认为很小 - 大约 100 字节。
【问题讨论】:
-
有点取决于您的应用程序...您能否再给我们一些参数,说明您对数据通知所做的工作,该代码的时间限制是什么?
-
关于读取内核中已知的内存地址,不要那样做!看看其他设备是如何工作的:它们让用户空间应用程序打开一个文件描述符,然后应用程序可以从中读取数据。您可能还想了解其他(类似)设备如何处理通知/轮询。
-
您的延迟要求是什么?您的电源限制是什么?
-
通常从驱动程序设置一个信号量 - 用户空间线程等待它,驱动程序发出信号并在退出时要求重新安排。轮询只是浪费和延迟诱导。
-
我用时间延迟和数据大小更新了问题..
标签: c linux linux-kernel real-time interrupt