我有一个司机需要:
- 从 FPGA 接收数据
- DMA 数据到另一个设备 (DSP) 进行编码
- 通过 UDP 将编码数据发送到外部主机
最初的计划是让应用程序处理步骤 3,但在下一组数据从 FPGA 到达之前,应用程序没有及时让处理器处理数据。
有没有办法强制调度程序(来自驱动程序)运行我的应用程序?
如果不是,我认为工作队列可能是我需要使用的解决方案,但我不确定如何/在何处调用网络堆栈/驱动程序以完成来自工作队列的 UDP 传输。
有任何想法吗?
您应该尝试找出应用程序“无法足够快地获取数据”的原因。
您的内存带宽可能大大优于典型的以太网带宽,因此即使将数据从驱动程序传递到应用程序也涉及复制。
如果用户空间中的 udp 链接速度不够快,那么在内核空间中也不会更快。你需要做的是:
您可能可以将您的应用程序拆分为两个线程,共享缓冲区列表
线程 A 等待驱动程序获得可用数据,并将其放在列表的尾部。
线程 B 从链表头部读取数据,并通过 UDP 发送。如果由于某种原因线程 B 正忙于等待发送特定缓冲区,fifo 会填充一点,但只要 UDP 链接带宽大于来自 DSP 的数据速率,你应该没问题。
将事物移入内核并不会神奇地使事情变得更快,只是编码、调试和跟踪要困难得多。