📄 itf.c.svn-base
字号:
#include "OS_CPU.h"
#include "OS_TCB.h"
#include "global.h"
extern INT8U const OSUnMapTbl[256];
extern INT8U const OSMapTbl[8];
void OS_Sched(void);
extern void OSCtxSw(void);
INT8U OSTaskChangePrio(INT8U id,INT8U oldprio, INT8U newprio)
{
OS_TCB *ptcb;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
INT8U y_old;
#if (CC==BCC1)||(CC==ECC1)
if (oldprio >= OS_LOWEST_PRIO) {
return (OS_ERR_PRIO_INVALID);
}
if (newprio >= OS_LOWEST_PRIO) {
return (OS_ERR_PRIO_INVALID);
}
//DisableAllInterrupts();
if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { /* New priority must not already exist */
//EnableAllInterrupts();
return (OS_ERR_PRIO_EXIST);
}
ptcb = OSTCBPrioTbl[oldprio];
if (ptcb == (OS_TCB *)0) { /* Does task to change exist? */
//EnableAllInterrupts(); /* No, can't change its priority! */
return (OS_ERR_PRIO);
}
//y = (INT8U)(newprio >> 3); /* Yes, compute new TCB fields */
//x = (INT8U)(newprio & 0x07);
//bity = (INT8U)(1 << y);
// bitx = (INT8U)(1 << x);
y = (INT8U)(newprio >> 3); /* Pre-compute X, Y, BitX and BitY */
bity = (INT8U)OSMapTbl[y];
x = (INT8U)(newprio & 0x07);
bitx = (INT8U)OSMapTbl[x];
OSTCBPrioTbl[oldprio] = (OS_TCB *)0; /* Remove TCB from old priority */
OSTCBPrioTbl[newprio] = ptcb; /* Place pointer to TCB @ new priority */
y_old = ptcb->OSTCBY;
if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0) { /* If task is ready make it not */
OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
if (OSRdyTbl[y_old] == 0) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
OSRdyGrp |= bity; /* Make new priority ready to run */
OSRdyTbl[y] |= bitx;
}
ptcb->prio = newprio; /* Set new task priority */
ptcb->OSTCBY = y;
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OSPrioCur = newprio;
//EnableAllInterrupts();
if (OSRunning == TRUE) {
/* Find new highest priority task */
OS_Sched();
}
return (OS_ERR_NONE);
#endif
#if (CC==BCC2)||(CC==ECC2)
if (oldprio >= OS_LOWEST_PRIO) {
return (OS_ERR_PRIO_INVALID);
}
if (newprio >= OS_LOWEST_PRIO) {
return (OS_ERR_PRIO_INVALID);
}
// DisableAllInterrupts();
ptcb = OSTCBidTbl[id];
if (ptcb == (OS_TCB *)0) { /* Does task to change exist? */
//EnableAllInterrupts(); /* No, can't change its priority! */
return (OS_ERR_PRIO);
}
//EnableAllInterrupts();
y = (INT8U)(newprio >> 3); /* Yes, compute new TCB fields */
x = (INT8U)(newprio & 0x07);
bity = (INT8U)(1 << y);
bitx = (INT8U)(1 << x);
//DisableAllInterrupts();
DeQueue(&OSTCBPrioTbl[oldprio] ); /* Remove TCB from old priority */
if (OSTCBPrioTbl[oldprio].front ==(OS_TCB *)0) {
y_old = ptcb->OSTCBY;
if ((OSRdyTbl[y_old] & ptcb->OSTCBBitX) != 0) { /* If task is ready make it not */
OSRdyTbl[y_old] &= ~ptcb->OSTCBBitX;
if (OSRdyTbl[y_old] == 0) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
}
}
if (OSTCBPrioTbl[newprio].front ==(OS_TCB *)0) {
OSRdyGrp |= bity; /* Make new priority ready to run */
OSRdyTbl[y] |= bitx;
}
EnQueue(&OSTCBPrioTbl[newprio],ptcb); /* Place pointer to TCB @ new priority */
ptcb->prio = newprio; /* Set new task priority */
ptcb->OSTCBY = y;
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OSPrioCur = newprio;
//EnableAllInterrupts();
if (OSRunning == TRUE) {
OS_Sched(); /* Find new highest priority task */
}
return (OS_ERR_NONE);
#endif
}
void OS_SchedNew (void)
{
INT8U y;
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);
}
void OS_Sched (void)
{
#if ((CC==BCC2) ||(CC==ECC2))
//DisableAllInterrupts();
if (OSIntNesting == 0) {
OS_SchedNew();
if (OSPrioHighRdy!=OSPrioCur) {
OSTCBHighRdy =DeQueue(&OSTCBPrioTbl[OSPrioHighRdy]);
OSCtxSwCtr++;
OSCtxSw();
}
}
//EnableAllInterrupts();
#endif
#if ((CC==BCC1) || (CC==ECC1))
//DisableAllInterrupts();
if (OSIntNesting == 0) {
OS_SchedNew();
if (OSPrioHighRdy!=OSPrioCur) {
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
OSCtxSwCtr++;
TaskSw();
}
}
// EnableAllInterrupts();
#endif
}
void TaskIdle (void)
{
for (;;) {
//DisableAllInterrupts();
OSIdleCtr++;
//EnableAllInterrupts();
}
}
void Wait (void)
{
INT8U y;
OS_TCB *ptcb;
ptcb=OSTCBCur;
#if (CC==BCC1)||(CC==ECC1)
// EnableAllInterrupts();
y = OSTCBCur->OSTCBY; /* Task no longer ready */
OSRdyTbl[y] &= ~OSTCBCur->OSTCBBitX;
if (OSRdyTbl[y] == 0) {
OSRdyGrp &= ~OSTCBCur->OSTCBBitY;
}
ptcb->state=waitting;
//EnableAllInterrupts();
#endif
#if (CC==BCC2)||(CC==ECC2)
//DisableAllInterrupts();
DeQueue(&OSTCBPrioTbl[ptcb->prio]);
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX)==0x00) {
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
}
ptcb->state=waitting;
//EnableAllInterrupts();
#endif
}
void release(INT8U id)
{
OS_TCB *ptcb;
#if (CC==BCC1)||(CC==ECC1)
INT8U prio;
//DisableAllInterrupts();
ptcb=OSTCBidTbl[id];
prio=ptcb->prio;
OSRdyGrp |=ptcb->OSTCBBitY;
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
ptcb->state=ready;
//开中断
#endif
#if (CC==BCC2)||(CC==ECC2)
//关中断
ptcb=OSTCBidTbl[id];
if (OSTCBPrioTbl[ptcb->prio].front ==(OS_TCB *)0) {
OSRdyGrp |=ptcb->OSTCBBitY; /* Make new priority ready to run */
OSRdyTbl[ptcb->OSTCBY] |=ptcb->OSTCBBitX;
}
EnQueue(&OSTCBPrioTbl[ptcb->prio],ptcb);
ptcb->state=ready;
//开中断
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -