diff --git a/kal/cmsis/cmsis_liteos2.c b/kal/cmsis/cmsis_liteos2.c index 19f11903b10527ae1444f2c4ad8cff5a5d70fb72..afe7a8b1535460c9cc2a32c657f0bb48e58cf5ab 100644 --- a/kal/cmsis/cmsis_liteos2.c +++ b/kal/cmsis/cmsis_liteos2.c @@ -1087,8 +1087,9 @@ osStatus_t osMutexDelete(osMutexId_t mutex_id) osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) { - UINT32 uwRet; + UINT32 uwRet = LOS_NOK; UINT32 uwSemId; + UINT32 intSave; UNUSED(attr); @@ -1096,14 +1097,16 @@ osSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const return (osSemaphoreId_t)NULL; } - if (1 == max_count) { - uwRet = LOS_BinarySemCreate((UINT16)initial_count, &uwSemId); - } else { + if (max_count > 0 && max_count <= OS_SEM_COUNTING_MAX_COUNT) { uwRet = LOS_SemCreate((UINT16)initial_count, &uwSemId); } if (uwRet == LOS_OK) { - return (osSemaphoreId_t)(GET_SEM(uwSemId)); + osSemaphoreId_t semaphore_id = (osSemaphoreId_t)(GET_SEM(uwSemId)); + intSave = LOS_IntLock(); + ((LosSemCB *)semaphore_id)->maxSemCount = max_count; + LOS_IntRestore(intSave); + return semaphore_id; } else { return (osSemaphoreId_t)NULL; }