OS_Sched任务调度的疑问

2019-08-16 22:56发布

今天开始自习的看UC/OS II源码,看到OS_Sched的时候有一个疑问,网上没搜到答案。
void  OS_Sched (void)
{
#if OS_CRITICAL_METHOD == 3                            /* Allocate storage for CPU status register     */
    OS_CPU_SR  cpu_sr;
#endif    
    INT8U      y;
    OS_ENTER_CRITICAL();
    if ((OSIntNesting == 0) && (OSLockNesting == 0))
   { 
        y             = OSUnMapTbl[OSRdyGrp];         
        OSPrioHighRdy = (INT8U)((y   <  < 3) + OSUnMapTbl[OSRdyTbl[y]]);
        if (OSPrioHighRdy != OSPrioCur) 
      {              
            OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy];
            OSCtxSwCtr++;                              
            OS_TASK_SW();                              /* erform a context switch                     */
        }
    }
    OS_EXIT_CRITICAL();
}
书上说执行完OS_TASK_SW()后,PC的值变了。那就是说程序要跳到另外的地方。我的疑问是:下面的OS_EXIT_CRITICAL()不就不执行了吗?中断可还是关着的啊,什么时候开呢,在哪开呢?因为对汇编不是理解,所以看不懂。

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
henu四叶草
2019-08-17 08:08
正点原子 发表于 2013-1-13 00:28
回复【楼主位】Julius007:
---------------------------------
&nbsp;&nbsp;&nbsp;OS_TASK_SW();&nbsp;只是 ...

原子哥,也就是说,触发中断或者异常发生后,会有对应的中断状态位记录。而 OS_ENTER_CRITICAL()和  OS_EXIT_CRITICAL()之间的临界区只是保证在临界区之间保证中断处理不执行(即只是暂时挂起),但是出了临界区,对应的中断仍后正常进行。
我最近也在疑惑这个问题,既然OS_Sched是通过异常实现的(异常和中断我的理解只是前者属于系统的中断机制),那么临界区关中断期间OS_Sched为何还能实现任务的调用,我的理解是否正确

一周热门 更多>