0

ご存じのように、イベント フラグは非常に便利です (例: タスクの実行を許可する) が、残念ながらそれらの制御関数 (os_evt_clr/set/wait) はタスク本体の外 (例: 割り込み処理関数) で正しく機能しません。別の方法として、変数を使用し、必要に応じて割り込みハンドラーで初期化し、別のタスクでそれを使用して os_evt_set() 関数を実行し、MCU がタスクに入るようにしました。

    bool Instance_Variable;

    Interrupt_Handler()
    {
    if(xxxx)
    Instance_Variable=1
    }
//--------------------------        
    Secondary_Task()
    {
    //This is frequently run task
    if(Instance_Variable==1)
    {
    os_evt_set (0x0001, Primary_Task_ID);
    Instance_Variable=0;
    }
    }
//--------------------------    
    Primary_Task()
    {
    Result = os_evt_wait_or (0x0001, 0xFFFF);
    //Task's body 
    os_evt_clr (0x0001, Primary_Task_ID);
    }

より良いアプローチはありますか?WBR。

4

1 に答える 1

0

ISR 内で os_ で始まる関数を使用することはできません。RTX ドキュメントからの使用上のヒント:

  • os_ で始まる関数は、タスクから呼び出すことができますが、割り込みサービス ルーチンからは呼び出すことができません。
  • isr_ で始まる関数は、IRQ 割り込みサービス ルーチンから呼び出すことができますが、タスクからは呼び出すことができません。

このコードは動作します:

Interrupt_Handler() {
    if(xxxx) {
         isr_evt_set (0x0001, Primary_Task_ID);
    }
}
//--------------------------        
Primary_Task() {
    Result = os_evt_wait_or (0x0001, 0xFFFF);
    //Task's body 
    os_evt_clr (0x0001, Primary_Task_ID);
}
于 2016-05-18T08:05:42.073 に答える