第 6 章 RTLinux でのソフトウェア開発 70
6.2 リアルタイム性の評価
※1
RTLinuxモジュールの実行をrunコマンドで行った場合、モジュールの実行がgdbの制御下から はずれてしまい、breakpoint等が使用できなくなります。
※2
RTLinux用にソース中に埋め込んだbreakpoint( )は解除されません。
※3
RTLinuxのデバッグ中にこのコマンドを実行すると、モジュールがgdbの制御下からはずれてし まいます。
★デバッグ使用時の機能
(gdb)の端末下でコマンド入力を行う際に、以下のような機能を使用できます。
・ コマンドを省略して実行可能。
コマンドが特定可能な字数に達していれば、2, 3文字だけ入力して残りの文字を省略して実行できま す。また、使用頻度の高いコマンド(step, breakpoint 等)に関しては、「s」や「b」のように一文字で使 用することも可能です。
・ TABキーの使用
通常のコンソール端末と同じ感覚で、TABキーを使用したコマンドの補完が可能です。
・ Enterキーの使用
Enterーキーのみを入力すると、前回実行したコマンドを続けて実行します。たとえばSTEP実行を行
う場合に、最初の1回のみ「step」(「s」)コマンドを実行すれば、後はEnterキーを入力するだけでス テップ実行を繰り返し行います。
RTLinuxスレッドの周期実行は、『72ページ 6.1.2 デバッガ(gdb + RTDebugger)を使用する方法』
で解説したサンプルプログラムのhelloを使用して確認します。
「hello.c」のソースコード修正 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
#include <rtl.h>
#include <time.h>
#include <pthread.h>
#include <rtl_time.h>
pthread_t thread;
hrtime_t tasktime[201];
void * start_routine(void *arg) {
int I;
struct sched_param p;
p . sched_priority = 1;
pthread_setschedparam (pthread_self(), SCHED_FIFO, &p);
pthread_make_periodic_np (pthread_self(), gethrtime(), 100000);
for(I = 0; I < 201; i++) { pthread_wait_np ();
tasktime = gethrtime(void);
}
for(I = 1; I < 201; i++) {
rtl_printf(“cycle time is : %ld¥n”, tasktime[i] – tasktime[i-1]);
} return 0;
}
int init_module(void) {
return pthread_create (&thread, NULL, start_routine, 0);
}
void cleanup_module(void) { pthread_delete_np (thread);
}
上記ソースコードの網掛けがしてある部分が、元のサンプルプログラム「hello.c」から修正を行った部 分です。
周期実行の間隔を100(μs)で実行するように、変更を行います。
元々、周期実行を行うRTLinuxスレッドの中で「I'm here; my arg is %x」と表示を行っていた部分では、
替わりにgethrtime( )関数を使用してCPUタイマのカウント値を取得します。
この関数では、起動時からの経過時間を(ns)単位で取得します。
201回ほど取得したあと、カウント値の差分を取り、rtl_printf( )で出力しています。
gethrtime関数を使用するためには、<rtl_time.h>をインクルードする必要があります。(4行目)
修正が完了したら、makeを行ってRTLinuxモジュールを組み込みます。
# cd /usr/src/rtlinux/rtlinux-3.1/examples/hello # make
・ ・ ・
# insmod hello.o
モジュールを組み込んで、しばらくしてからモジュールを取り外します。
(コンソール上で組み込みを行った場合には、画面上にrtl_printf( )の実行結果が表示されます。) # rmmod hello
システムのログに実行結果が残っていますので、表示します。
# tail –20 /var/log/messages
Feb 22 20:34:15 linux kernel: cycle time is : 99840(ns) Feb 22 20:34:15 linux kernel: cycle time is : 99296(ns) Feb 22 20:34:15 linux kernel: cycle time is : 99552(ns) Feb 22 20:34:15 linux kernel: cycle time is : 100864(ns) Feb 22 20:34:15 linux kernel: cycle time is : 103616(ns) Feb 22 20:34:15 linux kernel: cycle time is : 94752(ns) Feb 22 20:34:15 linux kernel: cycle time is : 101184(ns) Feb 22 20:34:15 linux kernel: cycle time is : 100512(ns) Feb 22 20:34:15 linux kernel: cycle time is : 100896(ns) Feb 22 20:34:15 linux kernel: cycle time is : 98464(ns) Feb 22 20:34:15 linux kernel: cycle time is : 100576(ns) Feb 22 20:34:15 linux kernel: cycle time is : 100256(ns) Feb 22 20:34:15 linux kernel: cycle time is : 99520(ns) Feb 22 20:34:15 linux kernel: cycle time is : 101248(ns) Feb 22 20:34:15 linux kernel: cycle time is : 99776(ns) Feb 22 20:34:15 linux kernel: cycle time is : 98176(ns) Feb 22 20:34:15 linux kernel: cycle time is : 102496(ns) Feb 22 20:34:15 linux kernel: cycle time is : 98272(ns) Feb 22 20:34:15 linux kernel: cycle time is : 101152(ns) Feb 22 20:34:15 linux kernel: cycle time is : 98336(ns)
上記の様な結果が表示されます。
今回試した環境では、200回の平均値で99964 (ns)、標準偏差値は719.5940577(ns)と言う結果となり ました。
この数値は、周期スレッド内での処理をほとんど行っていませんので、純粋にリアルタイムカー ネルの処理精度が現れているといえます。