目次

時間待ち処理

 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で  上のコードを生成しています。  この関数をタイマー割込みから呼び出すか、タイマー割込み処理  関数の中に記述すれば、時間待ち処理を実現できます。
目次

inserted by FC2 system