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 回答