当任务往消息队列中发送消息时,可选择只将该消息发送给一个任务。当前等待消息的任务中只有最高优先级的那个将接收到消息,或最先进入等待消息列表的(同优先级)任务。
注:也可选择以广播的形式发送消息,那么所有“等待此消息的”任务都将获得该消息。
如果没有任务在等待消息队列的消息,则发送消息时会判断消息队列当前是否已满 。
1.1.2 从消息队列接收消息
消息队列中已存在消息,通过内核服务将消息传递给等待消息的任务中优先级最高的任务,或最先进入等待消息任务列表的(同优先级)任务。
如果消息队列为空,则等待消息的任务被放入等待消息的任务列表中,直到有其它任务向消息队列发送消息后,该任务才能结束等待状态或在等待超时的情况下运行。
OSQPend()
函数允许用户定义一个最长的等待时间Timeout
作为它的参数,这样可以避免该任务无休止地等待下去。
内核提供以下消息队列服务:
- 等待消息的到来(PEND);
- 将消息放入队列中去(POST);
- 清空消息队列
- 消息队列初始化,队列初始化时总是清为空;
与信号量相比,消息队列不仅可以实现同步,而且通过缓冲的方式来传递多个数据信息,从而避免了信息的丢失或混乱。
1.2 消息队列的状态
消息队列有3种状态,即空状态(消息队列中没有任何消息)、满状态(消息队列中的每个存储单元都存放了消息)、正常状态(消息队列中消息但又没有到满的状态)。