2016-01-16 34 views
0

Как вы знаете, флаги событий очень полезны (например, запуск задачи), но, к сожалению, их функции управления (os_evt_clr/set/wait) не работают за пределами объектов задач правильно (например, в функциях обработки прерываний). Для альтернативы я использовал переменную, я инициализировал ее в обработчике прерываний, когда это необходимо, а затем использовал ее в другой задаче для запуска функции os_evt_set(), чтобы MCU мог ввести задание.Почему функции флага, связанные с флагом, не работают корректно за пределами заданий в keil rtx?

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.

ответ

0

Вы не можете использовать функцию с префиксом 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); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^