打印

关于STM32中使用uC/OS-II消息队列的问题

[复制链接]
4317|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ben001|  楼主 | 2013-9-4 11:31 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我使用uC/OS-II创建一个能够存储10个消息的消息队列,但是我连续发送2个消息后,第3个消息就没有发送成功了。
详细源代码如下:


/* Includes -----------------------------------------------------------------*/
#include "includes.h"

/* 宏定义 ----------------------------------------------------------------------*/
/* 设置任务优先级 */
#define STARTUP_TASK_PRIO 4

/* 设置堆栈大小(单位为OS_STK) */
#define STARTUP_TASK_STK_SIZE 80
#define TASK_STK_SIZE 80

/* 消息队列的长度 */
#define N_MESSAGES 10

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

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

/* 任务定义 ---------------------------------------------------------------------*/
/****
* 函数功能: 主要往消息队列中发消息
* 参数: 无
* 返回值: 无
*/
void Task_Start(void *p_arg)
{
        // INT8U *s = "开始发送消息: ";
        INT16U count = 0;
        OS_Q_DATA os_msg;
        (void)p_arg;        // 没有使用到
       
        g_message_queue = OSQCreate(&g_message_group[0], N_MESSAGES);        //创建消息队列
       
        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
        OSQFlush(g_message_queue);                // 清空消息队列

        printf("开始发送消息: \r\n");

        printf("消息队列中消息的数量: %d, 总容量: %d,等待消息的任务数量: %d\r\n", os_msg.OSNMsgs, os_msg.OSQSize, os_msg.OSEventGrp);
        OSQPost(g_message_queue, "What is message?");        //send message FIFO
        OSQPost(g_message_queue, "Now is well!!");        //send message FIFO
        printf("消息队列中消息的数量: %d, 总容量: %d,等待消息的任务数量: %d\r\n", os_msg.OSNMsgs, os_msg.OSQSize, os_msg.OSEventGrp);
        OSTimeDlyHMSM(0,0,0,200); // 等待200ms
        OSQPost(g_message_queue, "Message1");        //send message FIFO
        OSQPost(g_message_queue, "Message2");        //send message FIFO
        OSTimeDlyHMSM(0,0,0,200); // 等待200ms
       
        while(1);
}

/****
* 函数功能: 从消息队列中取消息
* 参数: 无
* 返回值: 无
*/
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);
                printf("Task_Queue1: %s\r\n", g_ss);
               
                OSTimeDlyHMSM(0,0,1,0); /* 等待1.5s */
        }
}

/****
* 函数功能: 从消息队列中取消息
* 参数: 无
* 返回值: 无
*/
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);
                printf("Task_Queue2: %s\r\n", g_ss);
               
                OSTimeDlyHMSM(0,0,1,0); /* 等待1.5s */
        }
}


以下是串口的打印结果:


请各位高手帮忙解决一下,谢谢!!


沙发
wxweipot| | 2013-9-4 13:09 | 只看该作者
抛了4个,只来了2个,那还是debug调试把,应该很容易发现问题了。就两个任务加一个空闲任务吗?那确认任务优先级是否正确,ok的话,那只能调试消息为什么pend不到了

使用特权

评论回复
板凳
ben001|  楼主 | 2013-9-4 14:01 | 只看该作者
是呀,就只有3个任务呀?它里面最多只能放2个消息,不知道为什么?

使用特权

评论回复
地板
puchuang| | 2013-9-4 18:35 | 只看该作者
不知道是什么问题   不懂   看看有没有高手能够解决这个问题   期待中

使用特权

评论回复
5
ben001|  楼主 | 2013-9-6 17:32 | 只看该作者
有人能帮忙解决吗?

使用特权

评论回复
6
chuangpu| | 2013-9-6 19:26 | 只看该作者
帮楼主顶一个   看看别人的意见吧   楼主  高手应该有的    呼唤版主

使用特权

评论回复
7
hawksabre| | 2013-9-7 09:49 | 只看该作者
不懂这玩意   楼主   帮你顶一个   看看别人的意见如何

使用特权

