Использование набора очередей в бесплатной ОСРВ

В Free RTOS моя задача - ждать 3 разных события. Итак, в ISR я отправлю данные через очередь из 3 разных событий. И если какая-либо очередь будет записана, ЦАК будет разблокирован. Также каждая из этой очереди может быть перезаписана, то есть в очереди будет заполнено не более одного события. Итак, теперь вопрос, как я могу разблокировать одну задачу на основе данных из 3 очередей? Я видел QueueSet(). Это хорошо использовать это?

1 ответ

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;
        }
    }
}
Другие вопросы по тегам