?? taskmng.c.bak
字號(hào):
#include "includes.h"
#define TASK_STK_SIZE 512 /* 任務(wù)棧的大小(# of WORDs) */
#define MAX_TASKS 9 /* 最大任務(wù)數(shù) */
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStk[MAX_TASKS][TASK_STK_SIZE]; /* 任務(wù)堆棧 */
OS_STK TaskStartStk[TASK_STK_SIZE]; /*初始任務(wù)棧 */
INT8U task[9]={1,2,3,4,5,6,7,8,9}; /* 9個(gè)任務(wù)優(yōu)先級(jí)為 1 到 9 */
int taskflg[9]={0,0,0,0,0,0,0,0,0}; /* 0:沒(méi)有任務(wù) 1:活動(dòng)的任務(wù) 2:掛起的任務(wù) */
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task(void *tid); /*參數(shù)指針的內(nèi)容為任務(wù)id,即任務(wù)優(yōu)先級(jí) */
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); /* 設(shè)置時(shí)鐘 */
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){ /* 按鍵響應(yīng) */
case 'c':
case 'C': /* c或者C 創(chuàng)建 */
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; /* 取得任務(wù)id */
for (i=0;i<40;i++) { /*在屏幕上重復(fù)打印任務(wù)id */
if(i==39){
i=0;
PC_DispClrRow(id+13,DISP_BGND_BLACK); /* 滿40次重新開(kāi)始打印 */
}
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() /* 創(chuàng)建任務(wù) */
{
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 返回上一級(jí)并清除提示信息 */
PC_DispClrRow(10,DISP_BGND_BLACK);
PC_DispClrRow(11,DISP_BGND_BLACK);
break;
}
if(key>='1'&&key<='9'){ /* 如果1-9 鍵 先檢查任務(wù)是否存在, 若已經(jīng)存在打印提示信息 */
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{ /* 任務(wù)不存在,則創(chuàng)建新任務(wù),并打印創(chuàng)建信息 */
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]);/*創(chuàng)建任務(wù) id為 按鍵數(shù)值*/
taskflg[key-49]=1; /* 設(shè)置活動(dòng)任務(wù)標(biāo)志 */
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 返回上一級(jí)并清除提示信息 */
PC_DispClrRow(10,DISP_BGND_BLACK);
PC_DispClrRow(11,DISP_BGND_BLACK);
break;
}
if(key>='1'&&key<='9'){ /* 如果1-9 鍵 先檢查任務(wù)是否存在, 若任務(wù)不存在打印提示信息 */
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{ /* 如果任務(wù)存在(無(wú)論是活動(dòng)任務(wù)還是掛起任務(wù)),刪除任務(wù) */
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; /* 刪除任務(wù)后任務(wù)標(biāo)志設(shè)為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 返回上一級(jí)并清除提示信息 */
PC_DispClrRow(10,DISP_BGND_BLACK);
PC_DispClrRow(11,DISP_BGND_BLACK);
break;
}
if(key>='1'&&key<='9'){ /* 如果1-9 鍵 檢查是否是活動(dòng)任務(wù), 若任務(wù)不存在或者非活動(dòng)任務(wù)打印提示信息 */
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{ /* 是活動(dòng)任務(wù),掛起該任務(wù) */
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]); /*掛起任務(wù) */
taskflg[key-49]=2; /*設(shè)置掛起任務(wù)標(biāo)志 */
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 返回上一級(jí)并清除提示信息 */
PC_DispClrRow(10,DISP_BGND_BLACK);
PC_DispClrRow(11,DISP_BGND_BLACK);
break;
}
if(key>='1'&&key<='9'){ /* 如果1-9 鍵 檢查是否是掛起的任務(wù),若不是則打印提示信息 */
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{ /* 若是掛起的任務(wù)則恢復(fù)任務(wù)到活動(dòng)狀態(tài) */
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]); /*恢復(fù)任務(wù) */
taskflg[key-49]=1; /*設(shè)置任務(wù)為活動(dòng)狀態(tài) */
break;
}
}
}
OSTimeDly(50);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -