当任务往消息队列中发送消息时,可选择只将该消息发送给一个任务。当前等待消息的任务中只有最高优先级的那个将接收到消息,或最先进入等待消息列表的(同优先级)任务。

注:也可选择以广播的形式发送消息,那么所有“等待此消息的”任务都将获得该消息。
如果没有任务在等待消息队列的消息,则发送消息时会判断消息队列当前是否已满 。

1.1.2 从消息队列接收消息
消息队列中已存在消息,通过内核服务将消息传递给等待消息的任务中优先级最高的任务,或最先进入等待消息任务列表的(同优先级)任务。

如果消息队列为空,则等待消息的任务被放入等待消息的任务列表中,直到有其它任务向消息队列发送消息后,该任务才能结束等待状态或在等待超时的情况下运行。

OSQPend()函数允许用户定义一个最长的等待时间Timeout作为它的参数,这样可以避免该任务无休止地等待下去。

内核提供以下消息队列服务:

- 等待消息的到来(PEND);
- 将消息放入队列中去(POST);
- 清空消息队列
- 消息队列初始化,队列初始化时总是清为空;
与信号量相比,消息队列不仅可以实现同步,而且通过缓冲的方式来传递多个数据信息,从而避免了信息的丢失或混乱。
1.2 消息队列的状态
消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。
本文详细介绍了μC OS-III操作系统中消息队列的工作方式,包括一对一、多对一、一对多模式。讨论了消息队列的状态、数据通信以及在任务间同步的角色。通过实例展示了如何利用消息队列实现多任务接收数据、生产者消费者模型,同时提到了动态内存管理和定时器管理在嵌入式系统中的应用。
最低0.47元/天 解锁文章
597

被折叠的 条评论
为什么被折叠?



