在Free RTOS中,我的任务必须等待3个不同的事件。所以,我所做的是,在ISR中,我将通过队列从3个不同的事件发送数据。如果任何队列被写入,tsak将被解除阻塞。此队列中的每一个都可以被覆盖,即。最多一个事件将填入队列中。那么,现在问题是,如何根据来自3个队列的数据解锁单个任务? 我见过QueueSet()。使用它好吗?
答案 0 :(得分:0)
QueueSet
是等待3个队列的唯一解决方案。但我认为你可以有一个只在一个队列上等待的解决方案,这更简单。您只需创建一个包含事件类型代码的结构和一个存储每个数据的联合:
enum EventType
{
Event1,
Event2,
Event3
};
struct EventMessage
{
enum EventType event;
union
{
int paramEvent1;
char paramEvent2;
unsigned char paramEvent3[4];
} parameters;
};
void sendEvent1(...)
{
struct EventMessage msg;
msg.event = Event1;
msg.parameters.paramEvent1 = ...;
xQueueSend(queue, &msg, portMAX_DELAY); //or xQueueSendFromISR if is in ISR
}
// Same for event2 and 3, replacing "msg.event = " with correct code
// And set correct parameters
void task(void * cookie)
{
struct EventMessage msg;
for(;;)
{
xQueueReceive(queue, &msg, portMAX_DELAY);
switch(msg.event)
{
case Event1:
//manage event1
break;
case Event2:
//manage event2
break;
case Event3:
//manage event3
break;
}
}
}