Beispiel #1
0
/*********************************************************************************************************
** 函数名称: _UpSpinUnlock
** 功能描述: 自旋锁解锁操作
** 输 入  : psl           自旋锁
** 输 出  : 调度器返回值
** 全局变量: 
** 调用模块: 
*********************************************************************************************************/
INT  _UpSpinUnlock (spinlock_t *psl)
{
    INTREG          iregInterLevel;
    PLW_CLASS_CPU   pcpuCur   = LW_CPU_GET_CUR();
    BOOL            bTrySched = LW_FALSE;
    
    iregInterLevel = KN_INT_DISABLE();
    
    if (!pcpuCur->CPU_ulInterNesting) {
        __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur);                     /*  解除任务锁定                */
        if (__COULD_SCHED(pcpuCur, 0)) {
            bTrySched = LW_TRUE;                                        /*  需要尝试调度                */
        }
    }
    
    KN_INT_ENABLE(iregInterLevel);
    
    if (bTrySched) {
        return  (_ThreadSched(pcpuCur->CPU_ptcbTCBCur));
    
    } else {
        return  (ERROR_NONE);
    }
    
    return  (ERROR_NONE);
}
Beispiel #2
0
/*********************************************************************************************************
** 函数名称: _SchedGetCand
** 功能描述: 获的需要运行的线程表 (被调用时已经锁定了调度器 spinlock)
** 输 入  : ptcbRunner        需要运行的 TCB 列表 (大小等于 CPU 数量)
**           ulCPUIdCur        当前 CPU ID
**           ulCurMaxLock      当前 CPU 允许的最多任务锁定层数.
** 输 出  :
** 全局变量:
** 调用模块:
*********************************************************************************************************/
PLW_CLASS_TCB  _SchedGetCand (PLW_CLASS_CPU  pcpuCur, ULONG  ulCurMaxLock)
{
    if (!__COULD_SCHED(pcpuCur, ulCurMaxLock)) {                        /*  当前执行线程不能调度        */
        return  (pcpuCur->CPU_ptcbTCBCur);

    } else {                                                            /*  可以执行线程切换            */
#if LW_CFG_SMP_EN > 0
        if (LW_CPU_GET_IPI_PEND2(pcpuCur) & LW_IPI_CALL_MSK) {          /*  由延迟的 IPI CALL 需要执行  */
            _SmpUpdateIpi(pcpuCur);
        }
#endif                                                                  /*  LW_CFG_SMP_EN > 0           */
        if (LW_CAND_ROT(pcpuCur)) {                                     /*  产生优先级卷绕              */
            _CandTableUpdate(pcpuCur);
        }
        return  (LW_CAND_TCB(pcpuCur));
    }
}