udp从驱动程序发送

时间:2011-04-21 20:24:02

标签: linux udp driver scheduler dma

我有一个需要的驱动程序:

  1. 从FPGA接收数据
  2. 将DMA数据发送到另一个设备(DSP)进行编码
  3. 通过UDP将编码数据发送到外部主机
  4. 最初的计划是让应用程序处理第3步,但是在下一组数据从FPGA到达之前,应用程序无法及时处理数据。

    有没有办法强制调度程序(来自驱动程序)运行我的应用程序?

    如果没有,我认为工作队列可能是我需要使用的解决方案,但我不确定如何/在何处调用网络堆栈/驱动程序来完成工作队列的UDP传输。

    有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您应该尝试发现为什么应用程序“无法足够快地获取数据”。

你的内存带宽可能远远超过了典型的以太网带宽,所以即使将数据从驱动程序传递到应用程序也需要复制。

如果udp链接在用户空间中不够快,那么在内核空间中它将不会更快。 你需要做的是:

  • 理解为什么你的应用程序不够快,也许是通过支撑它。
  • 在用户空间实现排队。

您可以将应用程序拆分为两个共享缓冲区列表

  • 线程A等待驱动程序提供数据,并将其放在列表的尾部。

  • 线程B从列表头部读取数据,并通过UDP发送。如果由于某种原因线程B忙于等待发送特定缓冲区,则fifo会填充一点,但只要UDP链路带宽大于来自DSP的数据速率就可以了。

将内容移动到内核中并不会使事情变得更加神奇,因此编写和调试和跟踪变得更加困难。