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

📄 c04b_msgq.c

📁 Tornado的源代码资源包
💻 C
字号:
/* C04b_msgQ.c P88 */

/* 头文件 */ 
#include "vxWorks.h" 
#include "msgQLib.h" 

/* 宏定义 */ 
#define  MAX_MSGS    (10)  /* 消息队列长度 */
#define  MAX_MSG_LEN (100) /* 消息队列中消息的最大长度 */
#define  STACK_SIZE  20000 /* 分配给每个任务的堆栈大小 */
#define  DELAY_TICKS 50    /* 发送消息的间隔时间 */

/* 全局变量 */
int      tidTask1;         /* 任务ID定义 */
int      tidTask2; 
MSG_Q_ID myMsgQId;         /* 消息队列ID定义 */

/* 函数声明 */
STATUS progStart(void);
STATUS task1(void);
STATUS task2(void);
void   progStop(void);

/******************************************************************
*
* progStart - 启动实例程序
*
* 负责创建消息队列与任务
*
* RETURNS: OK, ERROR
*/
STATUS progStart(void)
{
    /* 创建消息队列 */ 
    myMsgQId = msgQCreate(MAX_MSGS, MAX_MSG_LEN, MSG_Q_PRIORITY);
    if (myMsgQId == NULL) 
    {
        return (ERROR); 
    }

    /* 创建任务 */
    tidTask1 = taskSpawn("tTask1", 200, 0, STACK_SIZE,
                          (FUNCPTR)task1,0,0,0,0,0,0,0,0,0,0);

    tidTask2 = taskSpawn("tTask2", 220, 0, STACK_SIZE,
                          (FUNCPTR)task2,0,0,0,0,0,0,0,0,0,0);

    return (OK);
}

/* 定义发送消息的内容 */
#define MESSAGE "Greetings from Task 1"

/******************************************************************
*
* task1 – 周期性地向消息队列发送消息
*
* 用于周期性地向消息队列发送消息,
* 设置发送优先级为MSG_PRI_NORMAL,timeout参数为WAIT_FOREVER
*
* RETURNS: OK
*/
STATUS task1(void) 
{ 
    FOREVER
    {
        /* 向消息队列发送一条普通优先级的消息,
         * 当消息队列满时,阻塞(Pend)等待
         */
        if (msgQSend(myMsgQId, MESSAGE, sizeof(MESSAGE), 
                     WAIT_FOREVER, MSG_PRI_NORMAL) == ERROR) 
        {
            return (ERROR); 
        }

        /* 延迟,以保证消息被tTask2处理 */
        taskDelay(DELAY_TICKS);
    }
    return (OK);
}

/******************************************************************
*
* task2 – 接收消息并显示
*
* 从消息队列接收消息,当消息队列空时阻塞(Pend)等待,收到消息后显示
*
* RETURNS: OK
*/
STATUS task2(void) 
{ 
    char msgBuf[MAX_MSG_LEN]; 

    FOREVER
    {
        /* 清空消息接收缓冲 */
        memset(msgBuf, 0, MAX_MSG_LEN);
        
        /* 从消息队列接收消息,当消息队列空时阻塞(Pend)等待 */ 
        if (msgQReceive(myMsgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) 
            == ERROR) 
        {
            return (ERROR); 
        }
     
        /* 将接收到的消息显示出来 */ 
        printf("Message from task 1: %s\n", msgBuf);
    } 

    return OK;
} 

/******************************************************************
*
* progStop - 停止实例程序
*
* 调用本函数来停止本实例程序,删除创建的任务并释放消息队列资源。
*
* RETURNS: N/A
*/
void progStop(void)
{
    /* 删除创建的任务 */
    taskDelete(tidTask1);
    taskDelete(tidTask2);

    /* 释放信号量资源 */
    msgQDelete(myMsgQId);
    
    printf("BYE!\n");

    return;
}

⌨️ 快捷键说明

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