目次
前
次
時間待ち処理
USOは、システムコールwai_tskを利用し、タスクの
周期処理を実現できます。
USOのタスク処理では、無限ループは禁止です。
無限ループなしで、タスク処理を作成します。
時間待ち処理は、システムに任せると楽です。
周期処理のために、システムコールwai_tskを使いますが
次のようにすると、指定回数だけ周期処理して終了させる
ことができます。
void tskx_proc(void)
{
/*
?????
*/
/* counter decrement */
tcnt-- ;
if ( tcnt > 0 ) {
/* delay 1000 ms */
wai_tsk( 100 ) ;
} else {
slp_tsk() ;
}
}
内部処理
システムコールwai_tskでは、変数waitqとカウンタ値を設定します。
システムがタスクをWAITからREADYにするには
タイマー割込みを利用します。
USOの中で、唯一利用するマイクロプロセッサとクロック
周波数に依存します。
10msごとに、下記のコードを実行します。
tmp = waitq ;
for ( i = 0 ; i < TSK_ID_MAX ; i++ ) {
if ( tmp & 1 ) {
tcb[i].wcount-- ;
if ( tcb[i].wcount == 0 ) { rsm_tsk(i); }
}
tmp >>= 1 ;
}
メモリに余裕がある場合、32バイト分の配列を用意して
次のように記述できます。
/*
*(bpat+ 0) = 0x0001 ; *(bpat+ 1) = 0x0002 ;
*(bpat+ 2) = 0x0004 ; *(bpat+ 3) = 0x0008 ;
*(bpat+ 4) = 0x0010 ; *(bpat+ 5) = 0x0020 ;
*(bpat+ 6) = 0x0040 ; *(bpat+ 7) = 0x0080 ;
*(bpat+ 8) = 0x0100 ; *(bpat+ 9) = 0x0200 ;
*(bpat+10) = 0x0400 ; *(bpat+11) = 0x0800 ;
*(bpat+12) = 0x1000 ; *(bpat+13) = 0x2000 ;
*(bpat+14) = 0x4000 ; *(bpat+14) = 0x8000 ;
*/
for ( i = 0 ; i < TSK_ID_MAX ; i++ ) {
if ( waitq & *(bpat+i) ) {
tcb[i].wcount-- ;
if ( tcb[i].wcount == 0 ) { rsm_tsk(i); }
}
}
後で紹介するコンフィグレータでは、関数timer_handlerで
上のコードを生成しています。
この関数をタイマー割込みから呼び出すか、タイマー割込み処理
関数の中に記述すれば、時間待ち処理を実現できます。
目次
前
次