WRTOS系统消息队列的使用

   消息在操作系统中是个特殊的名词,更多的时候它指的是一种对象,而并非字面意义上的消息,可以泛指一切对象或数据结构。任务与任务之间的通讯或者数据传递在操作系统看来都是消息,操作系统提供了这样一种消息机制来满足不同的任务之间进行通讯。

  消息也是联系两个互不相关联互无关系的任务的载体,任务间通讯,也产生消息等等。

  WRTOS提供了消息服务,具体有点对点消息服务、同步信号量消息服务、消息队列服务,这里将介绍WRTOS中消息队列的使用。

  WRTOS4.0中改进了消息队列的系统服务,但压缩了消息队列的体积,由值传递方式改动成为指针传递,这样传递的效率会大大提高,同时消息内容可以是任何对象。WRTOS中消息被处理于队列结构中,出于安全性考虑,这个消息队列工作于非循环模式下,当队列满时,将产生消息丢失,但是确保证了以前的消息不被抹掉,任务应即时处理当前消息,消息的写入方式却是循环方式的,消息出队方式按时间先后顺序。

  假设有两个任务,任务A和任务B,任务B接收任务A发送的消息,并处理消息。为了使示例更加有通用性,我先定义如下消息结构:

   

  上面定义了一个键盘的消息类型,一则按键消息由三个参数组成,下面将用此消息为例在任务A与任务B相使用消息:

  

  任务A中定义了一由本地消息MyMsg,并定义了一则系统消息CurMsg,任务A将本地消息填充为从0-9不断变化的按键KeyBoard按下消息,同时调用系统队列消息服务发送消息方法Wrtos_TaskPutQmsg(……)向任务B发出,这一系统调用的原型和使用方法为:

  

  任务A发送消息类型为Wrtos_MsgType_KeyBoard类型,即健盘消息,长度为1。之后任务A休眠1000系统节拍,周而复始,下面看看任务B的接收处理和编程方法:

  

  上面代码示例了任务B如何接收任务A发送的消息,以及如何提取和处理消息。首先任务B在本地建立了长度为5的消息队列,最多可容纳5则消息,同时定义了按键消息指针,用于格式化消息内容,这点很重要,因为消息是任何对象,在使用消息时必须先将其拥有确定的类型,否则无法正确处理消息。任务B向系统注册了本地消息队列,这样本地消息接收队列便可以为系统参于管理,系统将会按队列方式依次将收到的消息放入这个本地队列中,其调用原型为:

  

  向系统注册消息队列后,系统便参于其管理,包括消息自动入队出队操作,循环操作,队列满阻塞操作等等,任务B随后进入消息等待状态,其系统调用为Wrtos_Task_GetQmsg();以下是调用原型:

  

  任务进入等待消息状态后,系统将任务强制到休眠状态,当消息到来时,系统将消息进行入队操作,同时等待任务进入就绪态,产生系统任务切换,并使消息出队返回。任务B收消息后判断其是否为空消息,然后判断其消息类型,是否为自己所期待的消息类型,本处假设任务B也在等待键盘消息,则将其格式化为键盘消息,随即处理该消息。

  以上是WRTOS中消息队列的用法,借用键盘消息实例,可以看到其一般的调用和处理过程。当然还可以挂载任何形式的消息。

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值