vxworks消息队列相关函数和案例

头文件:

#include <msgQLib.h>
  1. msgQCreate 创建一个消息队列
MSG_Q_ID msgQCreate
    (
    int maxMsgs,       		/*队列中存储的最大消息数目*/
    int maxMsgLength,  		/*每个消息的最大字节数*/
    int options        		/*消息在消息队列中的排列方式*/
    )         

options一般有两个选项:
MSG_Q_FIFO 表示消息以先进先出的方式在队列中
MSG_Q_PRIORITY 表示消息以优先级的方式在队列中,高优先级的消息会直接送到队列顶端
返回一个MSG_Q_ID类型的队列ID

  1. msgQSend 向一消息队列发送消息包
STATUS msgQSend
    (
    MSG_Q_ID msgQId,    /* 要发送信息的队列id*/
    char *   buffer,    /* 要发送的信息 */
    UINT     nBytes,    /* 要发送信息的长度(字节),即sizeof(buffer) */
    int      timeout,   /* 消息进入队列的等待时间 */
    int      priority   /* 该消息的优先级 */
    )                  

timeout意思是:当消息队列已满时,等待消息队列有空间时所等待的时间。超过该时间还没空间可用的话,消息包被舍弃。它有两个特殊值:NO_WAIT(0)立即返回,不管消息包是否被发送;WAIT_FOREVER(-1)一直等待消息队列有空间可用。
priority表示:指明发送的消息的优先级,可能值有:MSG_PRI_NORMAL(0)正常优先级,将消息置于消息队列的尾部;MSG_PRI_URGENT(1)紧急消息,将消息置于消息队列的首部。
返回一个STATUS状态值

  1. msgQReceive从队列接收消息
int msgQReceive
    (
    MSG_Q_ID msgQId,      /* 接收消息的队列的ID */
    char *   buffer,      /* 接收消息字节缓冲区 */
    UINT     maxNBytes,   /* 接受字节的最大长度 */
    int      timeout      /* 等待时间 */
    )  

该函数从消息队列msgQId接收消息,将其拷贝到最大长度为maxNBytes的缓冲区buffer。如果消息包长度超过maxNBytes,多余部分被舍弃。等待时间timeout有两个特殊值: NO_WAIT(0)立即返回,WAIT_FOREVER(-1)一直等待消息队列有消息可取。
返回接收到的buffer的字节大小或者ERROR

  1. msgQDelete 删除一个消息队列
STATUS msgQDelete
   (
   MSG_Q_ID msgQId      /*要删除的队列ID*/
   )

消息队列例子

  1. 程序结构
    masqID1是一个消息队列
    task1 是主任务,用来发送消息
    task2 是一个死循环任务
    主程序用来接收消息,当task1发送一个消息给主任务时,主任务调用taskDelete结束task2的运行
  2. 代码

入口函数main(id什么的记得自己声明)

	//设置系统时钟频率
	sysClkDisable();
	sysClkRateSet(1600);
	sysClkEnable();
	//创建消息队列
	if ((msgQId1 = msgQCreate (MAX_MSGS, MAX_MSG_LEN, MSG_Q_FIFO)) != NULL) 
		printf("msg create success!\n");
	//创建二进制信号量
	if ((semID2 = semBCreate(SEM_Q_FIFO, SEM_EMPTY)) == NULL) 
	{
		perror("semBCreate semID2 error! ");
		return (ERROR);
	}
	//设置看门狗并打开
	if ((wd20msID = wdCreate()) == NULL) 
	{
		perror("wd20msID create error!");
		return (ERROR);
	}
	if (wdStart(wd20msID, 16*2, (FUNCPTR)timer20msFUN, timer10msCounter) == ERROR) 
	{
		perror("wd20msID start error!");
		return (ERROR);
	}	
	//创建task1,task2
	if ((taskID1 = taskSpawn("taskID1", 100, VX_FP_TASK, STACK_SIZE,(FUNCPTR)Task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == NULL)
		return (ERROR);
	if ((taskID2 = taskSpawn("taskID2", 100, VX_FP_TASK, STACK_SIZE,(FUNCPTR)Task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) == NULL)
			return (ERROR);
	//主任务等待消息
	if (msgQReceive(msgQId1, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) != ERROR)
	 {
		 if(strcmp(msgBuf,"0522")==0)
		 {
			 taskDelete(taskID1);
			 printf("task1 has been delete\n");
		 }
	 }

	 return 0;

task1()

void task1()
{
//一系列功能代码...满足条件时发送消息终结task2.....
	if (msgQSend (msgQId1, dele, sizeof (dele), WAIT_FOREVER,MSG_PRI_NORMAL) != ERROR)
				printf("msg send succcess\n");
}

task2

void Task2(void)
{
	while (1) 
	{
		semTake(semID2, WAIT_FOREVER);
	}
}

看门狗函数

void timer20msFUN(int times) 
{
	wdStart(wd20msID, 16*2, (FUNCPTR)timer20msFUN, times);
	
		semGive(semID2);
}
  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值