0

次のことが必要なドライバーがあります。

  1. FPGAからデータを受け取る
  2. エンコーディングのための別の別のデバイス (DSP) への DMA データ
  3. エンコードされたデータを UDP 経由で外部ホストに送信する

当初の計画では、アプリケーションでステップ 3 を処理する予定でしたが、FPGA から次のデータ セットが到着する前に、アプリケーションがデータを処理するのに間に合うようにプロセッサを取得できませんでした。

(ドライバから) スケジューラに強制的にアプリケーションを実行させる方法はありますか?

そうでない場合は、ワーク キューを使用する必要があるソリューションである可能性が高いと思いますが、ワーク キューからの UDP 転送を実行するためにネットワーク スタック/ドライバーを呼び出す方法/場所がわかりません。

何か案は?

4

1 に答える 1

0

アプリケーションが「十分な速さでデータを取得できない」理由を突き止める必要があります。

メモリの帯域幅は、おそらく典型的なイーサネットの帯域幅よりもはるかに優れているため、ドライバーからアプリケーションにデータを渡すときにコピーが必要になる場合でも.

udp リンクがユーザー空間で十分に高速でない場合、カーネル空間でも高速にはなりません。あなたがする必要があるのは:

  • あなたのアプリケーションが十分に速くない理由を理解してください。
  • ユーザー空間にキューイングを実装します。

おそらく、アプリケーションを 2 つのスレッドに分割して、バッファ リストを共有することができます

  • スレッド A は、ドライバーがデータを使用できるようになるまで待機し、それをリストの末尾に配置します。

  • スレッド B はリストの先頭からデータを読み取り、UDP 経由で送信します。何らかの理由でスレッド B が特定のバッファが送信されるのを待ってビジーである場合、FIFO は少しいっぱいになりますが、UDP リンクの帯域幅が DSP からのデータのレートよりも大きい限り、問題はありません。

カーネルに何かを移動しても、魔法のように高速になるわけではありません。コーディング、デバッグ、トレースが非常に困難になるだけです。

于 2011-04-22T08:19:13.057 に答える