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

リアルタイム性の評価

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

第 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)と言う結果となり ました。

この数値は、周期スレッド内での処理をほとんど行っていませんので、純粋にリアルタイムカー ネルの処理精度が現れているといえます。

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