【发布时间】:2017-03-20 13:05:36
【问题描述】:
在免费 RTOS 中,我的任务必须等待 3 个不同的事件。所以,我所做的是,在 ISR 中,我将通过队列从 3 个不同的事件中发送数据。如果任何队列被写入,则 tsak 将被解除阻塞。此外,每个队列都可以被覆盖,即队列中最多将填充一个事件。那么,现在的问题是,如何根据来自 3 个队列的数据解除对单个任务的阻塞? 我见过 QueueSet()。好用吗?
【问题讨论】:
在免费 RTOS 中,我的任务必须等待 3 个不同的事件。所以,我所做的是,在 ISR 中,我将通过队列从 3 个不同的事件中发送数据。如果任何队列被写入,则 tsak 将被解除阻塞。此外,每个队列都可以被覆盖,即队列中最多将填充一个事件。那么,现在的问题是,如何根据来自 3 个队列的数据解除对单个任务的阻塞? 我见过 QueueSet()。好用吗?
【问题讨论】:
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;
}
}
}
【讨论】:
QueueSet ;)