OS_SEM_CTR OSSemPost (OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err) { OS_SEM_CTR ctr; CPU_TS ts; #ifdef OS_SAFETY_CRITICAL if (p_err == (OS_ERR *)0) { #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif OS_SAFETY_CRITICAL_EXCEPTION(); return ((OS_SEM_CTR)0); } #endif #if OS_CFG_ARG_CHK_EN > 0u if (p_sem == (OS_SEM *)0) { /* Validate 'p_sem' */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_PTR_NULL; return ((OS_SEM_CTR)0); } switch (opt) { /* Validate 'opt' */ case OS_OPT_POST_1: case OS_OPT_POST_ALL: case OS_OPT_POST_1 | OS_OPT_POST_NO_SCHED: case OS_OPT_POST_ALL | OS_OPT_POST_NO_SCHED: break; default: #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OPT_INVALID; return ((OS_SEM_CTR)0u); } #endif #if OS_CFG_OBJ_TYPE_CHK_EN > 0u if (p_sem->Type != OS_OBJ_TYPE_SEM) { /* Make sure semaphore was created */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_TYPE; return ((OS_SEM_CTR)0); } #endif ts = OS_TS_GET(); /* Get timestamp */ #if OS_CFG_ISR_POST_DEFERRED_EN > 0u if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* See if called from an ISR */ OS_IntQPost((OS_OBJ_TYPE)OS_OBJ_TYPE_SEM, /* Post to ISR queue */ (void *)p_sem, (void *)0, (OS_MSG_SIZE)0, (OS_FLAGS )0, (OS_OPT )opt, (CPU_TS )ts, (OS_ERR *)p_err); return ((OS_SEM_CTR)0); } #endif #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_SEM_POST(p_sem); /* Record the event. */ #endif ctr = OS_SemPost(p_sem, /* Post to semaphore */ opt, ts, p_err); return (ctr); }
OS_SEM_CTR OSSemPost (OS_SEM *p_sem, OS_OPT opt, OS_ERR *p_err) { OS_SEM_CTR ctr; CPU_TS ts; #ifdef OS_SAFETY_CRITICAL if (p_err == DEF_NULL) { OS_SAFETY_CRITICAL_EXCEPTION(); return (0u); } #endif #if (OS_CFG_INVALID_OS_CALLS_CHK_EN == DEF_ENABLED) /* Is the kernel running? */ if (OSRunning != OS_STATE_OS_RUNNING) { *p_err = OS_ERR_OS_NOT_RUNNING; return (0u); } #endif #if (OS_CFG_ARG_CHK_EN == DEF_ENABLED) if (p_sem == DEF_NULL) { /* Validate 'p_sem' */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN == DEF_ENABLED)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_PTR_NULL; return (0u); } switch (opt) { /* Validate 'opt' */ case OS_OPT_POST_1: case OS_OPT_POST_ALL: case OS_OPT_POST_1 | OS_OPT_POST_NO_SCHED: case OS_OPT_POST_ALL | OS_OPT_POST_NO_SCHED: break; default: #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN == DEF_ENABLED)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OPT_INVALID; return (0u); } #endif #if (OS_CFG_OBJ_TYPE_CHK_EN == DEF_ENABLED) if (p_sem->Type != OS_OBJ_TYPE_SEM) { /* Make sure semaphore was created */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN == DEF_ENABLED)) TRACE_OS_SEM_POST_FAILED(p_sem); /* Record the event. */ #endif *p_err = OS_ERR_OBJ_TYPE; return (0u); } #endif #if (OS_CFG_TS_EN == DEF_ENABLED) ts = OS_TS_GET(); /* Get timestamp */ #else ts = 0u; #endif #if (OS_CFG_ISR_POST_DEFERRED_EN == DEF_ENABLED) if (OSIntNestingCtr > 0u) { /* See if called from an ISR */ OS_IntQPost(OS_OBJ_TYPE_SEM, /* Post to ISR queue */ (void *)p_sem, DEF_NULL, 0u, 0u, opt, ts, p_err); return (0u); } #endif #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN == DEF_ENABLED)) TRACE_OS_SEM_POST(p_sem); /* Record the event. */ #endif ctr = OS_SemPost(p_sem, /* Post to semaphore */ opt, ts, p_err); return (ctr); }