Free RTOS 中的队列集使用情况
Posted
技术标签:
【中文标题】Free RTOS 中的队列集使用情况【英文标题】:Queue set usage in Free RTOS 【发布时间】:2017-03-20 13:05:36 【问题描述】:在免费 RTOS 中,我的任务必须等待 3 个不同的事件。所以,我所做的是,在 ISR 中,我将通过队列从 3 个不同的事件中发送数据。如果任何队列被写入,则 tsak 将被解除阻塞。此外,每个队列都可以被覆盖,即队列中最多将填充一个事件。那么,现在的问题是,如何根据来自 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;
【讨论】:
感谢您的回复 :) 。我遇到的问题是所有 3 个事件都是独立的,并且在我可以在前台处理事件之前可能会发生多次。我也会对事件的最新状态感到满意。所以,我会使用 [Queue Overwrite] (freertos.org/xQueueOverwrite.html)。因此,使用您的解决方案,即使用单个队列并内联发送事件,我的一个事件可能会被覆盖。也是新的堆栈溢出。抱歉我的格式不好。 @user2717596 所以你必须使用 3 个队列和QueueSet
;)
“唯一的解决方案”——不是真的;该功能可以(并且可能是)从较低级别的操作系统原语构建。例如,您可以阻止一个事件标志组,其中每个标志指示哪个队列包含一条消息。发送者将消息放在适当的队列中并设置相应的事件标志 这就是您在没有与 QueueSet 等效的 RTOS 中所做的事情。操作系统不支持偶数标志,您可以使用信号量和无等待轮询队列。总是有另一种解决方案。然而,在 FreeRTOS 上,这些方法可能效率很低。
没错,我完全忘记了Event groups 功能。有时间我会尽快更新的以上是关于Free RTOS 中的队列集使用情况的主要内容,如果未能解决你的问题,请参考以下文章
STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM