注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

W_中原的博客笔记

通知:新博客日志将更新到个人站点:http://www.zhgyuan.cn/

 
 
 

日志

 
 

【笔记】VxWorks学习之消息队列的使用  

2016-01-26 13:25:45|  分类: 嵌入式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

多任务间的一种通信方式可以使用消息队列,消息队列可以按照优先级排队或先后方式排队。消息队列可以多个任务发送消息多个任务接收消息,一般使用多个“生产者”一个“消费者”的方式,即多个任务往消息队列中发送消息,只有一个任务处理消息。

消息队列中消息的数目和大小都可以设定,当发送的消息速度大于接收消息速度时消息在队列中缓存,当队列中消息队列缓存满了以后再发送消息则会失败。接收消息的任务在没有消息可接收的时候进入阻塞等待(可以设置超时)

创建并初始化一个消息队列

MSG_Q_ID msgQCreate

(

int maxMsgs, /* max messages that can be queued */

int maxMsgLength, /* max bytes in a message */

int options /* message queue options */

)

 

options参数设置消息队列排列方式,先后和优先级排队,MSG_Q_FIFO MSG_Q_PRIORITY

返回MSG_Q_ID,或 NULL出错

 

往消息队列发送一个消息

STATUS msgQSend

(

MSG_Q_ID msgQId, /* message queue on which to send */

char * buffer, /* message to send */

UINT nBytes, /* length of message */

int timeout, /* ticks to wait */

int priority /* MSG_PRI_NORMAL or MSG_PRI_URGENT */

)

 

timeout设置超时,NO_WAIT立即返回,WAIT_FOREVER 一直等待

priority设置优先级, MSG_PRI_NORMAL按先后顺序, MSG_PRI_URGENT最高优先级,即将消息排到消息队列头部。

返回OKERROR

 

从消息队列接收一条消息

int msgQReceive

(

MSG_Q_ID msgQId, /* message queue from which to receive */

char * buffer, /* buffer to receive message */

UINT maxNBytes, /* length of buffer */

int timeout /* ticks to wait */

)

timeout设置超时,NO_WAIT立即返回,WAIT_FOREVER 一直等待

返回ERROR(出错的情况),或从消息队列中获取消息的字节数。

 

 

下面的一个小例子来测试VxWorks消息队列的创建和收发功能。

创建了两个任务,任务一 3s钟发送一条消息,任务二 1s钟处理一次消息并将接收到的消息打印出来。

 

 

#include <vxWorks.h>

#include <msgQLib.h>

#include <taskLib.h>

 

MSG_Q_ID msgQueId;

 

typedef struct{

         int id;

         char msg_buf[100];

}MSG_QUE_STRUCT;

 

MSG_QUE_STRUCT msgStruct = {

         .id = 0,

         .msg_buf = {0}

};

 

int UsrTask1( void )

{       

         int index = 0;

         char send_buf[100] = "Hello,this is msg sending test";

        

         strncpy(msgStruct.msg_buf, send_buf, 30);

    for(;;)

    {  

                   msgStruct.id++;

                  

                   msgQSend(msgQueId, (char *)&msgStruct, sizeof(MSG_QUE_STRUCT), WAIT_FOREVER,  MSG_PRI_NORMAL);

                  

                   taskDelay(180);       

    } 

}

 

int UsrTask2( void )

{       

         int index;

         MSG_QUE_STRUCT my_msg;

        

    for(;;)

    {  

                   index = msgQReceive(msgQueId, (char *)&my_msg, sizeof(MSG_QUE_STRUCT), WAIT_FOREVER);

                   printf("recved %d bytes from msg:\n", index);

                   printf("recv id: %d buf: %s\n\n",my_msg.id, my_msg.msg_buf);

                  

                   taskDelay(60);

    } 

}

 

int UsrAppConfig( void )

{       

  

         if(NULL == (msgQueId =  msgQCreate (10, sizeof(MSG_QUE_STRUCT), MSG_Q_FIFO)))

         {

                   printf("msgQCreate error!\n");

                   return -1;

         };

        

         taskSpawn( "task1",60, VX_FP_TASK, 0x1000, &UsrTask1, 0,0,0,0,0, 0,0,0,0,0 );

         taskSpawn( "task2",61, VX_FP_TASK, 0x1000, &UsrTask2, 0,0,0,0,0, 0,0,0,0,0 );

        

    return 0;

}

 

int usrEnter(void)

{       

         UsrAppConfig ();

         return 0;

}

 

从运行的情况来看,的确实现了消息队列的发送和接收。其中104字节正是每一条消息队列中消息的长度。

【笔记】VxWorks学习之消息队列的使用 - W_中原 - 汪中原的博客笔记
 
  评论这张
 
阅读(42)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017