Почему функции, связанные с флагами событий, не работают правильно вне задач в 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.


person Dzzz    schedule 16.01.2016    source источник


Ответы (1)


Вы не можете использовать функцию с префиксом os_ внутри ISR. Советы по использованию из документации 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);
}
person Community    schedule 18.05.2016