📄 edf.c
字号:
}/*********************************************************************************************************** EDF TASK**********************************************************************************************************/void TaskEdf (void *pdata){ char s[40]; INT16S key; INT8U err,i,j,min,index,winner,prio,sub; INT8U state[3]={0,0,0}; // 0:none 1:waiting 2:running INT8U Di[3]={10,20,5}; INT8U Dii[3]={0,0,0}; INT8U di[3]={0,0,0}; INT8U ei[3]={4,3,2}; INT8U phase[3]={0,0,0}; void *msg; pdata = pdata; for (;;) { msg=OSMboxPend(CommMbox,0,&err); TaskStartDisp(); /* Update the display */ if (PC_GetKey(&key)) { /* See if key has been pressed */ if (key == 0x1B) { /* Yes, see if it's the ESCAPE key */ PC_DOSReturn(); /* Yes, return to DOS */ } } OSCtxSwCtr = 0; /* Clear the context switch counter */ if(Dii[1]==0){ display1=0; } for (i=0;i<3;i++){ if(Dii[i]==0){ Dii[i]=Di[i]; di[i]=0; state[i]=1; phase[i]=0; } if(state[i]==1){ sprintf(s, "(%3d) W di:%3d P:%3d",Di[i], Di[i]-di[i],phase[i]); PC_DispStr(50, 5+i, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else if(state[i]==2){ sprintf(s, "(%3d) R di:%3d P:%3d",Di[i], Di[i]-di[i],phase[i]); PC_DispStr(50, 5+i, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else{ sprintf(s, "--------------------"); PC_DispStr(50, 5+i, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } } sub=0; min=200; index=0; winner=0; for (i=0;i<3;i++){ if(di[i]>=Di[i]){ sprintf(s, "%3d miss the deadline",i); /* Display ISR running */ PC_DispStr(60, 0, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } if(state[i]==1){ sub=Di[i]-di[i]; di[i]++; if(min >= sub){ min=sub; index=i; winner=1; //waiting } } else if(state[i]==2){ sub=Di[i]-di[i]; di[i]++; if(min >= sub){ min=sub; index=i; winner=2; //running } } } //sprintf(s, "%3d:%3d:%3d", state[0],state[1],state[2]); //PC_DispStr(60, 19, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); if(display3<80){ sprintf(s, "%1d%1d%1d ", state[0],state[1],state[2]); /* Display ISR running */ PC_DispStr(display3, 18, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display3=display3+4; } else{ display3=0; sprintf(s, "%1d%1d%1d ", state[0],state[1],state[2]); /* Display ISR running */ PC_DispStr(display3, 18, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display3=display3+4; } if(winner!=0){ prio=0; for (i=0;i<3;i++){ if(state[i]!=0){ state[i]=1; prio=TASK_1_PRIO+i; err=OSTaskSuspend(prio); } else{ prio=TASK_1_PRIO+i; err=OSTaskSuspend(prio); } } prio=TASK_1_PRIO+index; if(winner==1){ //waiting phase[index]++; if(phase[index]==ei[index]){ state[index]=0; // sprintf(s, "PRIO(R):finsh %3d",ei[index]); //PC_DispStr(60, 18, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else{ state[index]=2; } lock[index]=1; check=index+1; err=OSTaskResume(prio); //sprintf(s, "PRIO(W):%3d", prio); //PC_DispStr(60, 17, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else if(winner==2){ //running phase[index]++; if(phase[index]==ei[index]){ state[index]=0; //sprintf(s, "PRIO(R):finsh %3d",ei[index]); //PC_DispStr(60, 18, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else{ state[index]=2; //sprintf(s, "PRIO(R):%3d ", prio); //PC_DispStr(60, 18, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } lock[index]=1; check=index+1; err=OSTaskResume(prio); } if(display2<80){ sprintf(s, "%1d:%1d ", index+1,phase[index]); /* Display ISR running */ PC_DispStr(display2, 20, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display2=display2+4; } else{ display2=0; sprintf(s, "%1d:%1d ", index+1,phase[index]); /* Display ISR running */ PC_DispStr(display2, 20, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display2=display2+4; } } else{ if(display2<80){ sprintf(s, "--- "); /* Display ISR running */ PC_DispStr(display2, 20, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } else{ display2=0; sprintf(s, "--- "); /* Display ISR running */ PC_DispStr(display2, 20, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); } display2=display2+4; if(display1<80){ sprintf(s, "--- "); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } else{ display1=0; sprintf(s, "--- "); /* Display ISR running */ PC_DispStr(display1, 21, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display1=display1+4; } } if(display4<80){ sprintf(s, "%1d%1d%1d ", state[0],state[1],state[2]); /* Display ISR running */ PC_DispStr(display4, 19, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display4=display4+4; } else{ display4=0; sprintf(s, "%1d%1d%1d ", state[0],state[1],state[2]); /* Display ISR running */ PC_DispStr(display4, 19, s, DISP_FGND_YELLOW + DISP_BGND_BLUE); display4=display4+4; } for (i=0;i<3;i++){ Dii[i]--; } }}/*$PAGE*//*********************************************************************************************************** DISPLAY TASK RELATED STATISTICS**********************************************************************************************************/void DispTaskStat (INT8U id){ char s[80]; sprintf(s, "%-18s %05u %5u %10ld", TaskUserData[id].TaskName, TaskUserData[id].TaskCtr, TaskUserData[id].TaskExecTime, TaskUserData[id].TaskTotExecTime); PC_DispStr(0, id + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);}/*********************************************************************************************************** OS INITIALIZATION HOOK* (BEGINNING)**********************************************************************************************************/void OSInitHookBegin (void){}/*********************************************************************************************************** OS INITIALIZATION HOOK* (END)**********************************************************************************************************/void OSInitHookEnd (void){}/*********************************************************************************************************** TASK CREATION HOOK**********************************************************************************************************/void OSTaskCreateHook (OS_TCB *ptcb){ ptcb = ptcb; /* Prevent compiler warning */}/*********************************************************************************************************** TASK DELETION HOOK**********************************************************************************************************/void OSTaskDelHook (OS_TCB *ptcb){ ptcb = ptcb; /* Prevent compiler warning */}/*********************************************************************************************************** IDLE TASK HOOK**********************************************************************************************************/void OSTaskIdleHook (void){}/*********************************************************************************************************** STATISTIC TASK HOOK**********************************************************************************************************/void OSTaskStatHook (void){ char s[80]; INT8U i; INT32U total; INT8U pct; total = 0L; /* Totalize TOT. EXEC. TIME for each task */ for (i = 0; i < N_TASK; i++) { total += TaskUserData[i].TaskTotExecTime; DispTaskStat(i); /* Display task data */ } if (total > 0) { for (i = 0; i < N_TASK; i++) { /* Derive percentage of each task */ pct = 100 * TaskUserData[i].TaskTotExecTime / total; sprintf(s, "%3d %%", pct); PC_DispStr(62, i + 11, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY); } } if (total > 1000000000L) { /* Reset total time counters at 1 billion */ for (i = 0; i < N_TASK; i++) { TaskUserData[i].TaskTotExecTime = 0L; } }}/*********************************************************************************************************** TASK SWITCH HOOK**********************************************************************************************************/void OSTaskSwHook (void){ INT16U time; TASK_USER_DATA *puser; time = PC_ElapsedStop(); /* This task is done */ PC_ElapsedStart(); /* Start for next task */ puser = OSTCBCur->OSTCBExtPtr; /* Point to used data */ if (puser != (TASK_USER_DATA *)0) { puser->TaskCtr++; /* Increment task counter */ puser->TaskExecTime = time; /* Update the task's execution time */ puser->TaskTotExecTime += time; /* Update the task's total execution time */ }}/*********************************************************************************************************** OSTCBInit() HOOK**********************************************************************************************************/void OSTCBInitHook (OS_TCB *ptcb){ ptcb = ptcb; /* Prevent Compiler warning */}/*********************************************************************************************************** TICK HOOK**********************************************************************************************************/void OSTimeTickHook (void){ char s[10]; INT8U err; err=OSMboxPost(CommMbox,(void *) &CommRxBuf[0]);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -