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