2009-11-25 18 views
7

Linuxに非同期のmemcpy関数はありますか?私はそれがDMAで動作し、完了したときに私に通知したい。Linuxの非同期memcpy?

+0

どのプラットフォームですか?このx86ですか? –

+1

ARM9プロセッサ、Freescale iMX233マイクロコントローラです。 – SunnyShah

答えて

7

私が知る限り、CPUはそれ自体にDMAを実行できません。だから、あなたのためのトリックをするためにバス上に外部ハードウェアが必要です。

ほとんどのハードウェアはすべての物理メモリを扱うことができません。したがって、正確なmemcpyクローンは、使用例のメモリアドレス範囲の定義が非常に厳密でない限り不可能です。さもなければ、カーネルはあなた自身のメモリブロック自身にブロックをmemcpyしなければなりません。これは、最初にmemcpyをクローンする目的を殺します:)

memcpyを使わずにメモリブロックの "クローン" (DMAメモリアクセスは通常CPUよりも遅いため、やはり悪い考え方ですが)、メモリブロックをビデオカードに送り、別のバッファに戻すことができます。ブロックをビデオメモリ(putbitmap()?:)に置き、ビットマップをハードウェアで高速化してコピーを作成することもできます。

あなたの実際の目標を共有してもらえますか?おそらく人々はよりスマートで優れたトリックを思いつくことができますか?

+0

@ssg、私の実際の目標は、最適化されたビデオプレーヤーを作成することです。その中で、自分のYUVデータをキューにコピーします。コピーに2秒かかりました。このコピーがDMAよりも起こった場合は、この時点では別のスレッドでオーディオのデコードを行うことができます。 – SunnyShah

+3

@Sunny Shah、おそらく共有メモリを使用してゼロコピーソリューションを検討する必要がありますか?なぜあなたはそのような大きなメモリのチャンクをコピーしていますか? – Dipstick

+1

FFMPEGはデコード関数出力としてYUVFrameを出力します。次のYUVFrameが欲しいときは、既存のYUVFrameを編集して新しいものを作成するだけです。だから私はYUVFrameをバッファのキューにコピーし、その時にキューからフレームを表示します。このコピーには処理時間の約7%がかかります。 – SunnyShah

3

マルチコアプロセッサまたはhyper-threadingのプロセッサであっても、通常の(同期)memcpyを別のスレッドで実行することで、必要なものを並べ替えることができます。私は良いアイデアだと言っているわけではなく、ただのことを指摘しています。

1

あなたはmremapでいくつかの演劇をすることができます。 また、別のフレームに異なるバッファを使用するようにFFmpegをハックすることもできます。