⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssp_sem.c

📁 abstract rtos
💻 C
字号:
#ifdef __cplusplusextern "C"{#endif #include "syscfg.h"#include "sys/sys_pub.h"#include "aos.h"#include "ssp_sem.h"SEM_S * g_pstSem;U32 m_sem_init(){    U32 index;    g_pstSem = (SEM_S*)aos_smem_alloc( MPE_SYS, SID_SEM, sizeof( SEM_S)*CONFIG_SEM_NUM );    if( NULL == g_pstSem )    {         return SEM_MOD_INIT_FAIL;    }        for( index=0 ; index < CONFIG_SEM_NUM; index++ )    {        g_pstSem[index].status = SEM_CB_FREE;        g_pstSem[index].flags  = 0;        g_pstSem[index].name[0] = '\0';        g_pstSem[index].value  = 0;        g_pstSem[index].sys_sem    = (SYS_SEM_T)-1;    }        return AOS_SUCC;}U32 aos_sem_create( S8 name[AOS_NAME_LEN+1], U32 flags, U32 value, U32 *pulSemId ){    U32 index,lockKey;    SEM_S *pSem;    	    if( NULL == pulSemId )    {        return SEM_INVALID_POINTER_PARA;    }        lockKey = aos_int_lock();        for( index=0; index < CONFIG_SEM_NUM; index++ )    {        if( SEM_CB_FREE == g_pstSem[index].status )        {            break;        }    }    if( index >= CONFIG_SEM_NUM )    {        aos_int_unlock(lockKey);        *pulSemId = U32_BUTT;        return SEM_CREATE_NOMEM;    }    pSem = &g_pstSem[index];    pSem->status = SEM_CB_USED;        aos_int_unlock(lockKey);    if( AOS_SUCC != sys_sem_create( name, flags, value, &pSem->sys_sem ) )    {        lockKey = aos_int_lock();        pSem->status = SEM_CB_FREE;        aos_int_unlock(lockKey);        *pulSemId = U32_BUTT;        return SEM_SYS_CREATE_FAIL;    }        lockKey = aos_int_lock();    pSem->flags = (U16)flags;    pSem->value = (S32)value;    aos_strncpy( pSem->name, name, AOS_NAME_LEN );        aos_int_unlock(lockKey);        *pulSemId = index;    	    return AOS_SUCC;}U32 aos_sem_cancel(U32 ulSemId ){    U32 lockKey, result;    SEM_S *pSem;    lockKey = aos_int_lock();    if( (ulSemId >= CONFIG_SEM_NUM) ||    	(SEM_CB_USED != g_pstSem[ulSemId].status) )    {        aos_int_unlock(lockKey);        return SEM_INVALID_SEM_ID;    }    pSem = &g_pstSem[ulSemId];        aos_int_unlock(lockKey);    result = sys_sem_cancel( &pSem->sys_sem );    if( AOS_SUCC != result )    {        return SEM_SYS_CANCEL_FAIL;    }        lockKey = aos_int_lock();    pSem->status = SEM_CB_FREE;    pSem->flags  = 0;    pSem->name[0] = '\0';    pSem->value  = 0;    pSem->sys_sem    = (SYS_SEM_T)-1;    aos_int_unlock(lockKey);    return AOS_SUCC;}U32 aos_sem_wait( U32 ulSemId, U32 ulTimeout ){    U32 lockKey, result;    SEM_S *pSem;    lockKey = aos_int_lock();    if( (ulSemId >= CONFIG_SEM_NUM) ||    	(SEM_CB_USED != g_pstSem[ulSemId].status) )    {        aos_int_unlock(lockKey);        return SEM_INVALID_SEM_ID;    }    pSem = &g_pstSem[ulSemId];    pSem->value--;        aos_int_unlock(lockKey);    result = sys_sem_wait( &pSem->sys_sem, ulTimeout );    if( AOS_SUCC == result )    {        return AOS_SUCC;    }        switch( result )    {        case SYS_OBJ_INVALID:            result = SEM_INVALID_SEM_ID;            break;        case SYS_OBJ_UNAVAILABLE:            result = SEM_UNAVAILABLE;            break;        case SYS_WAIT_TIMEOUT:            result = SEM_TIMEOUT;            break;        case SYS_CALL_FAIL:            result = SEM_SYS_CALL_FAIL;            break;        default:            AOS_ASSERT(0);            break;    }     lockKey = aos_int_lock();     pSem->value++;     aos_int_unlock(lockKey);            return result;}U32 aos_sem_trywait( U32 ulSemId ){    U32 lockKey, result;    SEM_S *pSem;    lockKey = aos_int_lock();    if( (ulSemId >= CONFIG_SEM_NUM) ||    	(SEM_CB_USED != g_pstSem[ulSemId].status) )    {        aos_int_unlock(lockKey);        return SEM_INVALID_SEM_ID;    }    pSem = &g_pstSem[ulSemId];    pSem->value--;        aos_int_unlock(lockKey);    result = sys_sem_trywait( &pSem->sys_sem );    if( AOS_SUCC == result )    {        return AOS_SUCC;    }        switch( result )    {        case SYS_OBJ_INVALID:            result = SEM_INVALID_SEM_ID;            break;        case SYS_OBJ_UNAVAILABLE:            result = SEM_UNAVAILABLE;            break;        case SYS_WAIT_TIMEOUT:            result = SEM_TIMEOUT;            break;        case SYS_CALL_FAIL:            result = SEM_SYS_CALL_FAIL;            break;        default:            AOS_ASSERT(0);            break;    }     lockKey = aos_int_lock();     pSem->value++;     aos_int_unlock(lockKey);            return result;}U32 aos_sem_post( U32 ulSemId ){    U32 lockKey, result;    SEM_S *pSem;    lockKey = aos_int_lock();    if( (ulSemId >= CONFIG_SEM_NUM) ||    	(SEM_CB_USED != g_pstSem[ulSemId].status) )    {        aos_int_unlock(lockKey);        return SEM_INVALID_SEM_ID;    }    pSem = &g_pstSem[ulSemId];    pSem->value++;        aos_int_unlock(lockKey);    result = sys_sem_post( &pSem->sys_sem );    if( AOS_SUCC == result )    {        return AOS_SUCC;    }        switch( result )    {        case SYS_OBJ_INVALID:            result = SEM_INVALID_SEM_ID;            break;        case SYS_OBJ_UNAVAILABLE:            result = SEM_UNAVAILABLE;            break;        case SYS_WAIT_TIMEOUT:            result = SEM_TIMEOUT;            break;        case SYS_CALL_FAIL:            result = SEM_SYS_CALL_FAIL;            break;        default:            AOS_ASSERT(0);            break;    }     lockKey = aos_int_lock();     pSem->value--;     aos_int_unlock(lockKey);            return result;}#ifdef __cplusplus}#endif 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -