DMA FIFOにアクセスする際の効率を改善する
- 更新日2025-03-06
- 5分で読める
従来型DMA FIFOを実装するには、LabVIEWはLabVIEWとデバイスドライバ間のデータ移動に複数のデータコピーを使用します。これらの追加データコピーがCPUサイクルを消費するため、DMA FIFOを使用してビルド可能なアプリケーションのサイズが制限されます。規模が大きくリソースを大量に消費するアプリケーションでは、外部データ値リファレンスを使用してデータコピーの回避とCPUオーバーヘッドの減少を行うことを検討します。
使用するオブジェクト
以下のブロックダイアグラムオブジェクトを使用して、生成されるデータコピーの数を減らしながらDMA転送を実行します。
| 「メソッドをインボーク」関数 | ケースストラクチャ | In Place要素ストラクチャ | データ値リファレンスを削除 | エラー結合 | ||||
| | | | |
手順
以下のブロックダイアグラムを作成して、生成されるデータコピーの数を減らしながらDMA転送を実行します。このブロックダイアグラムは「読み取り領域を取得」メソッドで構成された「メソッドをインボーク」関数を使用してバッファから読み取る領域を集録し、In Place要素ストラクチャを介して読み取り領域へのリファレンスを渡します。In Place要素ストラクチャのサブVIはアプリケーション固有のコードを実行します。サブVIの実行後、「データ値リファレンスを削除」関数はバッファ上の領域を解放します。
プログラミングの目的に合わせてグレー部分をカスタマイズします。
以下のリストには、前のダイアグラムについての重要な情報が記載されています。
| 「メソッドをインボーク」関数を構成します。アプリケーションの必要性に応じて、書き込み領域を取得または読み取り領域を取得メソッドのいずれかを選択します。 |
| 読み取りまたは書き込み領域へのリファレンスを、データ値読み取り/書き込みノードで構成されたIn Place要素ストラクチャに配線します。 |
| プログラミングの目的を満たすようにカスタマイズされたコードを含みます。 |
| データ値リファレンスを削除します。予約済みの領域に再びアクセスできるようにするには、データ値リファレンスを削除する必要があります。 |
| VIが「エラー結合」関数を使用して正しい順番でエラーを処理することを確認します。In Place要素ストラクチャからの入力エラーの前に「メソッドをインボーク」関数からの入力エラーを処理する必要があります。 |
ヒントとトラブルシューティング情報
領域を集録する場合、要素数と領域内の要素は必ずしも同じではありません。一部のターゲットでは、メモリに割り当てられるバイト数は特定ターゲットで有効な4096の倍数に強制変換されます。これらのターゲットでは、4096の倍数である要素数を指定してバッファの折り返しを回避します。有効なFIFO深度については、ターゲットハードウェアのドキュメントを参照してください。
バッファが領域を集録できない場合、「メソッドをインボーク」関数はエラー-61219を返します。ほとんどの場合、このエラーは「メソッドをインボーク」関数が返すデータ値リファレンスの削除の失敗によって発生します。アプリケーションがコードによって特定のエラーを処理する場合は、-61219のエラーを確認してください。