为什么事件标志相关函数在keil rtx中的任务之外无法正常工作?

时间:2016-01-16 20:30:14

标签: rtos keil rtx

如您所知,事件标志非常有用(例如让任务运行),但不幸的是它们的控制功能(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。

1 个答案:

答案 0 :(得分: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);
}