8

ハードウェア インターフェイスを使用してデータを送信していますが、 DMAバッファを設定する必要があり、64 ビット境界に揃える必要があります。

DMA エンジンは、バッファが少なくとも 32 ビット境界 (4 バイト) に配置されていることを想定しています。最適なパフォーマンスを得るには、バッファーを 64 ビット境界 (8 バイト) に揃える必要があります。転送サイズは 4 バイトの倍数でなければなりません。

私はposix_memalignこのようなバッファを作成するために使用します...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int) ) )

pPatternintへのポインタであり、DmaBufferSizeinInt32s深いバッファの開始です。

バッファーは 64 ビットでアライメントされていますか?

4

3 に答える 3

8

はい、バッファは 64 ビットで整列されています。また、4 KByte 境界に配置されています (したがって 0x1000)。4 KB のアライメントが必要ない場合は、0x1000 の代わりに 0x8 を渡します ...

編集:通常、DMAチェーンを書き込むときは、キャッシュされていないメモリまたはある種の非キャッシュベースの書き込みキューを介して書き込むことにも注意してください。この場合、DMA チェーンをキャッシュ ライン サイズに合わせて、キャッシュ ライトバックが DMA チェーンの開始または終了を上書きしないようにする必要があります。

于 2009-10-30T12:06:41.767 に答える
3

Goz が指摘したように、しかし (imo) 少し明確ではありません: 64 ビットをはるかに超える 0x1000 バイト (2 番目の引数) によるアライメントを求めています。

呼び出しを次のように変更できます。

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int)))

これにより、呼び出しが安価になり (無駄なメモリが少なくなります)、実際に必要なものにより近いものを要求するため、いずれにしてもより明確になります。

于 2009-10-30T12:53:02.843 に答える
0

私はあなたのハードウェアを知りませんし、どのように pPattern ポインターを取得しているのかもわかりませんが、これはあらゆる面で危険に思えます。私がよく知っているほとんどの DMA は、物理的な連続 RAM を必要とします。オペレーティング システムは、実質的に連続した RAM をユーザー プログラムに提供するだけです。つまり、1 MB のメモリ割り当ては、最大 256 の接続されていない 4K RAM ページで構成されている可能性があります。

多くの場合、メモリの割り当ては連続した物理的な部分で行われ、ほとんどの場合は機能しますが、常に機能するとは限りません。安全な DMA を提供するには、カーネル デバイス ドライバーが必要です。

pPattern ポインターデバイス ドライバーからのものである場合、なぜそれをさらに調整する必要があるのでしょうか。

于 2009-10-30T17:28:51.147 に答える