队列在Free RTOS中设置用法

时间:2016-11-07 08:40:38

标签: queue rtos freertos

在Free RTOS中,我的任务必须等待3个不同的事件。所以,我所做的是,在ISR中,我将通过队列从3个不同的事件发送数据。如果任何队列被写入,tsak将被解除阻塞。此队列中的每一个都可以被覆盖,即。最多一个事件将填入队列中。那么,现在问题是,如何根据来自3个队列的数据解锁单个任务? 我见过QueueSet()。使用它好吗?

1 个答案:

答案 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;
        }
    }
}