📄 edf.c
字号:
/*********************************************************************************************************** uC/OS-II* The Real-Time Kernel** (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL* All Rights Reserved** EXAMPLE #3**********************************************************************************************************/#include "includes.h"/*********************************************************************************************************** CONSTANTS**********************************************************************************************************/#define TASK_STK_SIZE 1024 /* Size of each task's stacks (# of WORDs) */#define TASK_START_ID 0 /* Application tasks */#define TASK_EDF_ID 1#define TASK_1_ID 2#define TASK_2_ID 3#define TASK_3_ID 4#define TASK_START_PRIO 10 /* Application tasks priorities */#define TASK_EDF_PRIO 11#define TASK_1_PRIO 20#define TASK_2_PRIO 21#define TASK_3_PRIO 22#define N_TASK 5#define MSG_QUEUE_SIZE 2 /* Size of message queue used in example *//*********************************************************************************************************** DATA TYPES**********************************************************************************************************/typedef struct { char TaskName[30]; INT16U TaskCtr; INT16U TaskExecTime; INT32U TaskTotExecTime;} TASK_USER_DATA;/*********************************************************************************************************** VARIABLES**********************************************************************************************************/OS_STK TaskStartStk[TASK_STK_SIZE]; /* Startup task stack */OS_STK TaskEdfStk[TASK_STK_SIZE]; /* Clock task stack */OS_STK Task1Stk[TASK_STK_SIZE]; /* Task #1 task stack */OS_STK Task2Stk[TASK_STK_SIZE]; /* Task #2 task stack */OS_STK Task3Stk[TASK_STK_SIZE]; /* Task #3 task stack */TASK_USER_DATA TaskUserData[N_TASK];OS_EVENT *CommMbox;INT8U CommRxBuf[1];INT8U lock[3],check;INT8U display1,display2,display3,display4;/*********************************************************************************************************** FUNCTION PROTOTYPES**********************************************************************************************************/ void TaskStart(void *data); /* Function prototypes of tasks */static void TaskStartCreateTasks(void);static void TaskStartDispInit(void);static void TaskStartDisp(void); void TaskEdf(void *data); void Task1(void *data); void Task2(void *data); void Task3(void *data); void DispTaskStat(INT8U id);/*$PAGE*//*********************************************************************************************************** MAIN**********************************************************************************************************/void main (void){ PC_DispClrScr(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_ElapsedInit(); /* Initialized elapsed time measurement */ strcpy(TaskUserData[TASK_START_ID].TaskName, "StartTask"); OSTaskCreateExt(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], TASK_START_PRIO, TASK_START_ID, &TaskStartStk[0], TASK_STK_SIZE, &TaskUserData[TASK_START_ID], 0); OSStart(); /* Start multitasking */}/*$PAGE*//*********************************************************************************************************** STARTUP TASK**********************************************************************************************************/void TaskStart (void *pdata){#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */ OS_CPU_SR cpu_sr;#endif INT16S key; INT8U err; pdata = pdata; /* Prevent compiler warning */ TaskStartDispInit(); /* Setup the display */ OS_ENTER_CRITICAL(); /* Install uC/OS-II's clock tick ISR */ PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); /* Reprogram tick rate */ OS_EXIT_CRITICAL(); OSStatInit(); /* Initialize uC/OS-II's statistics */ CommMbox=OSMboxCreate((void *) 0); /* Create a mail box */ TaskStartCreateTasks(); display1=0; display2=0; display3=0; display4=0; err=OSTaskSuspend(TASK_1_PRIO); err=OSTaskSuspend(TASK_2_PRIO); err=OSTaskSuspend(TASK_3_PRIO); err=OSTaskChangePrio(62,15); err=OSTaskChangePrio(OS_PRIO_SELF,60); for (;;) { OSTaskDel(OS_PRIO_SELF); OSTimeDly(OS_TICKS_PER_SEC); /* Wait one second */ }}/*$PAGE*//*********************************************************************************************************** CREATE APPLICATION TASKS**********************************************************************************************************/void TaskStartCreateTasks (void){ strcpy(TaskUserData[TASK_EDF_ID].TaskName, "Edf Task"); OSTaskCreateExt(TaskEdf, (void *)0, &TaskEdfStk[TASK_STK_SIZE - 1], TASK_EDF_PRIO, TASK_EDF_ID, &TaskEdfStk[0], TASK_STK_SIZE, &TaskUserData[TASK_EDF_ID], 0); strcpy(TaskUserData[TASK_1_ID].TaskName, "Task #1"); OSTaskCreateExt(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], TASK_1_PRIO, TASK_1_ID, &Task1Stk[0], TASK_STK_SIZE, &TaskUserData[TASK_1_ID], 0); strcpy(TaskUserData[TASK_2_ID].TaskName, "Task #2"); OSTaskCreateExt(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], TASK_2_PRIO, TASK_2_ID, &Task2Stk[0], TASK_STK_SIZE, &TaskUserData[TASK_2_ID], 0); strcpy(TaskUserData[TASK_3_ID].TaskName, "Task #3"); OSTaskCreateExt(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], TASK_3_PRIO, TASK_3_ID, &Task3Stk[0], TASK_STK_SIZE, &TaskUserData[TASK_3_ID], 0); }/*$PAGE*//*********************************************************************************************************** INITIALIZE THE DISPLAY**********************************************************************************************************/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, " Jean J. Labrosse ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 2, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 3, " EXAMPLE #3 ", 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, " ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 9, "Task Name Counter Exec.Time(uS) Tot.Exec.Time(uS) %Tot. ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 10, "----------------- ------- ------------- ----------------- ----- ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 11, " ", 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, " ", 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, "#Tasks : CPU Usage: % ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 23, "#Task switch/sec: ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); PC_DispStr( 0, 24, " <-PRESS 'ESC' TO QUIT-> ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY + DISP_BLINK);/* 1111111111222222222233333333334444444444555555555566666666667777777777 *//* 01234567890123456789012345678901234567890123456789012345678901234567890123456789 */}/*$PAGE*//*********************************************************************************************************** UPDATE THE DISPLAY**********************************************************************************************************/static void TaskStartDisp (void){ char s[80]; sprintf(s, "%5d", OSTaskCtr); /* Display #tasks running */ PC_DispStr(18, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);#if OS_TASK_STAT_EN > 0 sprintf(s, "%3d", OSCPUUsage); /* Display CPU usage in % */ PC_DispStr(36, 22, s, DISP_FGND_YELLOW + DISP_BGND_BLUE);#endif sprintf(s, "%5d", OSCtxSwCtr); /* Display #context switches per second */ PC_DispStr(18, 23, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); sprintf(s, "V%1d.%02d", OSVersion() / 100, OSVersion() % 100); /* Display uC/OS-II's version number */ PC_DispStr(75, 24, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); switch (_8087) { /* Display whether FPU present */ case 0: PC_DispStr(71, 22, " NO FPU ", DISP_FGND_YELLOW + DISP_BGND_BLUE); break; case 1: PC_DispStr(71, 22, " 8087 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break; case 2: PC_DispStr(71, 22, "80287 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break; case 3: PC_DispStr(71, 22, "80387 FPU", DISP_FGND_YELLOW + DISP_BGND_BLUE); break; }}/*$PAGE*//*********************************************************************************************************** TASK**********************************************************************************************************/void Task1 (void *pdata){ char s[10]; char *msg; INT8U err; INT16S key; pdata = pdata; for (;;) { lock[0]=0; while(lock[0]==0){ } if(display1<80){ sprintf(s, "%1d>1 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } else{ display1=0; sprintf(s, "%1d>1 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } }}void Task2 (void *pdata){ char s[10]; char *msg; INT8U err; INT16S key; pdata = pdata; for (;;) { lock[1]=0; while(lock[1]==0){ } if(display1<80){ sprintf(s, "%1d>2 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } else{ display1=0; sprintf(s, "%1d>2 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } }}void Task3 (void *pdata){ char s[10]; char *msg; INT8U err; INT16S key; pdata = pdata; for (;;) { lock[2]=0; while(lock[2]==0){ } if(display1<80){ sprintf(s, "%1d>3 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } else{ display1=0; sprintf(s, "%1d>3 ",check); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -