• 検索結果がありません。

ドライバモジュールの優先度設定 66

ドキュメント内 B5size manual.dot (ページ 68-72)

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を記述する順番を変更することで、優先番号の設定を行うことも可能です。

ドキュメント内 B5size manual.dot (ページ 68-72)