5.1 割り込みハンドラの優先度設定 (DPG-0102)
通常、RTLinuxのリアルタイムカーネルで割り込みを使用する場合には、rtl_request_irq関数を使用
して、割り込みハンドラを登録します。
rtl_request_irq」による割り込み登録 1
2 3 4 5 6 7 8
#include <rtl_core.h>
unsigned int nIRQ = 9; //使用するIRQを9に設定
int rtl_request_irq(nIRG, my_handler ); //割り込みハンドラの登録 ・
・ ・
int rtl_free_irq(nTRQ); //割り込みハンドラの解除 1
2 3 4 5 6
unsigned int my_handler(unsigned int irq, struct pt_regs *regs) {
・ ・ ・ }
上記のように、割り込み(IRQ)番号と割り込み発生時に実行したい関数(my_handler)を、
rtl_request_irqの引数に指定することでハンドラとして登録します。
割り込みハンドラを解放したい場合には、rtl_free_irq関数にIRQ番号を指定します。
ただし、現時点のRTLinuxの仕様では、IRQ番号に対してハンドラの割り当てを行うと、別のハン ドラを登録できません。(登録しようとしてもエラーを返します。)
一般的なコンピュータを使用している場合、PCI/CompactPCIのバススロットは、複数のスロット でIRQを共有する仕様になっている場合がほとんどですが、RTLinuxでは通常のままだと割り込み を共有できません。
そこで、弊社のRTLinux対応ドライバソフトウェアでは、独自に割り込みの共有, 優先度切り替え を行うモジュール(dpg0102.o)を用意しており、弊社PCI/CompactPCI I/Oモジュール間の割り込みの 共有をサポートしています。
GPG-2000の割り込みの設定は、下図の様な流れで行います。
ドライバモジュール rcp2000.o dpg0102
dpg0102.o
RT-FIFO
ハンドラのCall
ハンドラの登録 ハードウェア割り込み 割り込み優先度設定
ユーザモジュール
API関数のCall dpg0102p.o
RTLinuxに対応したドライバモジュール本体は「rcp2000.o」と言う名称のモジュールになります。
API関数をRTLinuxモジュールからコールした場合は、このドライバモジュールを通してデバイス の制御が行われます。
「dpg0102.o」は弊社RTLinux用デバイスドライバで共通の割り込みモジュールとして使用します。
各I/Oモジュールごとの割り込みの優先順位を確認、もしくは変更したい場合には、「dpg0102p.o」
が必要となります。このモジュールを組み込んでから、「dpg0102」を実行することで、割り込み の優先順位を設定することが可能です。
# insmod dpg0102p.o # /usr/bin/dpg0102
IRQ DEV No. Pri 07 4115 2 1 07 2760 2 2 10 4115 3 0 10 2727 1 1 11 4115 1 1
Do you want to change the priority ?[y/n]
「dpg0102」を実行すると上記のような画面になり、現在使用中の弊社PCI/CompactPCI I/Oモジュールの一覧が表示されます。表示されるデータの意味は、次のようになります。
項 目 内 容
IRQ I/Oモジュールが使用する割り込みの番号を示します。
上記の例では、IRQ7とIRQ10がそれぞれ2枚のI/Oモジュールから共有されているこ とがわかります。
DEV I/OモジュールのDeviceIDを示します。
弊社PCI/CompactPCI I/Oモジュールでは、型式からアルファベットをのぞいた数字4 桁が、DeviceIDとなります。
例)CTP-4115 → DEV = 4115 PCI-2726C → DEV = 2726
No. I/Oモジュールのデバイス番号を示します。
『65ページ 4.4 RTLinux対応ソフトウェアのアンインストール』で設定した、
各I/Oモジュールのデバイス番号が表示されています。上記の例では、4115が3枚使 用されていますが、それぞれ異なるデバイス番号が割り振られていることがわかり ます。
Pri. 割り込みのPriority(優先番号)が0〜15の数値で設定されています。
0が最も優先度が高く、15が最も低い値となります。(ここで設定した優先番号は RTLinuxスレッドの優先度とは関係ありません。IRQが競合している各I/Oモジュー ルの割り込み処理間での相対的な優先度を示しています。)
以上が、割り込み優先番号情報の見方になります。
優先度の設定を変更したい場合には、上記の表が表示されたあと「y」を入力します。
Do you want to change the priority ?[y/n]y
次に、設定を変更するI/OモジュールのDeviceID(DEV)を入力します。
Enter the device id : 4115
続けて、デバイス番号(No.)を入力します。
Enter the device number : 2
最後に優先番号(Pri)を0〜15の数値から入力します。
Enter the priority : 3
設定が完了すると、また最初の画面が表示されます。
IRQ DEV No. Pri 07 2760 2 2 07 4115 2 3 10 4115 3 0 10 2727 1 1 11 4115 1 1
Do you want to change the priority ?[y/n]
4115(No.2)の優先番号を、1から3に変更したため、表の順番が2760(No.2)と入れ変わっているのが 分かります。
ここで、設定を終了する場合には、「n」を入力してください。再び設定を変更する場合には「y」
を入力して、先ほどの手順で設定を繰り返します。
この優先番号は「dpg0102.o」を取り外すとクリアされます。再起動時には再び優先番号の設定を 行うようにしてください。
(デバイスドライバの自動組み込みを設定している場合でも、優先番号の設定値は初期化されま す。)
また、「dpg0102」を使用しなかった場合には、デフォルト値としてドライバモジュールの組み込 まれた順番に0から優先番号が割り振られます。
/etc/rc.d/rc.localにドライバの自動組み込みを記述している場合には、各I/Oモジュール用モジュー ルのinsmodを記述する順番を変更することで、優先番号の設定を行うことも可能です。