⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 taskmng.c.bak

📁 uCosII 邮箱消息和任务管理
💻 BAK
字号:


#include  "includes.h"

#define  TASK_STK_SIZE                 512              /* 任务栈的大小(# of WORDs)            */
#define  MAX_TASKS                      9       	     /* 最大任务数                          */

/*
*********************************************************************************************************
*                                               VARIABLES
*********************************************************************************************************
*/

OS_STK           TaskStk[MAX_TASKS][TASK_STK_SIZE];     /* 任务堆栈                       */
OS_STK           TaskStartStk[TASK_STK_SIZE];           /*初始任务栈                      */
INT8U            task[9]={1,2,3,4,5,6,7,8,9};           /* 9个任务优先级为 1 到 9         */
int              taskflg[9]={0,0,0,0,0,0,0,0,0};        /* 0:没有任务 1:活动的任务 2:挂起的任务 */
/*
*********************************************************************************************************
*                                           FUNCTION PROTOTYPES
*********************************************************************************************************
*/

 void Task(void *tid);       /*参数指针的内容为任务id,即任务优先级 */
 void TaskStart(void *data);
 void CreateTask();
 void DeleteTask();
 void SuspendTask();
 void ResumeTask();

/*
*********************************************************************************************************
*                                                MAIN
*********************************************************************************************************
*/

void main (void)
{
    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 */

    PC_DispStr(26,  0, "uC/OS-II, The Real-Time Kernel", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
    PC_DispStr(30,  2, "Task Management Example", DISP_FGND_WHITE + DISP_BLINK);
    PC_DispStr(10,  4, "Usage:", DISP_FGND_WHITE);
    PC_DispStr(15,  5, "C: To Create   A Task          D: To Delete A Task", DISP_FGND_WHITE);
    PC_DispStr(15,  5, "C",DISP_FGND_YELLOW);
    PC_DispStr(21,  5, "C",DISP_FGND_YELLOW);
    PC_DispStr(46,  5, "D",DISP_FGND_YELLOW);
    PC_DispStr(52,  5, "D",DISP_FGND_YELLOW);
    PC_DispStr(15,  6, "S: To Suspend  A Task          R: To Resume A Task", DISP_FGND_WHITE);
    PC_DispStr(15,  6, "S",DISP_FGND_YELLOW);
    PC_DispStr(21,  6, "S",DISP_FGND_YELLOW);
    PC_DispStr(46,  6, "R",DISP_FGND_YELLOW);
    PC_DispStr(52,  6, "R",DISP_FGND_YELLOW);
    PC_DispStr(10,  8, "MAX TASKS NUMBER: 9", DISP_FGND_WHITE);
    PC_DispStr(28,  8, " 9 ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
    PC_DispStr(28, 26, "<-PRESS 'ESC' TO QUIT->", DISP_FGND_WHITE + DISP_BLINK);

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                              STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *data)
{
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;
#endif

    WORD       key;

    OS_ENTER_CRITICAL();
    PC_VectSet(0x08, OSTickISR);                           /* 设置时钟                                 */
    PC_SetTickRate(OS_TICKS_PER_SEC);
    OS_EXIT_CRITICAL();

    OSStatInit();                                          /* Initialize uC/OS-II's statistics         */

    for (;;) {
        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            switch(key){                                   /* 按键响应                                 */

               case 'c':
               case 'C':                                    /* c或者C 创建 */
               	 CreateTask();
                 continue;
		       case 'd':                                    /* d或者D 删除 */
               case 'D':
                  DeleteTask();
                  continue;
               case 's':                                    /* s或者S 挂起 */
               case 'S':
                  SuspendTask();
                  continue;
               case 'r':                                    /* r或者R 唤醒 */
               case 'R':
                  ResumeTask();
                  continue;
            	case 0x1B:
                PC_DOSReturn();                            /* ESC  Return to DOS                       */
            }
        }

        OSTimeDlyHMSM(0, 0, 1, 0);                         /* Wait one second                          */
    }
}

void Task (void* tid)
{
    int i;
    int id =*(int*)tid;    /* 取得任务id */

    for (i=0;i<40;i++) {   /*在屏幕上重复打印任务id */
        if(i==39){
        	i=0;
            PC_DispClrRow(id+13,DISP_BGND_BLACK);  /* 满40次重新开始打印  */
        }
        PC_DispStr(15, id+13,"Task ", DISP_FGND_WHITE);
        PC_DispChar(20,id+13,id+48, DISP_FGND_WHITE);
        PC_DispChar(22,id+13,':', DISP_FGND_WHITE);
        PC_DispChar(i+24, id+13,id+48, DISP_FGND_WHITE);
        OSTimeDly(10);
    }

}

void CreateTask()     /* 创建任务  */
{
   WORD key;
   PC_DispStr(12,10,"You Choose To Create A Task", DISP_FGND_WHITE);
   PC_DispStr(26,10,"CREATE", DISP_FGND_YELLOW);
   PC_DispStr(12,11,"Input Task ID(1-9)(ESC to Cancel):", DISP_FGND_WHITE);
   for (;;) {
        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            if(key==0x1B){                                 /* ESC 返回上一级并清除提示信息             */
               PC_DispClrRow(10,DISP_BGND_BLACK);
               PC_DispClrRow(11,DISP_BGND_BLACK);
            	break;
            }
            if(key>='1'&&key<='9'){                        /* 如果1-9 键 先检查任务是否存在, 若已经存在打印提示信息 */
            	if(taskflg[key-49]!=0){
                  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
               	  PC_DispStr(12,10,"Task Already Exist!", DISP_FGND_YELLOW);
                  break;
               }else{                                      /* 任务不存在,则创建新任务,并打印创建信息 */
               	  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
               	  PC_DispStr(12,10,"Create Task:", DISP_FGND_YELLOW);
               	  PC_DispChar(26,10,key, DISP_FGND_YELLOW);
               	  OSTaskCreate(Task, (void*)&task[key-49], &TaskStk[key-49][TASK_STK_SIZE - 1], task[key-49]);/*创建任务 id为 按键数值*/
                  taskflg[key-49]=1;    /* 设置活动任务标志 */
               	  break;
               }
            }
        }
        OSTimeDly(50);
   }
}

