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つのモードがあります。
このモードは、Simulinkで割り込み信号の影響をシミュレーション中に選択します。モデル内には、1つのVxWorks Asynchronous Interruptブロック しかなく、すべての希望する割り込みはそれにより設定されます。
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ブロックに関連するパラメータは、以下の通りです。
RTWモードでは、Real-Time Workshopは、vxinterrupt.tlc
を使って生成コード内での非同期割り込みを実現します。ISRは、1つの引数、ルートのSimStruct
を渡され、ファンクションコールサブシステムのSimulinkの定義は、SimStruct
内の情報と一致させるために、再割り当てされます。
[4 2 5]
). intConnect(INUM_TO_IVEC(#),...)
.の呼び出し内でこの番号を使います。各割り込み番号に対してユニークなベクトルオフセット番号を指定します。 intLock()
およびintUnlock()
の呼び出しは、それぞれISRの先頭および末尾に挿入されます。これは、intLockLevelSet()
レベル以下のすべての割り込みに対するシステムの割り込み応答時間を増加させるので、注意して使う必要があります。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_connect
とint_enable
が必要です。たとえば、Functionブロックの関数f(u)
は、下記のようにAsynchronous Interruptブロックがint_connect
とsysIntEnable
を関数mdlStart
に挿入する必要があります。
/* model start function */ MdlStart() { . . . int_connect(f,192,1); . . . sysIntEnable(1); . . . }
Locking and Unlocking ISRs. 優先度が高い割り込みにより先に実行されないようにISRをロックすることが可能です。割り込みを非プリエンプティブとして設定すると、この効果が得られます。つぎのコードは、割り込みを非プリエンプティブと設定するために、Real-Time Workshopがint_lock
およびint_unlock
関数をどこに置くかを示します。
/* model terminate function */ MdlTerminate() { ... int_disable(1); ... }
![]() | 割り込みのハンドリング | Task Synchronizationブロック | ![]() |