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

STM32F103x/Free RTOS系统学习笔记之环境搭建-CXM

消息队列在RTOS的应用

free rtos 任务切换的理解

free rtos 任务切换的理解

STM32F103x/Free RTOS系统学习笔记之SR04超声波测距串口输出-CXM