评论回复
8
wxweipot| | 2013-9-9 16:40 | 只看该作者
ben001 发表于 2013-9-4 14:01
是呀,就只有3个任务呀?它里面最多只能放2个消息,不知道为什么?

问题解决了没?
如果没有,那还是之前的说的,调试跟踪吧。“它里面最多只能放2个消息”这个你是如何确定的?

使用特权

评论回复
9
xg_qing| | 2013-9-9 16:47 | 只看该作者
你的Task_Start任务优先级高于消息输出任务Task_Queue1与Task_Queue2.
Task_Queue1/Task_Queue2在输出消息后分别挂起1秒。
Task_Start随后两个消息发送后才延时200ms给消息输出,此时Task_Queue1/Task_Queue1仍处在挂起状态。
最后。。。while(1);饿死Task_Queue1/Task_Queue1,
后续消息无法输出。

使用特权

评论回复
10
wxweipot| | 2013-9-9 17:04 | 只看该作者
xg_qing 发表于 2013-9-9 16:47
你的Task_Start任务优先级高于消息输出任务Task_Queue1与Task_Queue2.
Task_Queue1/Task_Queue2在输出消息 ...

ls说出问题点了,但也不是什么优先级问题,貌似lz的Task_Start代码写的有问题,或者说程序写的跟他的想法有区别。,应该说,执行OSTimeDlyHMSM(0,0,0,200); // 等待200ms,不会再回来了。貌似是这样哎。。

使用特权

评论回复
11
ben001|  楼主 | 2013-9-23 17:49 | 只看该作者
xg_qing 发表于 2013-9-9 16:47
你的Task_Start任务优先级高于消息输出任务Task_Queue1与Task_Queue2.
Task_Queue1/Task_Queue2在输出消息 ...

我是特地这样做,拼命往里面塞消息,试一下看会怎么样,如果我3个任务都是延时1s的话,还是这样的哦。

使用特权

评论回复
12
zeluo| | 2013-9-23 19:08 | 只看该作者
确实不懂这一块   楼主   帮你顶一个   看看有没有高手能够解决这个问题

使用特权

评论回复
13
烟花不堪剪| | 2013-9-23 22:08 | 只看该作者
9楼是正解。高优先级的任务是不能写成是循环的。。。

使用特权

评论回复
14
ben001|  楼主 | 2013-9-30 17:40 | 只看该作者
烟花不堪剪 发表于 2013-9-23 22:08
9楼是正解。高优先级的任务是不能写成是循环的。。。

也就是什么意思??

使用特权

评论回复
15
香如故| | 2013-9-30 18:28 | 只看该作者
ben001 发表于 2013-9-30 17:40
也就是什么意思??

Task_Start(void *p_arg)优先级最高,while(1);后就不会执行其他任务了,
应该改成while(1){OSTimeDly(10);}. 等等,让其他任务有执行的机会。

使用特权

评论回复
16
ben001|  楼主 | 2013-9-30 18:37 | 只看该作者
香如故 发表于 2013-9-30 18:28
Task_Start(void *p_arg)优先级最高,while(1);后就不会执行其他任务了,
应该改成while(1){OSTimeDly(10 ...

也就是Task_Start()任务中最好不要执行其它的任务,启动其它任务后就一直空闲就可以?

使用特权

评论回复
17
香如故| | 2013-9-30 18:46 | 只看该作者
启动其它任务后就一直休息等待了。高优先级任务不休息,其他任务怎么运行啊,就是抢占机制的特点啊,

使用特权

评论回复
18
ben001|  楼主 | 2013-9-30 18:52 | 只看该作者
香如故 发表于 2013-9-30 18:46
启动其它任务后就一直休息等待了。高优先级任务不休息,其他任务怎么运行啊,就是抢占机制的特点啊, ...

说得对,这个我也知道。但是如果任务运行延时函数的时候应该就会挂起的吧!!!

使用特权

评论回复
19
香如故| | 2013-9-30 18:54 | 只看该作者
延时函数会挂起的任务的

使用特权

评论回复
20
香如故| | 2013-9-30 18:57 | 只看该作者
两个OSTimeDlyHMSM()和OSTimeDly()延时函数会挂起的任务的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

0

粉丝