📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* ex4
*
*********************************************************************************************************
*/
#include "includes.h"
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 512 /* Size of each task's stacks (# of WORDs) */
#define N_TASKS 5 /* Number of tasks which wait for queue1 */
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStk1[TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStk2[TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStk3[TASK_STK_SIZE]; /* Tasks stacks */
OS_STK TaskStk4[TASK_STK_SIZE];
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK TaskConStk[TASK_STK_SIZE];
OS_EVENT *q1; /* 2 queue */
OS_EVENT *q2;
void *Msg1[2]; /* 2 arry for msg */
void *Msg2[2];
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Taskq1(void *pdata); /* Function prototypes of taskq1s */
void Taskq2(void *pdata); /* Function prototypes of taskq1s */
void Taskq3(void *pdata); /* Function prototypes of taskq1s */
void Taskq4(void *pdata); /* Function prototypes of taskq2s */
void TaskStart(void *pdata); /* Function prototypes of Startup task */
void TaskCon(void *pdata); /* Function prototypes of Control task */
static void TaskStartCreateTasks(void);
static void TaskStartDispInit(void);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main (void)
{
INT8U err; /* for setting the mutex */
PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); /* Clear the screen */
OSInit(); /* Initialize uC/OS-II */
PC_DOSSaveReturn(); /* Save environment to return to DOS */
PC_VectSet(uCOS, OSCtxSw); /* Install uC/OS-II's context switch vector */
//创建消息队列
q1 = OSQCreate(&Msg1[0],2); /* set a queue , 6 is the capacity */
q2 = OSQCreate(&Msg2[0],2); /* set a queue , 6 is the capacity */
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart(); /* Start multitasking */
}
void TaskStart (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
INT16S key;
pdata = pdata; /* Prevent compiler warning */
TaskStartDispInit(); /* Initialize the display */
OS_ENTER_CRITICAL();
PC_VectSet(0x08, OSTickISR); /* Install uC/OS-II's clock tick ISR */
PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */
OS_EXIT_CRITICAL();
OSStatInit(); /* Initialize uC/OS-II's statistics */
TaskStartCreateTasks(); /* Create all the application tasks */
for (;;) {
if (PC_GetKey(&key) == TRUE) { /* See if key has been pressed */
if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */
PC_DOSReturn(); /* Return to DOS */
}
}
OSTimeDlyHMSM(0, 0, 10, 0); /* Wait ten second */
}
}
static void TaskStartDispInit (void)
{
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
PC_DispStr( 0, 0, " uC/OS-II, The Real-Time Kernel ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
PC_DispStr( 0, 1, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 3, " Example #4 Queue ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 4, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 5, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 6, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 7, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 8, "Task1() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 9, "Task2() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 10, "Task3() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 11, "Task4() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 12, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 13, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 14, "TaskCon() : ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 15, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 16, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 17, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 18, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 19, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 20, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 21, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 22, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
PC_DispStr( 0, 23, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);
/* 1111111111222222222233333333334444444444555555555566666666667777777777 */
/* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
}
static void TaskStartCreateTasks (void)
{
OSTaskCreate(Taskq1, (void *)0, &TaskStk1[TASK_STK_SIZE - 1], 1);
OSTaskCreate(Taskq2, (void *)0, &TaskStk2[TASK_STK_SIZE - 1], 2);
// OSTaskCreate(Taskq3, (void *)0, &TaskStk1[TASK_STK_SIZE - 1], 3);
// OSTaskCreate(Taskq4, (void *)0, &TaskStk1[TASK_STK_SIZE - 1], 4);
OSTaskCreate(TaskCon, (void *)0, &TaskConStk[TASK_STK_SIZE - 1], 5);
}
void Taskq1 (void *pdata)
{
INT8U err;
char s[30];
void *mg;
pdata=pdata;
for (;;) {
OSTimeDlyHMSM(0, 0, 10, 0); /* Wait 2 second */
mg=OSQPend(q1,0,&err); /* apply for message */
switch(err){
case OS_NO_ERR:{
sprintf(s, "task %3d has got the %s",1,(char *)mg);
PC_DispStr(15, 8, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 3, 0);
break;
} /* If it is normally, just print the string.*/
default :{
sprintf(s, "queue1 %3d is empty. ",1);
PC_DispStr(15, 8, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 0, 200);
break;
} /* If the queue is empty or has been deleted, print another string.*/
}
sprintf(s, " ");
PC_DispStr(15, 8, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
}
void Taskq2 (void *pdata)
{
INT8U err;
char s[30];
void *mg;
pdata=pdata;
for (;;) {
OSTimeDlyHMSM(0, 0, 10, 0); /* Wait 2 second */
mg=OSQPend(q1,0,&err); /* apply for message */
switch(err){
case OS_NO_ERR:{
sprintf(s, "task %3d has got the %s",2,(char *)mg);
PC_DispStr(15, 9, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 4, 0);
break;
} /* If it is normally, just print the string.*/
default :{
sprintf(s, "queue1 %3d is empty. ",2);
PC_DispStr(15, 9, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 0, 200);
break;
} /* If the queue is empty or has been deleted, print another string.*/
}
sprintf(s, " ");
PC_DispStr(15, 9, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
}
void TaskCon (void *pdata)
{
INT8U i,j;
INT8U err;
INT16U del=10; /* for delete the queue */
OS_EVENT *q;
char ch[50];
OS_Q_DATA *data;
static char *s[]={
"shixiyun","hahahaha" };
static char *t[]={ /* queue2's message */
"huhongfei","dashagua" };
pdata=pdata;
for (;;) {
for( i = 0 ; i < 2; i++ ){
err = OSQPost(q1,(void*)s[i]); /* post message to q1 LIFO */
switch(err){
case OS_NO_ERR:{
sprintf(ch, "the queue1 %5d add %s",i,s[i]);
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 2,0);
break;
}
case OS_Q_FULL:{
sprintf(ch, "the queue1 is full ,don't add. ");
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 2, 0);
break;
}
default :break;
}
sprintf(ch, " ");
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
for( j = 0 ; j < 2 ; j++ ){
err = OSQPost(q2,(void*)t[j]); /* post message to q2 FIFO */
switch(err){
case OS_NO_ERR:{
sprintf(ch, "the queue2 %5d add %s",j,t[j]);
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 2,0);
break;
}
case OS_Q_FULL:{
sprintf(ch, "the queue2 is full,don't add. ");
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
OSTimeDlyHMSM(0, 0, 2, 0);
break;
}
default :break;
}
sprintf(ch, " ");
PC_DispStr(15, 14, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
//查询消息队列2
err=OSQQuery(q2,data); /* get the information about q2 */
if(err==OS_NO_ERR){
sprintf(ch,"the queue2'information::NextMsg: %s,NumMsg:%5d,QSize:%5d.",(char *)data->OSMsg,data->OSNMsgs,data->OSQSize);
PC_DispStr(15, 15, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
} /* print the information about q2 */
OSTimeDlyHMSM(0, 0, 2, 0); /* Wait 500 minisecond */
sprintf(ch, " ");
PC_DispStr(15, 15, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
//删除消息队列2
if(del==0)
{
q=OSQDel(q2,OS_DEL_ALWAYS,&err); /* delete the q2 */
if(q==(OS_EVENT *)0)
{
sprintf(ch, "already successful delete queue2 ");
PC_DispStr(15, 16, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
}
else
{
del--;
sprintf(ch, "not successful delete queue2");
PC_DispStr(15, 16, ch, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -