Пример #1
0
/*************************************************************************************************
 *  功能:线程注销                                                                               *
 *  参数:(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;
}
Пример #2
0
/*************************************************************************************************
 *  功能:内核定时器取消初始化                                                                   *
 *  参数:(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;
}
Пример #3
0
/*************************************************************************************************
 *  功能:线程注销                                                                               *
 *  参数:(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;
}