/********************************************************************************************************* ** 函数名称: _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); }
/********************************************************************************************************* ** 函数名称: _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)); } }