LabVIEWの特徴について3(イベント処理)

LabVIWEの特徴については前回までで記載させて頂きました。

今回は多くの処理系で実装されている「イベント処理」について概要を記させて頂きます。あくまでも個人での理解の範疇であること御理解ください。

【イベント処理】

マイコン、CPUは同時に処理できるのは1コアにつき1つのみという制限があります。そのためあるデバイスに処理を行った後に応答を待つ場合、単純に実装する場合は常に処理完了したかを繰り返し問い合わせる(ポーリング)ことが考えられます。ただこの実装で応答を受けた後に即次の処理を実行したい場合には、早いループでデバイスに対してポーリング処理を繰り返すことになります。これを行った場合、高速応答を求めるほど早いレートでポーリングすることとなり、CPU負荷の増大に繋がります。このため、ある状態(イベント)が発生した段階で動作を開始するプログラムを「イベントドリブン」なプログラムと呼んだりします。

イベントドリブンなアプリでイベントが割り込み要因として処理実装されている場合、CPU負荷を発生することなく高速にイベントを待つことが可能です。

逆にポーリング処理では常に問い合わせを能動的に行うためCPU負荷の増加は避けられません。悪い使い方の代表的なものとして、 cRIOなどでDMAの読み込み待ちを行うと全力でpolingでするために1コアのCPUが100%になりますので注意が必要です。この場合、100msのタイムアウトが設定されていれば理想的には100msは負荷なしでwait、100ms経過で抜けることが期待されますが、この場合100ms全力でpolingするようになっているようです(コントローラの実装によりblockingなのかinteruputなのかで異なりますので注意が必要です)。timingでも同じようなことがありうるのですが、実行している処理がblockingしていないか?は常に注意してプログラムを作る必要があると思います。

参考リンク:ターゲットからホストへのDMA FIFOからデータを読み取るときのCPU負荷が高い