酔漢電子工作手帳

2007-03-29

1秒休止

| 23:54 | 1秒休止 - 酔漢電子工作手帳 を含むブックマーク はてなブックマーク - 1秒休止 - 酔漢電子工作手帳

昨日のプログラムは、1行印字して終了するだけでした。次に連続して何行も印字させるプログラムを作って見ましょう。

今回紹介するのは、終わりなく延々と印字するプログラムです。そのため、syslog()関数はwhile(1)ループの中にいれます。

syslog()関数では、現在何回目のループであるかも印字させることにします。C言語の標準ライブラリを使っている場合には、このような印字はprintf()で行います。TOPPERS/JSPsyslog()関数はprintf()関数と同じように使うこともできます。今回の例ではフォーマット文字列"%d"を使って10進数の印字を行います。

   syslog( "answer= %d", ans );

printfと異なるのは、勝手に改行される点です。したがって、一行にまとめたい出力は、syslog()関数一回で出力する様にしてください。

一行印字を連続して行うと、あっという間にものすごい数の行が出力されてしまいます。そこで、今回は出力後に1000mS休止させることにします。

    tslp_tsk( 1000 );

tslp_tsk()関数はuITRON4のAPIです。この関数関数を呼び出したタスクを休止状態にいれます。休止状態に入ったあと、引数で指定したミリ秒経過すると、タスクを実行可能状態に戻します。

これらを使って1秒ごとにメッセージを出力するプログラムにまとめたのが以下のコードです。ファイル名はsample1.c。

#include <t_services.h>
#include "kernel_id.h"
#include "sample1.h"

void main_task(VP_INT exinf)
{
    int i;
	
    i = 0;
    while(1){
        syslog(LOG_NOTICE, "Hello, ADuC7026! %d", i );
        i++;
        tslp_tsk( 1000 );
    }
}

sample1.hとsample1.cfgは昨日のものを使いまわします。

このタスクが印字する周期はおよそ1秒であることに気をつけてください。tslp_tsk()は引数で指示した時間休止することを保証しますが、それよりわずかに長くなるのが普通です。これは、TOPPERS/JSPの内部時間がティック・タイマーと言われるタイマーを元に計測されるためです。ティックタイマーの生成する割り込み(ティック)が時間計測の分解能になり、その分解能より高い精度は望めません。

また、仮に正確に1000mS休止して復帰しても、syslog()などの実行時間が余計にかかるため、やはり全体の周期はやや長くなります。

トラックバック - http://ecrafts.g.hatena.ne.jp/suikan/20070329