我使用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 */
}
}
以下是串口的打印结果:
请各位高手帮忙解决一下,谢谢!!
|
|