next up previous contents
Next: CAMACを使う Up: VMEバスやCAMACをアクセスする Previous: VMEのメモリへの割付

割り込みの使い方

VMEの割り込みはまず7つある割り込みレベルのどれが使われるか、それから 割り込み応答の時にバスに提供される割り込みベクトルが何かを知っておく必 要があります。いずれも割り込みを発生するVMEモジュールのジャンパーなど で設定されます。詳しいことは使用するモジュールのマニュアルを見てくださ い。

VMEからの割り込みは他の装置と同様、デバイスドライバーが処理します。 ただ、標準的な割り込みモジュールなどの概念はありませんので一般的には割 り込み処理を行うデバイスドライバーをユーザが準備しなければなりません。 ULTRIXの場合割り込み処理用のioct lを持ったデバイスドライバーがKEKオン ライングループ安さんたちによって用意されています。この場合いくつかある VMEデバイスファイルのうち割り込み処理を受け持つのは最も狭いアドレス空 間を持つA16D16モードに割り当てられたデバイスです。FORCE社のCPU-3CE、 CPU-5CEについては京都大学理学部の的野君がKEKオンライングループの指導の もとに汎用の割り込み専用デバイスドライバーを開発しています。ここでは ULTRIXを例に説明します。まずデバイスを開く必要があります。

        int     fd;



        fd = open( "/dev/vmea0", O_RDWR );

割り込み処理はこのファイル記述子に対するIOCTLとして実装されます。まず 割り込みベクトルを与えて割り込みのための段取りをします。

        #define INTR_VECTOR     0x200

        int     intrno;



        intrno = ioctl( fd, VMEIOC_OPEN,  INTR_VECTOR );

以後intrnoを使って割り込みの制御がされます。まだこの段階では割り込みは 許可されていません。許可をしましょう。

        ioctl( fd, VMEIOC_ENABLE, intrno );

禁止をする場合は

        ioctl( fd, VMEIOC_DISABLE, intrno );

割り込みを待つ場合コマンドと引数を与える構造体を使います。

        struct vmecmt   cmd;



        cmd.intrno = intrno;

        cmd.data = timeout;     /* 時間切れで戻ってくるまでの時間を秒数で */

        if( ioctl( fd, VMEIOC_WAIT, &cmd ) == -1 ) { /* 失敗*/ }

        intcount = cmd.reply;   /* 実際に発生した割り込みの回数 */

VMEIOC_WAITの替わりにVMEIOC_NOWAITを使うと、割り込みの発生を待たず現在 ペンディングになっている割り込みがあるかどうかを調べて帰ってきます。

先程と同じようにこのように直にシステムコールを呼び出すより、インター フェース関数を通したほうが好ましいわけですから、ここでもそれを使いましょ う。ULTRIXとFORCEで少し違いがありますので例によって#IFDEFで書いてあり ます。

        #ifdef  ultrix

        #define INTVEC  0x200

        #else

        #define INTVEC  0xf0

        #endif

割り込みベクトルはCPUアーキテクチャに依存するのでこのようにシステムに よって使えるベクトルが違うかも知れません。

                st = vme_intopen( INTVEC, & intrno );

                if( st )        { /* 割り込みデバイスのオープン失敗 */ }

                st = vme_intenable( intrno );

                while( TRUE )

                {

                        vme_intwait( intrno, & intrcnt, 10 );

                        ...

                }

                vme_intdisable( intrno );

                vme_intclose( intrno );

実際にやっていることはすでに解説しましたからおよそ想像がつくと思いま す。次のような関数が用意されています。

        vme_intopen( vector, & intrno ) 割り込みデバイス開設

        vme_intclose( intrno )          割り込みデバイス閉鎖

        vme_intenable( intrno )         割り込み許可

        vme_intdisable( intrno )                割り込み禁止

        vme_intwait( intrno, & intrcnt, timeout )       割り込み待ち(タイムアウトまで)

        vme_intnowait( intrno, & intrcnt )      割り込み待ち(待たないけど)

        vme_intclear( intrno )          割り込みレジスタクリア

        vme_intcheck( intrno, & intrcnt )       割り込みチェック

戻り値は0で正常他はerrno。intrcntにはそれまでにドライバーが受け付けた 数が戻ります。基本的にこれらの汎用割り込みドライバーは割り込みルーチン の中では単に割り込まれた数を数えているだけですからユーザがvme_intwait を発行せずにのろのろしているあいだに複数の割り込みが発生してもわからな いと困ることから、こういうスキームがとられています。

現在市販されているUNIXから利用できるVMEバスインターフェースやUNIXの 搭載されたV MEマスターにはいくつかあります。それらについて全く同じスキー ムで割り込みが扱えるようKEKオンライングループでは準備をしてくださって います。自分が使おうとしているカードがサポートされているか問い合わせて みてください。



next up previous contents
Next: CAMACを使う Up: VMEバスやCAMACをアクセスする Previous: VMEのメモリへの割付



Kinya Hibino
Sun Jan 14 21:36:40 JST 1996