/********************************************************************************************************* ** 函数名称: _SmpSpinUnlockIrq ** 功能描述: 自旋锁解锁操作, 连同解锁中断 ** 输 入 : psl 自旋锁 ** iregInterLevel 中断锁定信息 ** 输 出 : 调度器返回值 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _SmpSpinUnlockIrq (spinlock_t *psl, INTREG iregInterLevel) { PLW_CLASS_CPU pcpuCur; PLW_CLASS_TCB ptcbCur; BOOL bTrySched = LW_FALSE; INT iRet; KN_SMP_MB(); iRet = __ARCH_SPIN_UNLOCK(psl); _BugFormat((iRet != LW_SPIN_OK), LW_TRUE, "unlock error 0x%p!\r\n", psl); pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { ptcbCur = pcpuCur->CPU_ptcbTCBCur; __THREAD_LOCK_DEC(ptcbCur); /* 解除任务锁定 */ if (__ISNEED_SCHED(pcpuCur, 0)) { bTrySched = LW_TRUE; /* 需要尝试调度 */ } } LW_CPU_SPIN_NESTING_DEC(pcpuCur); KN_INT_ENABLE(iregInterLevel); if (bTrySched) { return (_ThreadSched(ptcbCur)); } else { return (ERROR_NONE); } }
/********************************************************************************************************* ** 函数名称: _SmpSpinUnlockTask ** 功能描述: 自旋锁原始解锁操作. (不锁定中断, 同时允许加锁后调用可能产生阻塞的操作) ** 输 入 : psl 自旋锁 ** 输 出 : 调度器返回值 ** 全局变量: ** 调用模块: *********************************************************************************************************/ INT _SmpSpinUnlockTask (spinlock_t *psl) { INTREG iregInterLevel; PLW_CLASS_CPU pcpuCur; PLW_CLASS_TCB ptcbCur; BOOL bTrySched = LW_FALSE; iregInterLevel = KN_INT_DISABLE(); KN_SMP_MB(); __ARCH_SPIN_UNLOCK_RAW(psl); pcpuCur = LW_CPU_GET_CUR(); _BugHandle(pcpuCur->CPU_ulInterNesting, LW_TRUE, "called from ISR.\r\n"); ptcbCur = pcpuCur->CPU_ptcbTCBCur; __THREAD_LOCK_DEC(ptcbCur); /* 解除任务锁定 */ if (__ISNEED_SCHED(pcpuCur, 0)) { bTrySched = LW_TRUE; /* 需要尝试调度 */ } KN_INT_ENABLE(iregInterLevel); if (bTrySched) { return (_ThreadSched(ptcbCur)); } else { return (ERROR_NONE); } }
/********************************************************************************************************* ** 函数名称: _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); }