⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msgqdemo.c

📁 tornado 2.0 for PPC 消息队列源代码
💻 C
字号:
/* 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.h
   tested ok
01a,14dec93,ms   written.
*/
/* includes */
#include <vxWorks.h>
#include <taskLib.h>
#include <msgQLib.h>
#include "msgQDemo.h"
#include <sysLib.h>
#include <stdio.h>

#ifdef	__cplusplus
extern "C"{
#endif

/* 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);
            }
        else
            printf ("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);
    }

#ifdef	__cplusplus
}
#endif	/* end of __cplusplus */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -