📄 msgqdemo.c
字号:
/* msgQDemo.c - 利用消息队列通信的例子*/ /* includes */ #include "vxWorks.h" #include "taskLib.h" #include "msgQLib.h" #include "sysLib.h" #include "stdio.h" #define CONSUMER_TASK_PRI 99 /* consumer task 优先级*/ #define PRODUCER_TASK_PRI 98 /* producer task 优先级*/ #define TASK_STACK_SIZE 5000 /*任务栈大小 */ struct msg { /* 传递的消息结构体 */ int tid; /* 任务号*/ int value; /* 传递的值 */ }; LOCAL MSG_Q_ID msgQId; /* 消息队列号*/ LOCAL int numMsg = 3; /*队列中 最大消息个数*/ LOCAL BOOL notDone; /* 完成标志*/ /* function prototypes */ LOCAL STATUS producerTask (); /* producer task */ LOCAL STATUS consumerTask (); /* consumer task */ /***************************************************************************** * msgQDemo - 利用消息队列通信的主程序 * * DESCRIPTION * 在producerTask 和consumerTask 之间创建一个消息队列, * producerTask 通过消息队列发送消息, * consumerTask通过消息队列接收 消息. * 当consumerTask 接收完所有消息,关闭消息队列 * * RETURNS: OK or ERROR * * EXAMPLE * * -> sp msgQDemo * */ STATUS msgQDemo() { notDone = TRUE; /* initialize the global flag */ /* 创建一个消息队列,先入先出类型*/ if ((msgQId = msgQCreate (numMsg, sizeof (struct msg), MSG_Q_FIFO)) == NULL) { perror ("Error in creating msgQ"); return (ERROR); } /* 创建 producerTask task */ if (taskSpawn ("tProducerTask", PRODUCER_TASK_PRI, 0, TASK_STACK_SIZE, (FUNCPTR) producerTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR) { perror ("producerTask: Error in spawning demoTask"); return (ERROR); } /* 创建consumerTask task */ if (taskSpawn ("tConsumerTask", CONSUMER_TASK_PRI, 0, TASK_STACK_SIZE, (FUNCPTR) consumerTask, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) == ERROR) { perror ("consumerTask: Error in spawning demoTask"); return (ERROR); } /* 轮询,等待consumerTask 接收完所有消息*/ while (notDone) taskDelay (sysClkRateGet ()); /*关闭消息队列*/ if (msgQDelete (msgQId) == ERROR) { perror ("Error in deleting msgQ"); return (ERROR); } return (OK); } /***************************************************************************** * producerTask - 通过消息队列发送消息 * * RETURNS: OK or ERROR * */ LOCAL STATUS producerTask (void) { int count; int value; struct msg producedItem; /* 发送缓存 */ printf ("producerTask started: task id = %#x \n", taskIdSelf ()); /*产生 numMsg 个消息并发送*/ for (count = 1; count <= numMsg; count++) { value = count * 10; /* 给消息结构体赋值 */ producedItem.tid = taskIdSelf (); /*任务号*/ producedItem.value = value; /* 发送消息*/ if ((msgQSend (msgQId, (char *) &producedItem, sizeof (producedItem), WAIT_FOREVER, MSG_PRI_NORMAL)) == ERROR) { perror ("Error in sending the message"); return (ERROR); } else printf ("ProducerTask: tid = %#x, produced value = %d \n", taskIdSelf (), value); } return (OK); } /***************************************************************************** * consumerTask - 通过消息队列接收消息 * * RETURNS: OK or ERROR * */ LOCAL STATUS consumerTask (void) { int count; struct msg consumedItem; /* 接收缓存 */ printf ("\n\nConsumerTask: Started - task id = %#x\n", taskIdSelf()); /* 接收 numMsg 个消息*/ for (count = 1; count <= numMsg; count++) { /* 接受消息 */ if ((msgQReceive (msgQId, (char *) &consumedItem, sizeof (consumedItem), WAIT_FOREVER)) == ERROR) { perror ("Error in receiving the message"); return (ERROR); } else printf ("ConsumerTask: Consuming msg of value %d from tid = %#x\n", consumedItem.value, consumedItem.tid); } notDone = FALSE; /*设置notDone,通知主任务关闭消息队列*/ return (OK); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -