uCOS任务级的调度关中断的问题,需要高手的一些指点!
任务级调度使用了如下的函数:voidOS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SRcpu_sr;
#endif
INT8U y;
OS_ENTER_CRITICAL();
if ((OSIntNesting == 0) && (OSLockNesting == 0)) { /* Sched. only if all ISRs done & not locked */
y = OSUnMapTbl; /* Get pointer to HPT ready to run */
OSPrioHighRdy = (INT8U)((y << 3) + OSUnMapTbl]);
if (OSPrioHighRdy != OSPrioCur) { /* No Ctx Sw if current task is highest rdy */
OSTCBHighRdy = OSTCBPrioTbl;
OSCtxSwCtr++; /* Increment context switch counter */
OS_TASK_SW(); /* Perform a context switch */
}
}
OS_EXIT_CRITICAL();
}
我有一个问题,这个函数开始使用OS_ENTER_CRITICAL();关闭了全局中断使能,如果优先级更高的任务进入了使能状态,这个开中断的操作是在什么地方实现的?OSCtxSw函数,只是实现了任务优先级的切换,没有开中断的操作。还有一旦优先级更高的任务需要执行,这个调用就不返回了,那么 OS_EXIT_CRITICAL();还有什么作用? 高手指点一下,还是没找到对应的资料! 额,我以前看过点这个,关闭中断的话,更高优先级的任务也切换不过去吧,要等到你 OS_EXIT_CRITICAL();执行之后,才会调用高优先级的任务 第一个问题:
任务a切换到任务b。
a->a.OS_Sched()->a.OS_ENTER_CRITICAL(); ->b.OS_EXIT_CRITICAL();
明白?
第二个问题:
明白第一个问题了,这个也明白? 现在搞明白了,开始时进了一个死循环,脑子不灵光了,过了几天,豁然开朗!
页:
[1]