为什么说ucos ii中动态改变任务优先级需要花很长时间

Bingodsp 2019-04-19 04:10:57
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);
}
}
}
...全文
100 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