/************************************************************************************************* * 功能:线程注销 * * 参数:(1) pThread 线程结构地址 * * 返回:(1) eFailure * * (2) eSuccess * * 说明:初始化线程和定时器线程不能被注销 * *************************************************************************************************/ TState uThreadDelete(TThread* pThread, TError* pError) { TState state = eFailure; TError error = THREAD_ERR_STATUS; if (pThread->Status == eThreadDormant) { #if ((TCLC_IPC_ENABLE) && (TCLC_IPC_MUTEX_ENABLE)) if (pThread->LockList) { error = THREAD_ERR_FAULT; state = eFailure; } else #endif { uThreadLeaveQueue(pThread->Queue, pThread); #if (TCLC_TIMER_ENABLE) uTimerDelete(&(pThread->Timer)); #endif /* 如果当前线程在ISR里先被deactivate,然后被deinit,那么在退出isr时,会发生线程切换, 还会有一次针对当前线程的栈操作,所以这里最好不要对被deinit的线程结构做内存清零操作, 除非在汇编代码里对此问题进行处理,对deinit后的当前线程不做上下文入栈操作 */ memset(pThread, 0, sizeof(pThread)); error = THREAD_ERR_NONE; state = eSuccess; } } *pError = error; return state; }
/************************************************************************************************* * 功能:内核定时器取消初始化 * * 参数:(1) pTimer 定时器结构地址 * * (2) pError 详细调用结果 * * 返回: (1) eSuccess 操作成功 * * (2) eFailure 操作失败 * * 说明 * *************************************************************************************************/ TState xTimerDelete(TTimer* pTimer, TError* pError) { TState state = eFailure; TError error = TIMER_ERR_UNREADY; TReg32 imask; CpuEnterCritical(&imask); /* 检查定时器就绪属性 */ if (pTimer->Property & TIMER_PROP_READY) { if (pTimer->Type == eUserTimer) { uTimerDelete(pTimer); error = TIMER_ERR_NONE; state = eSuccess; } else { error = TIMER_ERR_FAULT; } } CpuLeaveCritical(imask); *pError = error; return state; }
/************************************************************************************************* * 功能:线程注销 * * 参数:(1) pThread 线程结构地址 * * 返回:(1) eFailure * * (2) eSuccess * * 说明:初始化线程和定时器线程不能被注销 * *************************************************************************************************/ TState uThreadDelete(TThread* pThread, TError* pError) { TState state = eFailure; TError error = THREAD_ERR_STATUS; if (pThread->Status == eThreadDormant) { #if ((TCLC_IPC_ENABLE) && (TCLC_IPC_MUTEX_ENABLE)) if (pThread->LockList) { error = THREAD_ERR_FAULT; state = eFailure; } else #endif { uThreadLeaveQueue(pThread->Queue, pThread); #if (TCLC_TIMER_ENABLE) uTimerDelete(&(pThread->Timer)); #endif memset(pThread, 0, sizeof(pThread)); error = THREAD_ERR_NONE; state = eSuccess; } } *pError = error; return state; }