本文主要对任务间通信机制中的消息队列进行总结介绍。
信号量的同步和互斥机制可以方便、高效地协调人物,但是无法提供完善的响应式交互信息方式。因此引入消息队列。
工作方式
-
多个任务可以同时操作同一个消息队列或者向其发送消息,或者接收消息。对于ISR,可以设置为不等待(NO_WAIT)的方式向其发送消息。在创建消息队列时,需要指定消息队列长度(最大消息数)以及每条变长消息的最大长度,以及任务的排队方式等。
-
若多个任务之间需要进行全双工交互,那么最好为每个任务创建一个消息队列(可以理解为每个人物都拥有一个自己的信箱)。
状态
刚创建好的消息队列是空的,此时消息队列处于空状态。向消息队列发送/接收消息,其结果是增加/减少消息队列中消息的数目;当数目达到消息队列长度时,消息队列为满状态。消息队列处于空状态与满状态之间时,统称为非空状态。
常用函数
消息队列的创建
-
消息队列通过msgQCreate函数来创建,系统将统一分配一个消息队列ID,所有操作都将围绕这个ID进行。
-
MSG_Q_ID msgQCreate ( int maxMsgs, /* 消息队列长度(消息队列中最大消息个数)*/ int maxMsgLength, /* 消息队列中消息的最大长度 */ int options /* 选项 */ )
-
选项与信号量类似,有三种取值
-
MSG_Q_PRIORITY:阻塞在消息队列上的
-