Optimizing LabVIEW Embedded Applications

概要

組込アプリケーションを開発する際、メモリの制約やタイムクリティカルなコード条件など、システム上の問題点がプログラミングにおいて重要な意味を持つことがあります。問題を抱えたままのソフトウェアを実装するわけにはいきません。このドキュメントでは、LabVIEW Embedded Edition を使用した組込アプリケーションの最適化に役立つプログラミング方法について概要を説明します。ここで紹介するテクニックは、全ての組込ターゲットに適用できます。

内容

メモリ割り当て

ダイナミックメモリ割り当ては行わないでください。タイムクリティカルなコードでは、ダイナミックメモリ割り当ては大きな負荷がかかります。LabVIEW Embedded の場合、「配列連結追加(Build Array)」関数と「文字列連結(Concatenate Strings)」関数を使用する際にダイナミックメモリ割り当てが実行されます。あるいは、「配列連結追加」関数を「部分配列置換(Replace Array Subset)」関数に置き換えて、割り当て済みの配列の要素を入れ替えることもできます。割り当て済みの配列は、配列定数または「配列初期化(Initialize Array)」関数を使用してループ外で作成する必要があります。異なる実装の LabVIEW コードを以下に示します。

 

データ配置

大きな定数をループ内に配置しないでください。大きな定数がループ内に配置されると、ループの各反復の開始時に、メモリの割り当てと配列の初期化が行われます。これは、タイムクリティカルなコードでは負荷のかかる処理となります。データへのアクセスをしやすくするには、配列をループの外側に配置し、ループトンネルを通って配線するか、あるいはグローバル変数を使用します。推奨される2通りの例を以下に示します。



                                        

ローカル変数ではなくグローバル変数を使用してください。ローカル変数にアクセスすると、そのたびにフロントパネルと同期するため余分なコードが実行されます。ローカル変数の代わりにグローバル変数を使用することで、多くの場合コード性能を向上させることができます。グローバル変数の場合余分なフロントパネル同期コードがないため、ローカル変数よりわずかに速く実行できます。



大きな配列ではループトンネルの代わりにシフトレジスタを使用してください。大きな配列をループトンネル経由で渡すと、元の値が各反復の開始時に配列位置にコピーされますので、負荷が大きくなる可能性があります。シフトレジスタはこのコピー操作を行いませんが、データ値が変わらないようにしたい場合は、左のシフトレジスタから右のシフトレジスタに配線するようにしてください。


数値変換

浮動小数点操作ではなく整数操作を行ってください。プロセッサに浮動小数点単位がない場合、浮動小数点に変換して処理を行い、再度整数データタイプに戻す操作は、大きな負荷となる可能性があります。下記の例では、「商&余り(Quotient & Remainder)」関数は通常の「商(Divide)」関数より速く実行し、「ビットシフト(Logical Shift)」関数は「2の累乗でスケール(Scale By Power Of 2)」 関数より速く実行します。



自動数値変換は行わないでください。コード性能を高めるもう1つの方法として、指定なしタイプ変換(強制ドット)を全て削除する方法があります。変換関数を使用して、データタイプを明示的に変換します。こうすれば、コピー操作もデータタイプの確定も行われません。

 

使用すべない関数データタイプ

簡単な状況判断にケースストラクチャは使用しないでください。LabVIEW で簡単な状況判断を行う際は、ケースストラクチャでなく「選択(Select)」関数を使用した方が時間がかかりません。ケースストラクチャの各ケースにはそれぞれ独自のブロックダイアグラムが含まれているため、「選択」関数と比較してオーバーヘッドがはるかに多くなります。ただし、1つのケースが大きなコードを実行してもう1つのケースはわずかなコードしか実行しない場合は、ケースストラクチャを使用した方がよいこともあります。「選択」関数を使うかケースストラクチャを使うかは、個別に判断する必要があります。

タイムクリティカルなコードでは「範囲内と強制(In Range and Coerce)」を使用しないでください。「範囲内と強制」関数は、ユーザ構成可能な特殊機能や余分なデータタイプ確定機能のために、かなりのオーバーヘッドが関連付けられています。この関数は、タイムクリティカルなコードで使用する場合は、比較関数と「選択」関数を使って再実装する必要があります。

タイムクリティカルなコードでは、クラスタを使用しないでください。クラスタがサブ VI に渡される際、不要なデータタイプ情報まで同時に渡されます。コードの実行速度を高めるには、ブロックダイアグラムのタイムクリティカルな部分ではクラスタを使用しないようにしてください。

インライン C ノード使用方法

LabVIEW と C のハイブリッドコードを使用することで、最もよい結果が得られる可能性があります。インライン C ノードとライブラリ呼び出しノードを使用すると、C コードを LabVIEW ブロックダイアグラム内で直接使用できるようになります。インライン C ノードとライブラリ呼び出しノードの使用方法の詳細については、下記リンク先にある組込開発モジュールのドキュメントをご覧ください。

LabVIEW コード内で C ベースのアルゴリズムを使用するのに最も適しているのは、以下のような場合です。
1) C アルゴリズムがすでにあり、それを再利用したい。
2) C コードに適した小さな数値/配列アルゴリズムがある。

最適ビル設定

以下のビルド設定を行うと、コードの実行が最速になります。

まとめ

優れた組込プログラミング方法を実践すると、組込アプリケーションの制約に対応した最適なコードを作成することができます。これらのテクニックのいずれかを実行するだけでもアプリケーションの性能は著しく向上するかもしれません。ただし、上記の全てのテクニックを組み合わせて使用すれば、さらに良い結果を得ることができます。

LabVIEW Embedded Edition と LabVIEW 組込開発モジュールの詳細については、下記のリンクをクリックしてください。

関連リンク

Was this information helpful?

Yes

No