/********************************************************************************************************* ** 函数名称: _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); } }
/********************************************************************************************************* ** 函数名称: _SmpSpinTryLock ** 功能描述: 自旋锁尝试加锁操作 ** 输 入 : psl 自旋锁 ** 输 出 : LW_TRUE 加锁正常 LW_FALSE 加锁失败 ** 全局变量: ** 调用模块: *********************************************************************************************************/ BOOL _SmpSpinTryLock (spinlock_t *psl) { INTREG iregInterLevel; PLW_CLASS_CPU pcpuCur; INT iRet; iregInterLevel = KN_INT_DISABLE(); pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_INC(pcpuCur->CPU_ptcbTCBCur); /* 锁定任务在当前 CPU */ } LW_CPU_SPIN_NESTING_INC(pcpuCur); iRet = __ARCH_SPIN_TRYLOCK(psl); KN_SMP_MB(); if (iRet != LW_SPIN_OK) { if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解锁失败, 解除任务锁定 */ } LW_CPU_SPIN_NESTING_DEC(pcpuCur); } KN_INT_ENABLE(iregInterLevel); return ((iRet == LW_SPIN_OK) ? (LW_TRUE) : (LW_FALSE)); }
/********************************************************************************************************* ** 函数名称: _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); } }
/********************************************************************************************************* ** 函数名称: _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); }
/********************************************************************************************************* ** 函数名称: _UpKernelUnlockIgnIrq ** 功能描述: 内核自旋锁解锁操作, 忽略中断锁定 (必须在中断关闭的状态下被调用) ** 输 入 : NONE ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _UpKernelUnlockIgnIrq (VOID) { PLW_CLASS_CPU pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解锁任务在当前 CPU */ } }
/********************************************************************************************************* ** 函数名称: _UpKernelUnlockSched ** 功能描述: 内核 SMP 调度器切换完成后专用释放函数 (关中断状态下被调用) ** 输 入 : ptcbOwner 锁的持有者 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _UpKernelUnlockSched (PLW_CLASS_TCB ptcbOwner) { PLW_CLASS_CPU pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_DEC(ptcbOwner); /* 解锁任务在当前 CPU */ } }
/********************************************************************************************************* ** 函数名称: _UpKernelUnlockQuick ** 功能描述: 内核自旋锁解锁操作, 连同解锁中断, 不进行尝试调度 ** 输 入 : iregInterLevel 中断锁定信息 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _UpKernelUnlockQuick (INTREG iregInterLevel) { PLW_CLASS_CPU pcpuCur = LW_CPU_GET_CUR(); if (!pcpuCur->CPU_ulInterNesting) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解锁任务在当前 CPU */ } KN_INT_ENABLE(iregInterLevel); }
/********************************************************************************************************* ** 函数名称: _SmpSpinUnlockIgnIrq ** 功能描述: 自旋锁解锁操作, 忽略中断锁定 (必须在中断关闭的状态下被调用) ** 输 入 : psl 自旋锁 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _SmpSpinUnlockIgnIrq (spinlock_t *psl) { PLW_CLASS_CPU pcpuCur; 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) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解除任务锁定 */ } LW_CPU_SPIN_NESTING_DEC(pcpuCur); }
/********************************************************************************************************* ** 函数名称: _SmpSpinTryLockTask ** 功能描述: 自旋锁尝试原始加锁操作. (不锁定中断, 同时允许加锁后调用可能产生阻塞的操作) ** 输 入 : psl 自旋锁 ** 输 出 : LW_TRUE 加锁正常 LW_FALSE 加锁失败 ** 全局变量: ** 调用模块: *********************************************************************************************************/ BOOL _SmpSpinTryLockTask (spinlock_t *psl) { INTREG iregInterLevel; PLW_CLASS_CPU pcpuCur; INT iRet; iregInterLevel = KN_INT_DISABLE(); pcpuCur = LW_CPU_GET_CUR(); _BugHandle(pcpuCur->CPU_ulInterNesting, LW_TRUE, "called from ISR.\r\n"); __THREAD_LOCK_INC(pcpuCur->CPU_ptcbTCBCur); /* 锁定任务在当前 CPU */ iRet = __ARCH_SPIN_TRYLOCK_RAW(psl); KN_SMP_MB(); if (iRet != LW_SPIN_OK) { __THREAD_LOCK_DEC(pcpuCur->CPU_ptcbTCBCur); /* 解锁失败, 解除任务锁定 */ } KN_INT_ENABLE(iregInterLevel); return ((iRet == LW_SPIN_OK) ? (LW_TRUE) : (LW_FALSE)); }