TA的每日心情 | 奋斗 2013-12-29 16:03 |
---|
签到天数: 93 天 连续签到: 1 天 [LV.6]常住居民II
|
我使用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
希望哪位高手帮忙解决一下,谢谢!!!
|
|