ucos-iiv2.52毕竟是老版本,现在ucosiii都已经出来很久了,而且马上就可以免费使用了,除了ucgui,因为ucgui是segger的,因此有必要分析一下。源码参考V3.03.00的版本。
解压出来后,是这个结构\Micrium\Software\uCOS-III,
信号量创建函数如下:
/* ************************************************************************************************************************ * CREATE A SEMAPHORE * * Description: This function creates a semaphore. * * Arguments : p_sem is a pointer to the semaphore to initialize. Your application is responsible for * allocating storage for the semaphore. * * p_name is a pointer to the name you would like to give the semaphore. * * cnt is the initial value for the semaphore. * If used to share resources, you should initialize to the number of resources available. * If used to signal the occurrence of event(s) then you should initialize to 0. * * p_err is a pointer to a variable that will contain an error code returned by this function. * * OS_ERR_NONE if the call was successful * OS_ERR_CREATE_ISR if you called this function from an ISR * OS_ERR_ILLEGAL_CREATE_RUN_TIME if you are trying to create the semaphore after you * called OSSafetyCriticalStart(). * OS_ERR_NAME if 'p_name' is a NULL pointer * OS_ERR_OBJ_CREATED if the semaphore has already been created * OS_ERR_OBJ_PTR_NULL if 'p_sem' is a NULL pointer * OS_ERR_OBJ_TYPE if 'p_sem' has already been initialized to a different * object type * * Returns : 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 == (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; }