OS_WaitAnyIrq

構文

#include <nitro/os.h>

void OS_WaitAnyIrq( void );

引数

なし。

返り値

なし。

説明

あらゆるIRQ割り込みを待ちます。

種類は問わず、IRQ割り込みが発生するのを待ちます。割り込みチェックフラグを調べないので、確実に割り込み発生で戻ってきます。



複数のスレッドが割り込みを待つ例

OS_WaitIrq() の例として、複数のスレッドが同じ割り込み要因を待つ場合が挙げられていますが、その中の OS_WaitIrq() の代わりに OS_WaitAnyIrq() にするとスレッド1 と スレッド2 が割り込みごと(例の場合だと V ブランクごと) に実行されます。(OS_WaitIrq() のままだとスレッド1しか実行されませんでした)

以下が OS_WaitAnyIrq() に変えたプログラムです。

void TwlMain(void)
{
  :
 OS_CreateThread( &thread1, proc1, ..., 10 );
 OS_CreateThread( &thread2, proc2, ..., 11 );
  :
}

//---- Thread1
void proc1(void* arg)
{
 while(1)
 {
  OS_WaitAnyIrq();
  OS_Printf("proc1\n");
 }
}

//---- Thread2
void proc2(void* arg)
{
 while(1)
 {
  OS_WaitAnyIrq();
  OS_Printf("proc2\n");
 }
}

//---- VBlank interrupt handler
void VBlankHandler( void )
{
 OS_SetIrqCheckFlag( OS_IE_V_BLANK );
}

スレッド1 と スレッド2 が何かの割り込みを待ちます。このとき、IRQ スレッドキューに2つのスレッドは登録されます。Vブランクが発生するとハンドラを抜けるときに、IRQ スレッドキューに登録されているスレッドが実行可能状態になります。こうした仕組みで割り込みチェックフラグとは関係なく、とにかく何かの割り込みが発生すると、OS_WaitAnyIrq() で止まっていたスレッドが実行されます。このプログラムは「proc1」と「proc2」が交互に表示され続けます。

参照

OS_WaitIrq

履歴

2008/07/01 複数のスレッドが割り込みを待つ例を記述
2005/03/08 用語統一 [割込み] → [割り込み]
2004/05/01 初版