void OSSemCreate (OS_SEM *p_sem, CPU_CHAR *p_name, OS_SEM_CTR cnt, OS_ERR *p_err) { CPU_SR_ALLOC(); #ifdef OS_SAFETY_CRITICAL if (p_err == (OS_ERR *)0) { OS_SAFETY_CRITICAL_EXCEPTION(); return; } #endif #ifdef OS_SAFETY_CRITICAL_IEC61508 if (OSSafetyCriticalStartFlag == DEF_TRUE) { *p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME; return; } #endif #if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0u if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* Not allowed to be called from an ISR */ *p_err = OS_ERR_CREATE_ISR; return; } #endif #if OS_CFG_ARG_CHK_EN > 0u if (p_sem == (OS_SEM *)0) { /* Validate 'p_sem' */ *p_err = OS_ERR_OBJ_PTR_NULL; return; } #endif OS_CRITICAL_ENTER(); p_sem->Type = OS_OBJ_TYPE_SEM; /* Mark the data structure as a semaphore */ p_sem->Ctr = cnt; /* Set semaphore value */ p_sem->TS = (CPU_TS)0; p_sem->NamePtr = p_name; /* Save the name of the semaphore */ OS_PendListInit(&p_sem->PendList); /* Initialize the waiting list */ #if OS_CFG_DBG_EN > 0u OS_SemDbgListAdd(p_sem); #endif OSSemQty++; OS_CRITICAL_EXIT_NO_SCHED(); *p_err = OS_ERR_NONE; }
void OSSemCreate (OS_SEM *p_sem, CPU_CHAR *p_name, OS_SEM_CTR cnt, OS_ERR *p_err) { CPU_SR_ALLOC(); #ifdef OS_SAFETY_CRITICAL if (p_err == DEF_NULL) { OS_SAFETY_CRITICAL_EXCEPTION(); return; } #endif #ifdef OS_SAFETY_CRITICAL_IEC61508 if (OSSafetyCriticalStartFlag == DEF_TRUE) { *p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME; return; } #endif #if (OS_CFG_CALLED_FROM_ISR_CHK_EN == DEF_ENABLED) if (OSIntNestingCtr > 0u) { /* Not allowed to be called from an ISR */ *p_err = OS_ERR_CREATE_ISR; return; } #endif #if (OS_CFG_ARG_CHK_EN == DEF_ENABLED) if (p_sem == DEF_NULL) { /* Validate 'p_sem' */ *p_err = OS_ERR_OBJ_PTR_NULL; return; } #endif OS_CRITICAL_ENTER(); #if (OS_OBJ_TYPE_REQ == DEF_ENABLED) p_sem->Type = OS_OBJ_TYPE_SEM; /* Mark the data structure as a semaphore */ #endif p_sem->Ctr = cnt; /* Set semaphore value */ #if (OS_CFG_TS_EN == DEF_ENABLED) p_sem->TS = 0u; #endif #if (OS_CFG_DBG_EN == DEF_ENABLED) p_sem->NamePtr = p_name; /* Save the name of the semaphore */ #else (void)&p_name; #endif OS_PendListInit(&p_sem->PendList); /* Initialize the waiting list */ #if (OS_CFG_DBG_EN == DEF_ENABLED) OS_SemDbgListAdd(p_sem); OSSemQty++; #endif #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN == DEF_ENABLED)) TRACE_OS_SEM_CREATE(p_sem, p_name); /* Record the event. */ #endif OS_CRITICAL_EXIT_NO_SCHED(); *p_err = OS_ERR_NONE; }