ここで報告するRT-Linuxのバージョンは0.6(Linux 2.0.33ベース)ですが1999年5月現在では次のようになっています。
この調査で使用したパソコンは、現在では陳腐化した感のあるデスクトップタイプのIBM PC/AT クローンです。
構成部品 | スペック |
---|---|
MPU | AMD K6-2 300MHz |
マザーボード | Iwill |
主記憶 | 128Mbyte |
グラフィックボード | Matrox Millenium 4Mbyte |
ネットワークボード | 3COM 3C509 |
固定ディスク(E-IDE) | 3台 ※リアルタイムLinuxで使用したのはこのうち1台(約2Gbyte) |
CD-ROM(E-IDE) | 1台 |
マウス | PS/2 |
キーボード | 日本語106 |
/procは次のとおりです。
割り込み(IRQ)
0: 2025939 timer
1: 3072 keyboard
2: 0 cascade
6: 85 + floppy
8: 1 + rtc
10: 0 3c509
12: 338883 PS/2 Mouse
13: 1 math error
14: 657115 + ide0
15: 441 + 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
0170-0177 : ide1
01f0-01f7 : ide0
0210-021f : 3c509
02f8-02ff : serial(auto)
0376-0376 : ide1
0378-037f : lp
03c0-03df : vga+
03f0-03f5 : floppy
03f6-03f6 : ide0
03f7-03f7 : floppy DIR
03f8-03ff : serial(auto)
DMA
2: floppy
4: cascade
調査のために作成したテストプログラムはリアルタイム処理としてプリンターポートや、RS232Cポートからパルスを出力しそのパルス幅を制御しようというものです。このプログラムは種種のパラメータをWWWブラウザーのUIから設定できるようにしてあります。
注意:この画面でパラメータを設定しても今お使いのコンピュータには何も影響は与えません。
プリンターポートや、RS232Cポートから出力されるパルス波をオシロスコープで測定することによって結果を得ました。
パルス周期: | 100μs |
パルス幅: | 68μs |
タスク優先度: | 4 |
負荷の種類: | 整数の加算 |
繰り返し回数: | 5000回 |
出力ポート: | COM1 |
下のグラフで判るようにパルス周期や負荷の種類に関係なくパルス幅は繰り返し回数に対して直線的に変化します。
上のグラフの傾きを計算することによって1回当たりの処理時間を求めました。
負荷の種類 | 1回当たりの処理時間(ナノ秒) |
---|---|
アイドリング | 7.0 |
NOP命令 | 10.3 |
整数の加算 | 13.7 |
浮動少数の加算 | 47.2 |
浮動少数の積算 | 49.7 |
1μs遅延(I/Oポートアクセス) | 1712 |
繰り返し負荷を与えている部分のアセンブルリストは次のとおりです。
<アイドリング>
movl pk+12,%ebx
.L45:
movl %ebx,%eax
decl %ebx
testl %eax,%eax
jg .L47
jmp .L46
.align 16
.L47:
jmp .L45
.align 16
.L46:
<NOP命令>
movl pk+12,%ebx
.L56:
movl %ebx,%eax
decl %ebx
testl %eax,%eax
jg .L58
jmp .L57
.align 16
.L58:
NOP
jmp .L56
.align 16
.L57:
このリストから判るようにアイドリング処理時間は繰り返し回数カウンタの処理時間であります。一方、MPUのクロックサイクルは3.3ナノ秒で、NOP命令のクロックサイクルは1なので
NOP命令の処理時間 = アイドリング処理時間 + 3.3ナノ秒
になることが予測できます。また、先の測定結果もこれによく一致しています。従って、出力するパルス幅を制御することは可能であると言えます。
1μ秒の遅延はI/Oポート(0x80)への書き込みによって実現していますが何と700ナノ秒も余分に時間がかかっています。この原因は不明ですが、次の事が疑われます。
制御への応用を考えた場合、制御則演算のための浮動少数演算能力を把握しておく必要があります。今、通常のLinuxを動作させつつ1ミリ秒周期の制御をする事を想定すると、今回の環境では浮動少数積算が15000回程度実行できる事が判りました。この回数の処理するのに700μ秒であり30%の余裕を持っています。この余裕は次の理由によって必要です。
RT-Linuxはクロックを割り込み源としてユーザタスクをスケジュールします。通常のLinuxはユーザタスクといっしょに最も低い優先度でスケジューリングされますのであまりユーザタスクの負荷が重いと通常のLinuxがスケジューリングされず、ユーザータスクだけが実行されている状態になります。つまり、この状態では通常のLinuxそのものとそのアプリケーションプログラムは動作が停止してしまいます。これではLinuxは単なるローダーに過ぎずLinuxの長所を生かせないのでLinuxを使う意味が薄れてしまいます。
注意を要するのはLinuxの割り込みマスクによるリアルタイム処理が遅延される事です。パルス周期100μ秒でパルス幅を制御しようとした時、±10μ秒程度のスキューが観測されました。クロック割り込みは最も高い割り込み優先度を持つので割り込みマスクを掛けられること以外にリアルタイム処理のスケジューリング間隔が乱されることは考えられません。リアルタイム処理がない時間に通常のLinuxがスケジューリングされ、Linuxのカーネルもしくはドライバが動作するときに長い時間(今回の場合数10μ秒以上)割り込みマスクを掛けてしまう事が最も考えられる事です。実際に、fsckコマンドを発行して固定ディスクをアクセスしたり、マウスを移動させたときにこの現象が観測されました。従って、RT-Linuxをリアルタイム処理へ応用する場合は事前にこの遅延が許容できるかどうかを判断すべきです。