DMAアプリケーションでバッファエラーを回避する
- 更新日2025-03-06
- 5分で読める
DMAバッファが保持できる要素数 (バッファのサイズまたは深度) は、堅牢なアプリケーションを設計する際に重要な部分です。バッファでの要素数は、アプリケーションに以下の影響を与えます。
- バッファが小さすぎる場合、データを読み取り削除する前にバッファが一杯になります。この状態はオーバーフローと呼ばれ、バッファに書き込んだデータは失われます。
- バッファが大きすぎる場合は、FPGAやホストコンピュータで必要以上のリソースが使用され、アプリケーションのパフォーマンスが低下することがあります。
- 使用可能以上の要素数をバッファから読み取ろうとした場合、アンダーフローが発生してLabVIEWはエラーを返します。
堅牢なアプリケーションを設計するために、NIは以下を推奨します。
- 各バッファのサイズを適切に設定する
- アプリケーションがバッファのオーバーフローを検出および回避するように設計する
- バッファのアンダーフローを検出および回避するようにアプリケーションを設計する
- 古いデータがバッファに蓄積することを回避するようにアプリケーションを設計する
これらの方法についての詳細は、以下のセクションで説明されます。
バッファサイズを適切に設定する
以下の表は、各バッファのサイズを設定するDMAチャンネルを構成する2つのバッファと、各バッファの推奨サイズ、および各バッファの最大サイズが記載されています。
| バッファの場所 | 構成する場所 | デフォルトのバッファサイズ | 推奨バッファサイズ | 最大バッファサイズ |
|---|---|---|---|---|
| FPGAターゲット | FIFOプロパティダイアログボックスの一般ページ | 1023要素 | 1023要素。ほとんどのアプリケーションでは、FPGAバッファのサイズを変更する必要はありません。 | FPGAで使用可能なリソースとホストコンピュータでメモリに割り当てられるバイトの量によって異なります。FPGAに指定された要素数に対する十分なリソースがない場合、FPGA VIはコンパイルに失敗します。DMA FIFOのサイズ制限の詳細については、特定のFPGAターゲットのハードウェアドキュメントを参照してください。 |
| ホストコンピュータ | 「メソッドをインボーク」関数のFIFO.構成メソッド | 10,000要素またはFPGA FIFOバッファサイズの2倍のいずれか大きい方 | 読み取りまたは書き込みに指定した要素数の5倍 | FPGAで使用可能なリソースとホストコンピュータでメモリに割り当てられるバイトの量によって異なります。FPGAに指定された要素数に対する十分なリソースがない場合、FPGA VIはコンパイルに失敗します。DMA FIFOのサイズ制限の詳細については、特定のFPGAターゲットのハードウェアドキュメントを参照してください。 |
バッファのオーバーフローを検出および回避する
バッファがオーバーフローするかを検出するには、FIFOメソッドノードの書き込み可能要素数を取得メソッドを使用します。このメソッドは、データの書き込みが可能なバッファにある空の要素数を返します。この値が0の場合はバッファが一杯であり、バッファに書き込むデータが失われます。
以下の方法を使用して、バッファのオーバーフローを回避してください。
- バッファにデータを書き込む速度を下げる。
- ホストで読み取る要求する要素数を増やす。
- ホストがデータを読み取る速度を上げる。
- ホストバッファ、FPGAバッファ、または両方のサイズを増やす。
- ホストでCPUの負荷を減らす。CPU速度と競合するタスクの存在によって、ホストバッファからアプリケーションメモリへの転送レートが減少します。
バッファのアンダーフローを検出および回避する
バッファがアンダーフローするかを検出するには、FIFOメソッドノードの読み取り可能要素数を取得メソッドを使用します。このメソッドは、読み取りが可能なバッファにある要素数を返します。この数がバッファから読み取る要素数より小さい場合、バッファからの読み取りでバッファがタイムアウトする可能性があります。
バッファがいつアンダーフローになるかを検出するには、以下のブロックダイアグラムが示すようにFIFO.読み取りメソッドでエラー–50400を確認します。
いずれかの問題が発生した場合は、アプリケーションを停止するなど何らかの処置を取る必要がある可能性があります。オーバーフローまたはアンダーフロー状態が発生している場合に、ORとして構成された「複合演算」関数を使用して、オーバーフローまたはアンダーフロー状態の発生時にFPGA VIとホストVIの両方の実行を停止することができます。
以下の方法を使用して、バッファのアンダーフローを回避してください。
- FIFO.読み取りメソッドのタイムアウトを増やす
- ホストがデータを読み取る速度を下げる
- 「FIFO.読み取り」関数に配線する要素数制御器の値を減らすことで、バッファからVIが読み取る要素数を減らす
古いデータがバッファに蓄積することを回避する
FPGAターゲットでVIを実行してそのVIを停止して再起動する場合バッファはリセットしないため、次にFPGA VIを実行する際にバッファにデータが残ったままになります。
以下の方法を使用して、バッファをクリアしてください。
- FPGA VIをリセット
- FIFOの残りの要素を読み取るようバッファを排出する