📄 ssp_sem.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 + -