void DeleteTask()
{
	WORD key;
	PC_DispStr(12,10,"You Choose To DELETE A Task", DISP_FGND_WHITE);
    PC_DispStr(26,10,"DELETE", DISP_FGND_YELLOW);
    PC_DispStr(12,11,"Input Task ID(1-9)(ESC to Cancel):", DISP_FGND_WHITE);
    for (;;) {
        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            if(key==0x1B){                                  /* ESC 返回上一级并清除提示信息             */
            	PC_DispClrRow(10,DISP_BGND_BLACK);
                PC_DispClrRow(11,DISP_BGND_BLACK);
            	break;
            }
            if(key>='1'&&key<='9'){          /* 如果1-9 键 先检查任务是否存在, 若任务不存在打印提示信息 */
            	if(taskflg[key-49]==0){
               	PC_DispClrRow(10,DISP_BGND_BLACK);
               	PC_DispClrRow(11,DISP_BGND_BLACK);
               	PC_DispStr(12,10,"No Such Task!", DISP_FGND_YELLOW);
                break;
               }else{                        /* 如果任务存在(无论是活动任务还是挂起任务),删除任务 */
               	PC_DispClrRow(10,DISP_BGND_BLACK);
               	PC_DispClrRow(11,DISP_BGND_BLACK);
               	PC_DispStr(12,10,"Delete Task:", DISP_FGND_YELLOW);
               	PC_DispChar(26,10,key, DISP_FGND_YELLOW);
               	OSTaskDel(task[key-49]);
                taskflg[key-49]=0;         /* 删除任务后任务标志设为0 */
               	PC_DispClrRow(key-35,DISP_BGND_BLACK);
               	break;
               }
            }
        }
        OSTimeDly(50);
   }
}

void SuspendTask()
{
	WORD key;
	PC_DispStr(12,10,"You Choose To SUSPEND A Task", DISP_FGND_WHITE);
   PC_DispStr(26,10,"SUSPEND", DISP_FGND_YELLOW);
   PC_DispStr(12,11,"Input Task ID(1-9)(ESC to Cancel):", DISP_FGND_WHITE);
   for (;;) {
        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            if(key==0x1B){                                 /* ESC 返回上一级并清除提示信息             */
            	PC_DispClrRow(10,DISP_BGND_BLACK);
                PC_DispClrRow(11,DISP_BGND_BLACK);
            	break;
            }
            if(key>='1'&&key<='9'){                   /* 如果1-9 键 检查是否是活动任务, 若任务不存在或者非活动任务打印提示信息 */
            	if(taskflg[key-49]!=1){
                  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
               	  PC_DispStr(12,10,"Not An Active Task or Task Does NOT Exist!", DISP_FGND_YELLOW);
               	  break;
               }else{                                /* 是活动任务,挂起该任务 */
               	  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
               	  PC_DispStr(12,10,"Suspend Task:", DISP_FGND_YELLOW);
               	  PC_DispChar(26,10,key, DISP_FGND_YELLOW);
               	  OSTaskSuspend(task[key-49]);     /*挂起任务 */
                  taskflg[key-49]=2;  /*设置挂起任务标志 */
               	  break;
               }

            }
        }
        OSTimeDly(50);
   }
}

void ResumeTask()
{
   WORD key;
   PC_DispStr(12,10,"You Choose To RESUME A Task", DISP_FGND_WHITE);
   PC_DispStr(26,10,"RESUME", DISP_FGND_YELLOW);
   PC_DispStr(12,11,"Input Task ID(1-9)(ESC to Cancel):", DISP_FGND_WHITE);
   for (;;) {
        if (PC_GetKey(&key) == TRUE) {                     /* See if key has been pressed              */
            if(key==0x1B){                                  /* ESC 返回上一级并清除提示信息             */
            	PC_DispClrRow(10,DISP_BGND_BLACK);
                PC_DispClrRow(11,DISP_BGND_BLACK);
            	break;
            }
            if(key>='1'&&key<='9'){                  /* 如果1-9 键 检查是否是挂起的任务,若不是则打印提示信息 */
            	if(taskflg[key-49]!=2){
                  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
               	  PC_DispStr(12,10,"Not A Suspended Task or Task Does NOT Exist!", DISP_FGND_YELLOW);
                  break;
               }else{                               /* 若是挂起的任务则恢复任务到活动状态 */
               	  PC_DispClrRow(10,DISP_BGND_BLACK);
               	  PC_DispClrRow(11,DISP_BGND_BLACK);
                  PC_DispStr(12,10,"Resume Task:", DISP_FGND_YELLOW);
               	  PC_DispChar(26,10,key, DISP_FGND_YELLOW);
               	  OSTaskResume(task[key-49]);       /*恢复任务 */
                  taskflg[key-49]=1;  /*设置任务为活动状态 */
               	break;
               }
            }
        }
        OSTimeDly(50);
   }
}








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -