タスクの基本構造
================
NOSでは関数をスレッドとして扱います。


1.スレッド
----------------------------------------------------------------------
NOSでのスレッドはタスクに登録された論理型の関数です。タスクにセットされ
たスレッドは(関数)はスケジューラーから呼び出されて実行されます。

スレッドは戻り値としてタスクのスケジューリングフラグを返します。タスク
は待機状態となれば次のタスクのスケジューリングを行いますが、スケジュー
リングフラグを使用すれば待機状態にならなくとも次のタスクをスケジューリ
ングすることができます。

[スケジューリングフラグ]

 ・真(!0) ... 実行中のタスクが実行可能なら連続実行
 ・偽(0)  ... 次のタスクを実行


2.1.スレッドの切り替え
----------------------------------------------------------------------
スレッドの切り替えはnextThread()で実行スロットに登録してあるスレッドを
マニュアルで書き換えることで行います。

[例:IDLEに戻る場合(関数idleThreadを呼び出す)]

  nextThread(idelThread);


3.特別な状態遷移
----------------------------------------------------------------------
ライブラリの待機関数を使用するタイミングで状態遷移して、待機関数専用の
スレッドを追加する必要があります。

専用スレッドは待機関数を呼び出して、待機要求が返されればスレッドから抜
けるだけです。

[具体例:メッセージ受信後にリソースを確保する]

int task1Thread1(void)
{
        struct Nos_Msg *m;
        
        m = recvMsg(MSG_BOX);
        if ((void *)NOS_WAIT == m) return false;

        nextThread(&taskThread2);		/* taskThread2へ */
                  :
                  :
}

int task1Thread2(void)
{
        int r;
        
        m = getResrc(NO_RESRC);
        if (NOS_WAIT == m) return false;
                  :
                  :
}

上記の例はライブラリの全ての待機関数で同じ処理になります。待機要求を受
け取ったタスクは実行キューから然るべき待機キューへと移動させられ、該当
する待機状態が解除されることにより実行キューへ再投入されます。


4.最後に
----------------------------------------------------------------------
待機要求を受け取ったタスクは待機Queueに移動するので、実行Queueから外れ
ます。実効Queueから外れたタスクはスケジューリングされませんのでオーバー
ヘッドは発生しません。


