ここで報告するRT-Linuxのバージョンは1.1(Linux 2.0.36ベース)です。
この調査で使用したパソコンはGateway社Solo9100。ノートブックタイプのIBM PC/AT クローンです。
構成部品 | スペック |
---|---|
MPU | Intel Pentium II 266MHz |
主記憶 | 128Mbyte |
グラフィックチップ | Trident Cyber 9397 PCI |
ネットワーク | 3COM Fast EtherLink XL PC Card (3C575-TX) |
固定ディスク(E-IDE) | 1台 約6Gbyte(このうちRT-Linuxには約2Gbyteを使用) |
CD-ROM(E-IDE) | 1台 |
マウス | PS/2 |
キーボード | 日本語106 |
/procは次のとおりです。
割り込み(IRQ)
0: 15780 timer
1: 297 keyboard
2: 0 cascade
3: 0 3c575
8: 1 + rtc
12: 3118 PS/2 Mouse
13: 1 math error
14: 3632 + ide0
15: 29 + ide1
I/Oポート
0000-001f : dma1
0020-003f : pic1
0040-005f : timer
0060-006f : keyboard
0070-007f : rtc
0080-009f : dma page reg
00a0-00bf : pic2
00c0-00df : dma2
00f0-00ff : npu
0100-013f : cb_enabler
0170-0177 : ide1
01f0-01f7 : ide0
02f8-02ff : serial(auto)
0376-0376 : ide1
03c0-03df : vga+
03f0-03f5 : floppy
03f6-03f6 : ide0
03f7-03f7 : floppy DIR
03f8-03ff : serial(auto)
fc90-fc97 : IDE DMA
fc98-fc9f : IDE DMA
DMA
4: cascade
調査のために作成したテストプログラムはプリンターポートから入力される割り込み信号に対する応答としてパルス信号をプリンターポートへ出力するというものです。このプログラムは種種のパラメータをWWWブラウザーのUIから設定できるようにしてあります。
注意:この画面でパラメータを設定しても今お使いのコンピュータには何も影響は与えません。
シグナルジェネレータを使って矩形波を生成しこれを割り込み信号としプリンターポートに入力しました。プリンターポートに入力した割り込み信号と出力される応答パルス波をオシロスコープで測定することによって結果を得ました。
応答パルス幅: | 4.52μs |
割り込みマスク: | なし |
割り込み要求(IRQ): | 7 |
出力ポート: | LPT1(0x378) |
<最速値>
<1024回測定>
測定の結果割り込み応答時間は約5μ秒~約9μ秒であることが判りました。ただし、9μ秒はあくまでも1024回測定の範囲内でのワーストケースであり、真のワーストケースは分りません。原因は2つ考えられます。
RT-Linuxの場合、カーネルに割り込みハンドラを要求するとカーネルはその関数のアドレスを
void (*RTaction[16])(void);
という配列のIRQの番号に相当する場所に格納します。プリンタ割り込み信号(IRQ7)が発生した場合、割り込みベクターから最初にカーネル内の次の場所(割り込みゲート)に制御が渡されます。この処理の中で更にRTaction[7]、つまりあらかじめ登録しておいた割り込みハンドラをコールします。ここまでの時間が最速でも5μ秒かかるということです。
rt_IRQ7_interrupt:
push %ds
push %es
pushl %eax
pushl %edx
pushl %ecx
movl $0x18,%edx
mov %dx,%es
mov %dx,%ds
movb $0x20,%al
outb %al,$0x20
call *(RTaction + 7 * 4)
popl %ecx
popl %edx
popl %eax
pop %es
pop %ds
iret
一方、タイマー割り込みは優先度が高いため、他の割り込み処理を遅らせる効果があります。タイマー割り込みの処理の流れは下のようになっています。この間に他の優先度の低い割り込み処理は待たせられる、つまりこれが9μ秒の原因ではないかと考えられます。更に、もっと悪いことには、通常のLinuxにスケジューリングされた場合そのデバイスドライバが不用意に発する割り込みマスクのためこの割り込み遅延はもっと大きく不確定になる事が予測できます。
タイマー割り込み
IRQ0
割り込みゲート
rt_IRQ0_interrupt
割り込みハンドラ
rt_periodic_timer_irq
リアルタイム・スケジューラ
rtl_schedule
リアルタイムOSとしてみた場合は割り込み遅延のワーストケースが予測できないことは問題です。従って、RT-Linuxをリアルタイム処理へ応用する場合は事前にこの遅延が許容できるかどうかを判断すべきです。