ucos ii中,呼叫OSTaskChangePrio ()函式來動態改變任務的優先級,為什么很多人說這需要花挺長的時間?看了這個函式,里面大概也就二三十條指令吧,按20ns的機器周期算,那它的執行時間也沒超過1us,這個時間算長嗎?
下附OSTaskChangePrio ()函式:
INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)
{
OS_TCB *ptcb;
OS_EVENT *pevent;
INT8U x;
INT8U y;
INT8U bitx;
INT8U bity;
if ((oldprio >= OS_LOWEST_PRIO && oldprio != OS_PRIO_SELF) || //(1)
newprio >= OS_LOWEST_PRIO) {
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[newprio] != (OS_TCB *)0) { //(2)
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
} else {
OSTCBPrioTbl[newprio] = (OS_TCB *)1; //(3)
OS_EXIT_CRITICAL();
y = newprio >> 3; //(4)
bity = OSMapTbl[y];
x = newprio & 0x07;
bitx = OSMapTbl[x];
OS_ENTER_CRITICAL();
if (oldprio == OS_PRIO_SELF) { //(5)
oldprio = OSTCBCur->OSTCBPrio;
}
if ((ptcb = OSTCBPrioTbl[oldprio]) != (OS_TCB *)0) { //(6)
OSTCBPrioTbl[oldprio] = (OS_TCB *)0; //(7)
if (OSRdyTbl[ptcb->OSTCBY] & ptcb->OSTCBBitX) { //(8)
if ((OSRdyTbl[ptcb->OSTCBY] &= ~ptcb->OSTCBBitX) == 0) { //(9)
OSRdyGrp &= ~ptcb->OSTCBBitY;
}
OSRdyGrp |= bity; //(10)
OSRdyTbl[y] |= bitx;
} else {
if ((pevent = ptcb->OSTCBEventPtr) != (OS_EVENT *)0) { //(11)
if ((pevent->OSEventTbl[ptcb->OSTCBY] &=
~ptcb->OSTCBBitX) == 0) {
pevent->OSEventGrp &= ~ptcb->OSTCBBitY;
}
pevent->OSEventGrp |= bity; //(12)
pevent->OSEventTbl[y] |= bitx;
}
}
OSTCBPrioTbl[newprio] = ptcb; //(13)
ptcb->OSTCBPrio = newprio; //(14)
ptcb->OSTCBY = y; //(15)
ptcb->OSTCBX = x;
ptcb->OSTCBBitY = bity;
ptcb->OSTCBBitX = bitx;
OS_EXIT_CRITICAL();
OSSched(); //(16)
return (OS_NO_ERR);
} else {
OSTCBPrioTbl[newprio] = (OS_TCB *)0; //(17)
OS_EXIT_CRITICAL();
return (OS_PRIO_ERR);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/134317.html
標籤:驅動開發/核心開發
上一篇:arm開發板有沒有功耗特別低的啊
下一篇:紅外遙控控制led
