Использование набора очередей в бесплатной ОСРВ
В 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;
}
}
}