simplorer 发表于 2010-3-26 18:50:10

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();还有什么作用?

simplorer 发表于 2010-3-29 08:03:11

高手指点一下,还是没找到对应的资料!

mawenwei 发表于 2010-3-29 08:35:12

额,我以前看过点这个,关闭中断的话,更高优先级的任务也切换不过去吧,要等到你 OS_EXIT_CRITICAL();执行之后,才会调用高优先级的任务

danfeidie 发表于 2010-3-30 21:12:09

第一个问题:
任务a切换到任务b。

a->a.OS_Sched()->a.OS_ENTER_CRITICAL(); ->b.OS_EXIT_CRITICAL();
明白?
第二个问题:
明白第一个问题了,这个也明白?

simplorer 发表于 2010-5-20 10:30:52

现在搞明白了,开始时进了一个死循环,脑子不灵光了,过了几天,豁然开朗!
页: [1]
查看完整版本: uCOS任务级的调度关中断的问题,需要高手的一些指点!