OS_DisableScheduler

構文

#include <nitro/os.h>
u32 OS_DisableScheduler( void );

引数

なし。

返り値

スケジューラの動作を抑制した後の、内部カウンタ値です。

この値が 0 より大きい場合、スケジューラ動作が抑制されています。(なので、本関数では必ず 0 より大きい値が返ります。)

説明

 スレッドシステムのスケジューラの動作を抑制します。すなわち、リスケジューリングを一時停止します。

 OS_WakeupThread()OS_SetThreadPriority() など、スレッドのリスケジュールが発生する可能性のある関数が呼ばれても、スレッドのリスケジュールが行なわれないようになります。

 この OS_DisableScheduler() に対して、スケジューラ動作の抑制を解く関数は OS_EnableScheduler() となります。通常、2つの関数をペアで使用してください。

 OS_DisableScheduler()OS_EnableScheduler() は、割り込みを禁止状態にして呼び出してください。

 スケジューラは内部でカウンタを持っています。通常は 0 であるそのカウンタは、OS_DisableSchrduler() で 1 カウント増加し、OS_EnableSchduler() で 1 カウント減少します。そして、0 より大きい場合にはリスケジュールしないようにします。本関数からの戻り値はカウンタを変更した後の値です。従って、この関数を呼んだ後は必ず 0 より大きい値が返ります。

 OS_DisableScheduler()OS_EnableScheduler() のペアをネストさせる(入れ子構造にする)ことが出来ます。

(例)
            :
(void)OS_DisableRescheduler();
        :           // リスケジュール禁止
(void)OS_DisableRescheduler();
        :
(void)OS_EnableRescheduler();
        :           // ここではまだリスケジュール禁止
(void)OS_EnableRescheduler();
        :           // リスケジュール可

(注意)
 使用状況によっては何も動作するスレッドがなくてプログラムが停止するかもしれません。例えば、OS_DisableScheduler() でリスケジュールしないように設定して OS_ExitThread() を呼ぶと、カレントスレッドを終えた後に他のスレッドに実行権を移すことが出来ません。このような状況にならないように注意が必要です。

参照

OS_SelectThread, OS_RescheduleThread, OS_EnableScheduler

履歴

2005/03/08 用語統一 [割込み] → [割り込み]
2005/01/21 初版