0

我有一个司机需要:

  1. 从 FPGA 接收数据
  2. DMA 数据到另一个设备 (DSP) 进行编码
  3. 通过 UDP 将编码数据发送到外部主机

最初的计划是让应用程序处理步骤 3,但在下一组数据从 FPGA 到达之前,应用程序没有及时让处理器处理数据。

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

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

有任何想法吗?

4

1 回答 1

0

您应该尝试找出应用程序“无法足够快地获取数据”的原因。

您的内存带宽可能大大优于典型的以太网带宽,因此即使将数据从驱动程序传递到应用程序也涉及复制。

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

  • 了解为什么您的应用程序不够快,也许是通过跟踪它。
  • 在用户空间实现排队。

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

  • 线程 A 等待驱动程序获得可用数据,并将其放在列表的尾部。

  • 线程 B 从链表头部读取数据,并通过 UDP 发送。如果由于某种原因线程 B 正忙于等待发送特定缓冲区,fifo 会填充一点,但只要 UDP 链接带宽大于来自 DSP 的数据速率,你应该没问题。

将事物移入内核并不会神奇地使事情变得更快,只是编码、调试和跟踪要困难得多。

于 2011-04-22T08:19:13.057 回答