信号量-邮箱-消息队列的区别

为何要用: 
任务间的通讯能够经过全局变量或者信号量来完成。全局变量虽然能够承载通讯的内容,可是接收方没法意识到信息的到达,除非发送方向接收方发送一个信号量,或者接收方不断该全局变量;信号量能够当即使接收方知道某个事件的发生,但没法传递具体内容。用信号量进行通讯就像咱们只拨通别人的手机而不与之通话;用消息队列或者邮箱进行通讯则可达到既 拨通别人的手机又与之通话的效果。换句话说,消息队列和邮箱能够及时传送事件的内容。数组

 邮箱通讯的机理: 
发送方经过内核服务把一封邮件投递到邮箱,内核完成投递任务后通知等待列表中的接收方收取邮件。在整个投递过程当中,内核充当了邮递员的角色。这里的“邮件”一般是一个指针,接收方能够经过该指针获取邮件内容。函数

 邮箱的基本操做: 
内核一般提供以下的邮箱服务:初始化邮箱的内容。邮箱最初能够包含或者不包含邮件。把邮件发送到邮箱(post)。若是邮箱已满,则返回错误信息
(OS_MBOX_FULL)。以“挂起”方式接收邮件(pend)。若是邮箱为空,则把取信者挂起;若超过必定时间邮箱仍为空,则返回超时信息。 
以“非挂起”方式接收邮件(accept)。若是邮箱为空,则返回一个空指针。 当但愿一次性向某个任务发送多则消息时,邮箱就有点见肘了。由于一个邮箱只能装一封信。把多上邮箱集中到一块儿管理和使用就变成了消息队列,因此消息队列的操做和邮箱很类似。能够简单地认为,消息队列是邮箱数组。 若是发送者是一对一的方式发送邮件,则等待列表中的优先级最高的任务将获取邮件;若是是以广播的方式发送邮件,则等待该邮件的全部任务将得到此邮件.post

消息队列使用步骤:指针

 1.创建一个指向消息数组的指针和数组的大小,该指针数组必须申明为void类型,以下:
     void *MessageStorage[size]
 
2. 声明一个OS_EVENT类型的指针指向生成的队列,以下:
    OS_EVENT *QSem;
 
3.OSQcreate()函数建立消息队列,以下:
  QSem =  OSQcreate(&MyArrayOfMsg[0],SIZE);
4.等待消息队列中的消息,OSQPend()
 
5. 向队列发送一条消息(FIFO),OSQPost();
 
6.1 向队列发送一条消息(LIFO),OSQPostFront()
 
6.2 向消息队列发送一则消息(LIFO或者FIFO)
  INT8U OSQPostOpt (OS_EVENT *pevent, void *msg, INT8U opt)
 
七、 无等待的从消息队列中得到消息,OSQAccept()
 
八、 清空消息队列 INT8U OSQFlush (OS_EVENT *pevent)
 
九、 获取消息队列的状态,OSQQuery()队列

相关文章
相关标签/搜索