4246|0

90

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于ucOS-II消息队列不能存放多余2个消息的问题? [复制链接]

 我使用uC/OS-II过程中出现一个奇怪的问题。就是消息队列中不能存放多于2个消息,下面是我的源代码:
/* Includes -----------------------------------------------------------------*/
#include "includes.h"

/* 全局变量 ---------------------------------------------------------------------*/
static INT8U g_err;        // 消息队列错误的状态
static INT8U *g_ss;        // 存储读取的消息
OS_EVENT *g_message_queue;        // 定义事件控制块指针队列的事件控制块指针,用于存放创建的消息队列的指针
void *g_message_group[10];    //定义消息指针数组
OS_Q_DATA os_msg;

OS_STK task_queue1_stk[TASK_STK_SIZE];        // 定义task_queue1栈
OS_STK task_queue2_stk[TASK_STK_SIZE];        // 定义task_queue2栈

/* 函数声明 ---------------------------------------------------------------------*/
/* 获取消息队列信息 */
static void OS_QueueMessage(void);

/* 任务定义 ---------------------------------------------------------------------*/
/****
* 函数功能: 主要往消息队列中发消息
* 参数: 无
* 返回值: 无
*/
void Task_Start(void *p_arg)
{
        INT16U count = 0;
        
        (void)p_arg;        // 没有使用到
        
        g_message_queue = OSQCreate(&g_message_group[0], 10);        //创建消息队列
        if (g_message_queue)
        {
                printf("创建消息队列g_message_queue成功.\r\n");
        }
        else
        {
                printf("创建消息队列g_message_queue失败.\r\n");
        }
        OSStatInit();        /* 初始化ucos的统计任务 */
        OSTaskCreate(Task_Queue1, (void*)0, &task_queue1_stk[TASK_STK_SIZE - 1], 5);        // 接收消息的队列1
        OSTaskCreate(Task_Queue2, (void*)0, &task_queue2_stk[TASK_STK_SIZE - 1], 6);        // 接收消息的队列2
        
        
        if (OSQQuery(g_message_queue, &os_msg) == OS_ERR_NONE)
        {
                printf("消息队列的大小: %d\r\n", os_msg.OSQSize);
        }
        // OS_QueueMessage();
        printf("开始发送消息: \r\n");
        
        while(1)
        {
                if (count < 255)
                {
                        g_err = OSQPost(g_message_queue, &count);        //send message FIFO
                        g_err = OSQPost(g_message_queue, &count);        //send message FIFO
                        if (g_err == OS_ERR_Q_FULL)
                        {
                                printf("消息队列已满!\r\n");
                        }
                        g_err = OSQPost(g_message_queue, &count);        //send message FIFO
                        if (g_err == OS_ERR_Q_FULL)
                        {
                                printf("消息队列已满!\r\n");
                        }
                        printf("count = %d\r\n", count);
                        count++;
                }
                else
                {
                        count = 0;
                }
               
                OSTimeDlyHMSM(0,0,1,0); // 等待500ms
        }
}

/****
* 函数功能: 从消息队列中取消息
* 参数: 无
* 返回值: 无
*/
void Task_Queue1(void *p_arg)
{
        (void)p_arg;        // 没有使用到
        
        while(1)
        {
                g_ss = (INT8U *)OSQPend(g_message_queue, 0, &g_err); //request message queue
                printf("Task_Queue1: %d\r\n", *g_ss);
                OS_QueueMessage();
                OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
        }
}

/****
* 函数功能: 从消息队列中取消息
* 参数: 无
* 返回值: 无
*/
void Task_Queue2(void *p_arg)
{
        (void)p_arg;        // 没有使用到
        
        while(1)
        {
                g_ss = (INT8U *)OSQPend(g_message_queue, 0, &g_err);//request message queue
                printf("Task_Queue2: %d\r\n", *g_ss);
                OS_QueueMessage();
                OSTimeDlyHMSM(0,0,1,0); /* 等待1s */
        }
}

/****
* 函数功能: 获取消息队列信息
* 参数: 无
* 返回值: 无
*/
static void OS_QueueMessage(void)
{
        switch(OSQQuery(g_message_queue, &os_msg))
        {
                // case OS_ERR_NONE: printf("OSQQuery返回值:OS_ERR_NONE.\r\n"); break;
                case OS_ERR_NONE: printf("消息队列中消息的数量: %d\r\n", os_msg.OSNMsgs);
                                                printf("消息队列中的下一个消息:%s\r\n", os_msg.(*OSMsg));
                        break;
                case OS_ERR_EVENT_TYPE: printf("OSQQuery返回值:OS_ERR_EVENT_TYPE.\r\n"); break;
                case OS_ERR_PEVENT_NULL: printf("OSQQuery返回值:OS_ERR_PEVENT_NULL.\r\n"); break;
                case OS_ERR_PDATA_NULL: printf("OSQQuery返回值:OS_ERR_PDATA_NULL.\r\n"); break;
                default: break;
        }
}
以下是输出的结果:
创建消息队列g_message_queue成功.
消息队列的大小: 10
开始发送消息:
count = 0
Task_Queue1: 1
消息队列中消息的数量: 2
Task_Queue2: 1
消息队列中消息的数量: 1
count = 1
Task_Queue1: 2
消息队列中消息的数量: 3
Task_Queue2: 2
消息队列中消息的数量: 2
count = 2
Task_Queue1: 3
消息队列中消息的数量: 4
Task_Queue2: 3
消息队列中消息的数量: 3
count = 3
Task_Queue1: 4
消息队列中消息的数量: 5
Task_Queue2: 4
消息队列中消息的数量: 4
count = 4
Task_Queue1: 5
消息队列中消息的数量: 6
Task_Queue2: 5
消息队列中消息的数量: 5
count = 5
Task_Queue1: 6
消息队列中消息的数量: 7
Task_Queue2: 6
消息队列中消息的数量: 6
count = 6
Task_Queue1: 7
消息队列中消息的数量: 8
Task_Queue2: 7
消息队列中消息的数量: 7
count = 7
Task_Queue1: 8
消息队列中消息的数量: 9
Task_Queue2: 8
消息队列中消息的数量: 8
消息队列已满!
count = 8
Task_Queue1: 9
消息队列中消息的数量: 9
Task_Queue2: 9
消息队列中消息的数量: 8
消息队列已满!
count = 9
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表