查看: 4856|回复: 3

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

[复制链接]
  • TA的每日心情
    奋斗
    2013-12-29 16:03
  • 签到天数: 93 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2013-9-10 17:06:34 | 显示全部楼层 |阅读模式
    分享到:
    我使用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


    希望哪位高手帮忙解决一下,谢谢!!!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-3-27 11:54
  • 签到天数: 309 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-9-10 19:26:05 | 显示全部楼层
    帮顶。。。。。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-27 13:57
  • 签到天数: 486 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2013-9-10 20:43:42 | 显示全部楼层
    不会啊 啊啊   


    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2013-12-29 16:03
  • 签到天数: 93 天

    连续签到: 1 天

    [LV.6]常住居民II

     楼主| 发表于 2013-9-13 20:40:24 | 显示全部楼层
    顶起来!!!!!
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-25 19:36 , Processed in 0.153555 second(s), 21 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.