📄 taskapi.c.svn-base
字号:
#include "OS_CPU.h"
#include "OS_TCB.h"
#include "global.h"
INT8U activatetask(INT8U id)
{
INT8U prio;
OS_TCB *ptcb;
#if (CC==BCC1)||(CC==ECC1)
DisableAllInterrupts();
if(OSTCBidTbl[id]!=(OS_TCB *)0) {
ptcb = OSTCBidTbl[id];
if(ptcb->state==suspended) {
prio=ptcb->prio;
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
ptcb->state=ready;
EnableAllInterrupts();
if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) {
OS_Sched();
}
return(E_OK);
}else {
if(ptcb->state!=ready) {
EnableAllInterrupts();
return(E_OS_ID); }
}
}else {
EnableAllInterrupts();
return(E_OS_ID);
}
#endif
#if CC==BCC2
DisableAllInterrupts();
if(OSTCBidTbl[id]!=(OS_TCB*)0) {
ptcb=OSTCBidTbl[id];
if(ptcb->state==suspended) {
prio=ptcb->prio;
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
}
EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
ptcb->state=ready;
atvtimes[id]++;
EnableAllInterrupts();
if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) {
OS_Sched();
}
return(E_OK);
}else {
if(ptcb->state=ready) {
if(atvtimes[id]<MAXTIMES) {
atvtimes[id]++;
EnableAllInterrupts(); }
else return(E_OS_LIMIT);
}
}
}else {
EnableAllInterrupts();
return(E_OS_ID);
}
#endif
#if CC==ECC2
DisableAllInterrupts();
if(OSTCBidTbl[id]!=(OS_TCB*)0) {
ptcb=OSTCBidTbl[id];
if (ptcb->state==suspended) {
prio=ptcb->prio;
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
}
EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
ptcb->state=ready;
if(ptcb->taskclass==BT) {
atvtimes[id]++;
}
EnableAllInterrupts();
if ((OSRunning ==TRUE)&&(OSTCBCur->schedpcy==PREEMPT)) {
OS_Sched();
}
return(E_OK);
}else {
EnableAllInterrupts();
if ((ptcb->state==ready)&&(ptcb->taskclass==BT)) {
if(atvtimes[id]<MAXTIMES) {
DisableAllInterrupts();
atvtimes[id]++;
EnableAllInterrupts();
return(E_OK);
} else return(E_OS_LIMIT);
} else return(E_OS_ID);
} } else {
EnableAllInterrupts();
return(E_OS_ID);
}
#endif
}
INT8U terminatetask(void)
{
OS_TCB *ptcb;
#if CC==BCC1
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
EnableAllInterrupts();
OS_Sched();
#endif
#if CC==BCC2
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
atvtimes[ptcb->id]--;
if(atvtimes[ptcb->id]>0) {
ptcb->state=ready;
} else {
DeQueue(&OSTCBPrioTbl[ptcb->prio]);
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
}
ptcb->state=suspended;
}
EnableAllInterrupts();
OS_Sched();
#endif
#if CC==ECC1
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
EnableAllInterrupts();
OS_Sched();
#endif
#if CC==ECC2
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if ((ptcb->taskclass==BT)&&(--atvtimes[ptcb->id]>0)) {
ptcb->state=ready;
} else {
DeQueue(&OSTCBPrioTbl[ptcb->prio]);
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
}
}
EnableAllInterrupts();
OS_Sched();
#endif
}
INT8U chaintask(INT8U id)
{
OS_TCB *ptcb;
OS_TCB *ptcb1;
INT8U prio;
#if CC==BCC1
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if (OSTCBCur==OSTCBidTbl[id]) {
EnableAllInterrupts();
OS_Sched();
return(E_OK);
}
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
if(OSTCBidTbl[id]!=(OS_TCB*)0) {
ptcb=OSTCBidTbl[id];
if(ptcb->state==suspended) {
prio=ptcb->prio;
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
ptcb->state=ready;
EnableAllInterrupts();
OS_Sched();
} else {
EnableAllInterrupts();
return(E_OS_ID);
}
} else {
EnableAllInterrupts();
return(E_OS_ID);
}
#endif
#if CC==BCC2
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if (OSTCBCur==OSTCBidTbl[id]) {
EnableAllInterrupts();
OS_Sched();
return(E_OK);
}
atvtimes[ptcb->id]--;
if(atvtimes[ptcb->id]>0) {
ptcb->state=ready;
} else {
DeQueue(&OSTCBPrioTbl[ptcb->prio]);
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
}
ptcb->state=suspended;
}
if(OSTCBidTbl[id]!=(OS_TCB*)0) {
ptcb=OSTCBidTbl[id];
if(ptcb->state==suspended) {
prio=ptcb->prio;
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
}
EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
ptcb->state=ready;
atvtimes[id]++;
EnableAllInterrupts();
OS_Sched();
} else {
if(ptcb->state=ready) {
if(atvtimes[id]<MAXTIMES)
atvtimes[id]++;
EnableAllInterrupts();
else return(E_OS_LIMIT);
}
}
}
#endif
#if CC==ECC1
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if (OSTCBCur==OSTCBidTbl[id]) {
EnableAllInterrupts();
OS_Sched();
return(E_OK);
}
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
ptcb1=OSTCBidTbl[id];
if(ptcb1->state==waitting) {
return(E_OS_ID);
} else {
activatetask(id);
}
OS_Sched();
#endif
#if CC==ECC2
if(OSIntNesting>0) {
return(E_OS_CALLEVEL);
}
DisableAllInterrupts();
ptcb=OSTCBCur;
if(ptcb->prio==OS_IDLE_PRIO) {
EnableAllInterrupts();
return(TASKIDLE);
}
if (ptcb->ResourceNesting>0) {
EnableAllInterrupts();
return(E_OS_RESOURCE);
}
if ((ptcb->taskclass==BT)&&(--atvtimes[ptcb->id]>0)) {
ptcb->state=ready;
} else {
DeQueue(&OSTCBPrioTbl[ptcb->prio]);
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
ptcb->state=suspended;
}
}
if(OSTCBidTbl[id]!=(OS_TCB*)0) {
ptcb=OSTCBidTbl[id];
if (ptcb->state==suspended) {
prio=ptcb->prio;
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
}
EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
ptcb->state=ready;
if(ptcb->taskclass==BT) {
atvtimes[id]++;
}
EnableAllInterrupts();
OS_Sched();
} else {
EnableAllInterrupts();
if ((ptcb->state==ready)&&(ptcb->taskclass==BT)) {
if(atvtimes[id]<MAXTIMES) {
DisableAllInterrupts();
atvtimes[id]++;
EnableAllInterrupts();
OS_Sched();
return(E_OK);
} else return(E_OS_LIMIT);
} else return(E_OS_ID);
}
} else {
EnableAllInterrupts();
return(E_OS_ID);
}
#endif
}
void schedule(void)
{
OS_Sched();
}
INT8U GetTaskId(void)
{
DisableAllInterrupts();
if (OSTCBCur!=(OS_TCB*)0) {
EnableAllInterrupts();
return(OSTCBCur->id);
} else { EnableAllInterrupts();
return(INVALID_TASK); }
}
INT8U GetTaskState(INT8U id)
{
OS_TCB *ptcb;
DisableAllInterrupts();
ptcb=OSTCBidTbl[id];
if(ptcb!=(OS_TCB*)0) {
EnableAllInterrupts();
return(ptcb->state); }
else {
EnableAllInterrupts();
return(E_OS_ID);
}}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -