FreeRTOS xQueueSelectFromSet和xQueueReceive的用法

时间:2016-02-19 10:54:02

标签: freertos

我在PIC32微控制器上使用FreeRTOS v8.2.3。我有一个案例,我需要将以下3个事件发布到ISR的3个相应队列,以便一次解锁等待其中一个事件的任务 - a)SETUP包到达 b)转移完成的事件1 c)转移完成的事件2

我的执行顺序和要求如下:

案例1(在point_1处阻止了对事件的执行): 当SETUP在执行点_1等待时到达 - i)应该解除等待的任务 ii)从队列接收并处理的设置

处理了一些代码并达到了point_2

案例2(在point_2处阻止了对事件的执行): 如果在第2点发生任何SETUP或转移完成事件 - i)解锁等待 ii)从队列接收transfer_complete_1或transfer_complete_2事件以执行一些额外的传输并在point_2循环 iii)如果它是安装队列事件,请不要接收,但转到point_1

当我尝试在Setup队列中使用xQueueReceive和xQueueSelectFromSet时,代码似乎不起作用,即使其中一个在point_1使用而另一个在point_2使用。 但是,如果我在两个地方使用xQueueSelectFromSet并验证导致事件继续进行的queuset成员句柄,似乎工作正常。

鉴于上述要求,在两个地方使用xQueueSelectFromSet的问题是 - xQueueSelectFromSet调用将背对背放置,首先是在point_2的Setup事件,然后是point_1,这是非故意的 - 也不需要在point_1调用xQueueSelectFromSet

因此,任何人都可以解释是否以及如何在同一队列中同时使用队列集和队列接收?如果不可能,我们通常如何在FreeRTOS中实现上述要求?

1 个答案:

答案 0 :(得分:1)

这是FreeRTOS支持论坛上提出的问题的副本,所以下面是我在那里给出的答案的副本:

我不完全了解您的使用方案,但有些方面可能有所帮助。

1)如果队列是队列集的成员,则只能在从队列集返回其句柄后才能读取队列。此外,如果从队列集返回队列句柄,则必须从队列中读取该项。如果不满足这些要求中的任何一个,则队列集的状态将与集合中的队列状态不匹配。

2)如果相同的任务是从多个队列中读取,那么可能根本不需要使用队列集。请参阅"使用队列集的替代方案"以下页面中的部分:http://www.freertos.org/Pend-on-multiple-rtos-objects.html