社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1835|回复: 0

关于ucOS-II消息队列不能存放多余2个消息的问题?

[复制链接]

148

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-11-29 20:58:04 | 显示全部楼层 |阅读模式
我使用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
此帖出自uCOS/uCGUI论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-24 00:18 , Processed in 0.060817 second(s), 16 queries , Gzip On, Redis On.

快速回复 返回顶部 返回列表