LabVIEWでは、複数のVIでリソースを共有する場合があります。リソースを共有すると、ジッタが発生してアプリケーションでマルチCPUの利点を活用できない場合があります。共有リソースの例には以下が挙げられます。

  • グローバル変数
  • 再入可能ではないサブVI
  • LabVIEWメモリマネージャ
  • キュー操作関数
  • セマフォVI
  • シングルスレッドDLL

共有リソースを使用するVIは、他のVIがリソースにアクセスできないようにオペレーティングシステムの「ミューテックス」を取得します。ミューテックスによってそのリソースは他のVIからアクセスされないようロックされます。タイムクリティカルVIが優先度の低いVIに先行してロック済みリソースの使用を試みても、共有リソースが使用できないため待機状態となります。この場合、確定的VIは優先度の低いVIの実行が完了して共有リソースを解放するまで実行できないため、優先度の低いVIの実行がより重要になります。このような状況は「優先順位の逆転」と呼ばれ、確定的VIの確定性を損なう原因となります。

メモリ割り当てと配列の事前割り当て

VIは、メモリの割り当て時にLabVIEWメモリマネージャを使用します。LabVIEWメモリマネージャはデータストレージ用にメモリを割り当てます。LabVIEWメモリマネージャは共有リソースであるため、ミューテックスによって数ミリ秒間ロックされる場合があります。したがって、確定的VIでメモリの割り当てを実行すると確定性が損なわれる可能性があります。

確定的VIの制御ループ内で配列を使用する場合は、ループに入る前に配列にメモリを割り当てることでジッタを減らすことができます。

以下のブロックダイアグラムでは、配列が制御ループ内で作成されます。ループ内に配置されている「配列連結追加」関数は、反復のたびにLabVIEWメモリマネージャを使用して配列にメモリを割り当てるため、ループの確定性に影響を与える可能性があります。

以下のブロックダイアグラムでは、ループの外にある「配列初期化」関数、ループの中にある「部分配列置換」関数で配列が作成されます。配列は制御ループの外で事前割り当てされるため、ループの各反復でLabVIEWメモリマネージャにアクセスする必要がありません。

データを適切なデータタイプに型変換する

RTターゲットで実行するVIでは、データを適切なデータタイプに型変換する必要があります。LabVIEWは型変換を実行するたびに、変換後の新しいデータタイプ用にメモリにデータバッファのコピーを作成します。LabVIEWメモリマネージャはこのコピーにメモリを割り当てるため、確定的VIの確定性が損なわれることがあります。また、データバッファのコピー作成によってRTターゲットのメモリリソースが占有される可能性もあります。

データを型変換する時は、サイズが可能な限り小さいタイプに変換してください。配列のデータタイプを変換する場合は、配列を作成する前に変換を行ってください。また、関数の入力と出力が同じデータタイプである場合に限り、関数の出力は入力バッファを再利用することを念頭に置いてください。配列タイプの関数の出力で入力バッファを再利用するには、配列の構造と要素数が同じでなければなりません。

グローバル変数の使用頻度を減らす

VI内でグローバル変数を使用すると、各グローバル変数のコピーが自動的にメモリ内に作成されます。グローバル変数の数を減らして、VIの効率とパフォーマンスを向上させます。グローバル変数のコピーを作成すると、RTターゲットのメモリリソースが占有されます。