ucos_messagequeue.c
来自「ucosDEMO程序,可以模拟实现任务管理」· C语言 代码 · 共 318 行
C
318 行
/****************************************************************************************************
* 电子科技大学嵌入式软件工程中心 版权所有 *
* *
* Copyright (C) 2006 UESTC ESEC *
****************************************************************************************************/
/*
* $Log:应用程序启动主文件 文件名 ,v$
*
* Revision 0.1 日期 时间 系统自动创建
* 创建本文件
*/
/**
* @file ucos_MessageQueue.c
* @brief
* <li>
* 功能:uC/OS消息队列演示
* </li>
* <li>
* 设计思想:这个程序演示基本的消息队列。程序启动设计了6个普通应用任务以及 一个控制任务TAC,等待消息的任
* 务总是按照优先级的高低来决定获得消息的顺 序,实现消息队列的使用。
* </li>
* <p>
* 注:本程序只具备演示功能,不能保证适用于您的真实应用。如需使用,请根据您的实际需要修改本程序。
* </p>
* @author 赵庆明
* @date 2008-4-11
* <p>
* 部门:电子科技大学嵌入式软件工程中心
* </p>
*/
/******************************************* 引用部分 ************************************************/
#include "includes.h"
/******************************************* 定义部分 ************************************************/
#define TASK_STK_SIZE 512 // Size of each task's stacks (# of WORDs)
#define N_TASKS 3 // Number of identical tasks
OS_STK TaskStk1[N_TASKS][TASK_STK_SIZE]; // Tasks stacks
OS_STK TaskStk2[N_TASKS][TASK_STK_SIZE];
OS_STK TaskStartStk[TASK_STK_SIZE]; // Startup task stack
OS_STK TaskConStk[TASK_STK_SIZE];
INT8U TaskData1[N_TASKS]; // Parameters to pass to each task
INT8U TaskData2[N_TASKS];
OS_EVENT *q1; // 2 queue
OS_EVENT *q2;
void *Msg1[6]; // 2 arry for msg
void *Msg2[6];
/******************************************* 声明部分 ************************************************/
static void Task1(void *pdata); // Function prototypes of tasks
static void Task2(void *pdata);
static void TaskStart(void *pdata); // Function prototypes of Startup task
static void TaskCon(void *pdata); //Function prototypes of Control task
static void TaskStartCreateTasks(void); // Function prototypes of creat task
/******************************************* 实现部分 ************************************************/
/**
* @brief
* main()函数,应用程序入口函数。
* @param[in] 无。
* @return 操作成功返回0;\n
* 出现问题返回1;
*/
int main (void)
{
INT8U err=err;
UCOS_CPU_INIT(); // Install uC/OS-II's running hardware environment
OSInit(); // Initialize uC/OS-II
q1 = OSQCreate(&Msg1[0],6); // set a queue , 6 is the capacity
q2 = OSQCreate(&Msg2[0],6); // set a queue , 6 is the capacity
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart(); // Start multitasking
return 0;
}
/**
* @brief
* TaskStart()函数,启动任务。
* @param[in] void *。
* @return 无\n
*/
void TaskStart(void *pdata)
{
#if OS_CRITICAL_METHOD == 3 // Allocate storage for CPU status register
OS_CPU_SR cpu_sr;
cpu_sr = cpu_sr; // Avoid warnings
#endif
pdata = pdata; // Prevent compiler warning
UCOS_TIMER_START(); // Timer interrupter start
TaskStartCreateTasks(); // Create all the application tasks
OSTaskSuspend(OS_PRIO_SELF); // Suspend the TaskStart
}
/**
* @brief
* TaskStartCreateTasks()函数,创建多任务。
* @param[in] void *。
* @return 无
*/
void TaskStartCreateTasks (void)
{
INT8U i;
for (i = 0; i <N_TASKS; i++) // Create N_TASKS identical tasks
{
TaskData1[i] = i; // Each task will pass its own id
OSTaskCreate(Task1, (void *)&TaskData1[i], &TaskStk1[i][TASK_STK_SIZE - 1], i+1);
}
for (i = 0; i <N_TASKS; i++) // Create N_TASKS identical tasks
{
TaskData2[i] = i; // Each task will pass its own id
OSTaskCreate(Task2, (void *)&TaskData2[i], &TaskStk2[i][TASK_STK_SIZE - 1], i+4);
}
OSTaskCreate(TaskCon, (void *)0, &TaskConStk[TASK_STK_SIZE - 1],i+4);
}
/**
* @brief
* Task0()函数,执行一个任务。
* @param[in] void *。
* @return 无
*/
void Task1 (void *pdata)
{
INT8U err;
INT8U id;
void *mg;
id=*(int *)pdata;
for (;;)
{
OSTimeDlyHMSM(0, 0, 2, 0); /* Wait 2 second */
mg=OSQPend(q1,0,&err); /* apply for message */
switch(err)
{
case OS_NO_ERR:
/* If it is normally, just print the string.*/
printf("Task_%d GOT %s\n\r",id,(char *)mg);
OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
break;
default :
/* If the queue is empty or has been deleted, print another string.*/
printf( "Queue1 %d is EMPTY!\n\r",id);
OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
break;
}
}
}
/**
* @brief
* Task1()函数,执行一个任务。
* @param[in] void *。
* @return 无
*/
void Task2 (void *pdata)
{
INT8U err;
INT8U id;
void *mg;
id=*(int *)pdata;
for (;;)
{
OSTimeDlyHMSM(0, 0, 2, 0); /* Wait 2 second */
mg=OSQPend(q2,0,&err); /* apply for message */
switch(err)
{
case OS_NO_ERR:
/* If it is normally, just print the string.*/
printf("Task_%d GOT %s\n\r",id+3,(char *)mg);
OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
break;
default :
/* If the queue is empty or has been deleted, print another string.*/
printf( "Queue2 is EMPTY, %d CANNOT get message!\n\r",id+3);
OSTimeDlyHMSM(0, 0, 0, 200*(4-id));
break;
}
}
}
/**
* @brief
* Task1()函数,执行一个任务。
* @param[in] void *。
* @return 无
*/
void TaskCon (void *pdata)
{
INT8U i,j;
INT8U err;
INT8U note=1; /* for flush the queue */
INT16U del=3; /* for delete the queue */
OS_EVENT *q;
OS_Q_DATA *data;
static char *s[]={ /* queue1's message */
"message0",
"message1",
"message2",
"message3",
"message4",
"message5"
};
static char *t[]={ /* queue2's message */
"messageA",
"messageB",
"messageC",
"messageD",
"messageE",
"messageF"
};
pdata=pdata;
for (;;)
{
printf("...........................ADD MESSAGE TO QUEUE_1..............................\n\r");
for( i = 0 ; i < 6 ; i++ )
{
err = OSQPostFront(q1,(void*)s[i]); /* post message to q1 LIFO */
switch(err)
{
case OS_NO_ERR:
printf("Queue1 %d add %s\n\r",i,s[i]);
OSTimeDlyHMSM(0, 0, 0, 150);
break;
case OS_Q_FULL:
printf("Queue1 is full, CANNOT add.\n\r");
OSTimeDlyHMSM(0, 0, 0, 150);
break;
default :
break;
}
if(del>=0)
{
printf("...........................ADD MESSAGE TO QUEUE_2..............................\n\r");
}
for( j = 0 ; j < 6 ; j++ )
{
err = OSQPost(q2,(void*)t[j]); /* post message to q2 FIFO */
switch(err)
{
case OS_NO_ERR:
printf("Queue2 %d add %s\n\r",j,t[j]);
OSTimeDlyHMSM(0, 0, 0, 150);
break;
case OS_Q_FULL:
printf("Queue2 is full, CANNOT add. \n\r");
OSTimeDlyHMSM(0, 0, 0, 150);
break;
default :
break;
}
}
if(del>=0)
{
if(note==1)
{
OSQFlush(q2);
printf("...........................ADD MESSAGE TO QUEUE_2..............................\n\r");
printf("..............................CLEAR UP QUEUE_2.................................\n\r");
note=0;
}
else
{
note=1;
}
}
err=OSQQuery(q2,data); /* get the information about q2 */
if(err==OS_NO_ERR)
{
printf("\n\r");
printf("Queue2'information:\n\r");
printf("NextMsg:\t%s\n\rNumMsg:\t%d\n\rQSize:\t%d\n\r",(char *)data->OSMsg,data->OSNMsgs,data->OSQSize);
printf("\n\r");
} /* print the information about q2 */
OSTimeDlyHMSM(0, 0, 0, 500); /* Wait 500 minisecond */
if(del==0)
{
q=OSQDel(q2,OS_DEL_ALWAYS,&err); /* delete the q2 */
if(q==(OS_EVENT *)0)
{
printf("DELETE Queue2 OK!\n\r");
}
}
else
{
del--;
printf( "DELETE Queue2 FAILED!\n\r");
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?