vxworks下任务间消息队列通信例程

来源:互联网 发布:vatic windows 编辑:程序博客网 时间:2024/05/21 02:11
           vxworks下任务间消息队列通信例程/* msgQDemo.h - Header for the msgQDemo *//* Copyright 1984-1997 Wind River Systems, Inc. *//*modification history--------------------01b,06nov97,mm added copyright.01a,14dec93,ms written.*/#define CONSUMER_TASK_PRI 99 /* Priority of the consumer task */#define PRODUCER_TASK_PRI 98 /* Priority of the producer task */#define TASK_STACK_SIZE 5000 /* stack size for spawned tasks */struct msg { /* data structure for msg passing */int tid; /* task id */ int value; /* msg value */};LOCAL MSG_Q_ID msgQId; /* message queue id */LOCAL int numMsg = 8; /* number of messages */LOCAL BOOL notDone; /* Flag to indicate the completion of this demo */============================================================================/* msgQDemo.c - Demonstrates intertask communication using Message Queues *//* Copyright 1984-1997 Wind River Systems, Inc. *//*modification history--------------------01c,06nov97,mm added copyright.01b,19sep97,ram added include files stdio.h, sysLib.htested ok01a,14dec93,ms written.*//* includes */#include "VxWorks.h"#include "taskLib.h"#include "msgQLib.h"#include "msgQDemo.h"#include "sysLib.h"#include "stdio.h"/* function prototypes */LOCAL STATUS producerTask (); /* producer task */LOCAL STATUS consumerTask (); /* consumer task *//****************************************************************************** msgQDemo - Demonstrates intertask communication using Message Queues ** DESCRIPTION* Creates a Message Queue for interTask communication between the * producerTask and the consumerTask. Spawns the producerTask that creates * messages and sends messages to the consumerTask using the message queue. * Spawns the consumerTask that reads messages from the message queue. * After consumerTask has consumed all the messages, the message queue is * deleted.** RETURNS: OK or ERROR** EXAMPLE** -> sp msgQDemo**/STATUS msgQDemo(){notDone = TRUE; /* initialize the global flag *//* Create the message queue*/if ((msgQId = msgQCreate (numMsg, sizeof (struct msg), MSG_Q_FIFO)) == NULL){perror ("Error in creating msgQ");return (ERROR);}/* Spwan the 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);} /* Spwan the 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);}/* polling is not recommended. But used to make this demonstration simple*/while (notDone)taskDelay (sysClkRateGet ());if (msgQDelete (msgQId) == ERROR){perror ("Error in deleting msgQ");return (ERROR);}return (OK);}/****************************************************************************** producerTask - produces messages, and sends messages to the consumerTask * using the message queue. ** RETURNS: OK or ERROR**/STATUS producerTask (void){int count;int value;struct msg producedItem; /* producer item - produced data */ printf ("producerTask started: task id = %#x \n", taskIdSelf ());/* Produce numMsg number of messages and send these messages */for (count = 1; count <= numMsg; count++){value = count * 10; /* produce a value *//* Fill in the data structure for message passing */producedItem.tid = taskIdSelf ();producedItem.value = value;/* Send Messages */if ((msgQSend (msgQId, (char *) &producedItem, sizeof (producedItem), WAIT_FOREVER, MSG_PRI_NORMAL)) == ERROR){perror ("Error in sending the message");return (ERROR);}elseprintf ("ProducerTask: tid = %#x, produced value = %d \n", taskIdSelf (), value);}return (OK);}/****************************************************************************** consumerTask - consumes all the messages from the message queue. ** RETURNS: OK or ERROR**/STATUS consumerTask (void){int count;struct msg consumedItem; /* consumer item - consumed data */printf ("\n\nConsumerTask: Started - task id = %#x\n", taskIdSelf());/* consume numMsg number of messages */for (count = 1; count <= numMsg; count++){/* Receive messages */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; /* set the global flag to FALSE to indicate completion*/return (OK);}