RTOS:单个任务可以有两个Message Queue吗?

时间:2012-04-11 05:27:58

标签: embedded message-queue rtos

我创建了一个任务A和两个消息队列Q1,Q2。任务A是否可以等待两个消息队列?

我知道这是不可能的,因为在阻止消息Q调用的情况下,当没有任何要处理的消息时,任务将阻塞自身(阻塞状态)。

例如,如果Q1有msgs且Q2没有msgs,那么在Q1的情况下,任务将处于就绪状态且进入Q2,任务必须处于阻塞状态。

任务一次不能处于2个状态。

我的理解是否正确?

3 个答案:

答案 0 :(得分:1)

精确的方法取决于您的RTOS,但基本上您需要等待事件或信号量,然后轮询队列(非阻塞/零超时读取)。发送任务必须将消息放在适当的队列中,然后设置事件或sempahore - 这应该在单个任务接口函数中完成 - 发送任务不应该知道接收任务通信的机制。

如果使用事件标志,则可以为每个队列使用单独的标志,因此您知道要从哪个队列读取(一个或另一个或两者),但由于事件标志不计算对象,您需要迭代地轮询队列,直到它耗尽,以防队列中有多个消息。

计数信号量有一些用处,但只能告诉你消息的总数,而不是它们所在的队列,因此每次采取sempahore时都必须检查它们。这可能导致为一个信号量计数(每个队列一个)读取两条消息,然后是没有相应消息的sem-take。您可以使用共享数据扩充信号量,或者您的RTOS可以报告队列中的消息数量。

二进制信号量将像事件标志一样工作,除非无法告知哪个队列有消息,因此您必须轮询两者。

答案 1 :(得分:0)

我认为这取决于RTOS的实现。您当然可以编写一个能够在两个队列上进行挂起调用的RTOS。它只是一个带有两个参数的RTOS调用。然后,RTOS管理这两个队列,并且知道任务在两个队列上都是未决的。但是,我从未见过实现此功能的RTOS。

答案 2 :(得分:0)

大多数RTOS都不提供此功能,但您可以实现。

作为示例RTOS; GHS-INTEGRITY内置了此功能,您可以等待一个或多个;消息队列接收事件,定时器过期事件,设备rx缓冲区获取事件,设备tx缓冲区在同一行(时间)发送事件。