Real-Time Workshop User's Guide    

Asynchronous Interruptブロック

割り込みサービスルーチン(ISR)は、VxWorksのAsynchronous Interruptブロックの出力をファンクションコールサブシステムの制御入力を、VxWorksのTask Synchronizationブロックの入力、またはファンクションコール入力イベント用に設定されたStateflowチャートの入力に接続することによって実現されます。

Asynchronous Interruptブロックは、下流の(destination)ファンクションコールサブシステムをISRとしてインストールし、指定した割り込みレベルを利用可能にします。VxWorksのAsynchronous Interruptブロックの現在実現されているものは、VME割り込み1-7をサポートし、VxWorksのシステムコールsysIntEnable, sysIntDisable, intConnect, intLockおよびintUnlockを利用します。VxWorksに対するターゲットアーキテクチャ(BSP)がこれらの関数をサポートしていることを確認してください。

ファンクションコールサブシステムがAsynchronous Interruptブロックの出力に接続されているとき、そのサブシステムに対して生成されたコードは、ISRになります。大規模のサブシステムに対して、これは、システム内て等しい優先度または低い優先度の割り込みに対する割り込み応答時間に対して大きなインパクトをもちます。一般的な規則として、ISRを可能な限り短くすることが最適です。そのためには、少ないブロックをもつファンクションコールサブシステムのみを接続します。

大規模システムに対するより良いソリューションは、Task Synchronizationブロックを使ってイベントに対するファンクションコールサブシステムの実行の同期をとることです。Task Synchronizationブロックは、Asynchronous Interruptブロックとファンクションコールサブシステム(またはStateflow チャート)の間に置かれます。Asynchronous Interruptブロックは、その後Task SynchronizationブロックをISRとしてインストールし、これは、ファンクションコールサブシステムの同期セマフォ(semGiveを実行)を解放してから戻ります。詳細は、VxWorks Task Synchronizationブロックを参照してください。

Asynchronous Interruptブロックの使用法

Asynchronous Interruptブロックは、ラピッドプロトタイピングのサポートに役立つ2つのモードがあります。

RTWモードとSimulationモードの両方で、2つのIRQ信号が同時に発生するとき、Asynchronous Interruptブロックはそれらの優先度の割り込みレベルに従って下流のシステムを実行します。

Asynchronous Interruptブロックは、これらの2つのモードによって、ISRを含むリアルタイムシステムの開発および実現を容易にかつ迅速に行います。1つはシミュレーション用にプラントとコントローラを含み、もう1つはコード生成用にコントローラのみを含む2つのモデルを開発することができます。

SimulinkのLibrary機能を使って、両方のシステムへ変更を同時に実現することができます。図 15-1は、それぞれライブラリ内にあるプラントまたはコントローラに対する変更が、モデルにどのように伝播されたかを示しています。

図 15-1: ラピッドプロトタイピングプロセスにおいてSimulinkのLibrary機能を使ったAsynchronous Interruptブロックの使用法

Real-Time Workshopモデルは、周期的な割り込みから通常実行します。モデル内のすべてのブロックは、タイマの割り込みレートの倍数においてそれらを実行することにより、希望するレートで実行されます。いっぽう、Asynchronousブロックは、周期的あるいは周期的でない他の割り込みに基づき実行します。

割り込みを発生させるハードウェアは、Asynchronous Interruptブロックによって設定されません。一般的に、割り込みのソースはVME I/Oボードで、これは特定のイベント(例., A/D変換の終了)に対して割り込みを発生させます。VME割り込みレベルおよびベクトルは、レジスタに設定されるか、あるいは、ボード上のジャンパによって設定されます。ユーザ作成のデバイスドライバ(S-ファンクション)のmdlStartルーチンを使って、レジスタを設定し、ボード上での割り込みの発生を可能にすることができます。Asynchronous Interruptブロックのダイアログで指定された割り込みレベルとベクトルを、I/Oボードのレベルおよびベクトルの設定と一致させなければなりません。

Asynchronous Interruptブロックパラメータ

下図は、VxWorks Asynchronous Interruptブロックのダイアログボックスを示します。

Asynchronous Interruptブロックに関連するパラメータは、以下の通りです。

Asynchronous Interruptブロックの例- シミュレーションモード

下図は、シミュレーションモードでのAsynchronous Interruptブロックの動作を示します。

Asynchronous Interruptブロックは、信号をルーティングし、優先度を設定する"ハンドラ"として機能します。2つの割り込みが同時に発生する場合、どの信号がどのポートに送信されるかをハンドリングする規則は、左から右、上から下です。これは、IRQ2はPlant 1から信号を受信し、IRQ1は同時にPlant 2から信号を受信することを意味します。IRQ1は、この状況でも、IRQ2よりも高い優先度をもちます。

Asynchronous Interruptブロックは、入力信号を処理し、下流の関数を実行することにより、シミュレーション中に実行されます。また、割り込みのプリエンプションは、シミュレートできません。

Asynchronous Interruptブロックの例- RTWモード

この例題は、RTWモードでのAsynchronous Interruptブロックを示します。

この例題では、前の例題のシミュレートされたプラント信号は、削除されています。RTWモードでは、Asynchronous Interruptブロックはハードウェアから直接割り込みを受信します。

コード生成のTarget Language Compilerフェーズ中に、Asynchronous Interruptブロックは、コードを割り込みサービスルーチンとしてStateflow チャートおよびSubsystemブロックにインストールします。ファンクションコールサブシステムをISRとして設定するには、2つのファンクションコールint_connectint_enableが必要です。たとえば、Functionブロックの関数f(u)は、下記のようにAsynchronous Interruptブロックがint_connectsysIntEnableを関数mdlStartに挿入する必要があります。

Locking and Unlocking ISRs.   優先度が高い割り込みにより先に実行されないようにISRをロックすることが可能です。割り込みを非プリエンプティブとして設定すると、この効果が得られます。つぎのコードは、割り込みを非プリエンプティブと設定するために、Real-Time Workshopがint_lockおよびint_unlock関数をどこに置くかを示します。

最後に、モデルの終了関数が割り込みを不可能にします。


 割り込みのハンドリング Task Synchronizationブロック