我创建了一个任务 A 和两个消息队列 Q1、Q2。任务 A 是否可以等待两个消息队列?
我知道这是不可能的,因为在阻塞消息 Q 调用的情况下,当没有任何消息要处理时,任务将阻塞自身(阻塞状态)。
例如,如果 Q1 有 msgs 而 Q2 没有 msgs,那么在 Q1 的情况下,任务将处于就绪状态,而在 Q2 的情况下,任务必须处于阻塞状态。
一个任务不能同时处于两种状态。
我的理解正确吗?
我创建了一个任务 A 和两个消息队列 Q1、Q2。任务 A 是否可以等待两个消息队列?
我知道这是不可能的,因为在阻塞消息 Q 调用的情况下,当没有任何消息要处理时,任务将阻塞自身(阻塞状态)。
例如,如果 Q1 有 msgs 而 Q2 没有 msgs,那么在 Q1 的情况下,任务将处于就绪状态,而在 Q2 的情况下,任务必须处于阻塞状态。
一个任务不能同时处于两种状态。
我的理解正确吗?
精确的方法取决于您的 RTOS,但本质上您需要等待事件或信号量,然后轮询队列(非阻塞/零超时读取)。发送任务必须将消息放在适当的队列中,然后设置事件或信号量——这应该在单个任务接口函数中完成——发送任务不必知道接收任务通信的机制。
如果您使用事件标志,则可以为每个队列使用单独的标志,因此您知道要从哪个队列读取(一个或另一个或两者),但由于事件标志不计算对象,您需要轮询队列迭代直到它耗尽,以防队列上的消息多于消息。
计数信号量有一些用处,但只告诉您消息的总数,而不是它们所在的队列,因此每次获取信号量时您都必须检查它们。这可能导致为一个信号量计数(每个队列一个)读取两条消息,然后是没有相应消息的 sem-take。您可以使用共享数据增加信号量,或者您的 RTOS 可能能够报告队列中的消息数量。
二进制信号量将像事件标志一样工作,只是无法判断哪个队列有消息,因此您必须轮询两者。
我认为这取决于 RTOS 的实现。您当然可以编写一个能够在两个队列上挂起调用的 RTOS。这只是一个带有两个参数的 RTOS 调用。然后 RTOS 管理这两个队列并知道任务在它们上都处于挂起状态。但是,我从未见过实现此功能的 RTOS。
大多数 RTOS 不提供此功能,但您可以实现。
以 RTOS 为例;GHS-INTEGRITY 内置此功能,您可以等待一个或多个;消息队列接收事件、定时器过期事件、设备 rx 缓冲区获取事件、设备 tx 缓冲区发送事件在同一行(时间)。