OS_Sched()分析
在uc/os中总是运行优先级最高的就绪任务,确定哪个任务优先级最高,该由哪个优先级人物运行了,这一工作是由任务调度器完成的,(而具体的任务切换,是任务调度器在调用其他函数来完成)。其中任务级的调度由函数OS_Sched()来完成,中断级的调度由OSIntExt()来完成的。
OS_Sched()函数分析
void OSSched (void) |
{ |
INT8U y; |
|
OS_ENTER_CRITICAL(); |
if ((OSLockNesting | OSIntNesting) == 0) {//判断是否满足调度条件,在uc/os中任务级调度的调用不允许来自中断服务子程序(OSIntNesting) == 0),此外当调度器上锁时,任务调度函数将直接退出,不做任务调度 |
y = OSUnMapTbl[OSRdyGrp]; |
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl[OSRdyTbl[y]]);//这两行代码是获得进入就绪态且优先级最高的任务 |
if (OSPrioHighRdy != OSPrioCur) {//检验优先级最高的任务是否是当前正在运行的任务。以避免不必要的的任务调度,毕竟任务调度是需要时间滴。 |
OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];//通过当前最高优先级OSPrioHighRdy,从任务控制块优先级表中OSTCBPrioTbl[]获得当前最高优优先级任务控制块 |
OSCtxSwCtr++;//该全局变量(32位)用于记录任务切换的次数, |
OS_TASK_SW();最后调用OS_TASK_SW宏来完成实际上的任务切换,该宏是一个软中断 |
} |
} |
OS_EXIT_CRITICAL(); |
} |
Ø 该函数调用所需要的时间是常量,于实际的任务数无关
Ø os_sched()所有代码都是临界段代码,在准找进入就绪态的优先级最高任务时,为了防止中断服务子程序把多个任务的就绪位置位,中断是关闭的。
OS_TASK_SW()函数分析