11bd4fe43Sopenharmony_ci/* 21bd4fe43Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 31bd4fe43Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 41bd4fe43Sopenharmony_ci * 51bd4fe43Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification, 61bd4fe43Sopenharmony_ci * are permitted provided that the following conditions are met: 71bd4fe43Sopenharmony_ci * 81bd4fe43Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of 91bd4fe43Sopenharmony_ci * conditions and the following disclaimer. 101bd4fe43Sopenharmony_ci * 111bd4fe43Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list 121bd4fe43Sopenharmony_ci * of conditions and the following disclaimer in the documentation and/or other materials 131bd4fe43Sopenharmony_ci * provided with the distribution. 141bd4fe43Sopenharmony_ci * 151bd4fe43Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used 161bd4fe43Sopenharmony_ci * to endorse or promote products derived from this software without specific prior written 171bd4fe43Sopenharmony_ci * permission. 181bd4fe43Sopenharmony_ci * 191bd4fe43Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 201bd4fe43Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 211bd4fe43Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 221bd4fe43Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 231bd4fe43Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 241bd4fe43Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 251bd4fe43Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 261bd4fe43Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 271bd4fe43Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 281bd4fe43Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 291bd4fe43Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 301bd4fe43Sopenharmony_ci */ 311bd4fe43Sopenharmony_ci 321bd4fe43Sopenharmony_ci#include "cmsis_os.h" 331bd4fe43Sopenharmony_ci#include "los_typedef.h" 341bd4fe43Sopenharmony_ci#include "los_printf.h" 351bd4fe43Sopenharmony_ci 361bd4fe43Sopenharmony_ci#include "los_event.h" 371bd4fe43Sopenharmony_ci#include "los_membox.h" 381bd4fe43Sopenharmony_ci#include "los_memory.h" 391bd4fe43Sopenharmony_ci#include "los_hwi.h" 401bd4fe43Sopenharmony_ci 411bd4fe43Sopenharmony_ci#include "los_mux_pri.h" 421bd4fe43Sopenharmony_ci#include "los_queue_pri.h" 431bd4fe43Sopenharmony_ci#include "los_sem_pri.h" 441bd4fe43Sopenharmony_ci#include "los_swtmr_pri.h" 451bd4fe43Sopenharmony_ci#include "los_sys_pri.h" 461bd4fe43Sopenharmony_ci#include "los_task_pri.h" 471bd4fe43Sopenharmony_ci#include "los_tick_pri.h" 481bd4fe43Sopenharmony_ci#include "string.h" 491bd4fe43Sopenharmony_ci#include "securec.h" 501bd4fe43Sopenharmony_ci 511bd4fe43Sopenharmony_ci#ifdef __cplusplus 521bd4fe43Sopenharmony_ci#if __cplusplus 531bd4fe43Sopenharmony_ciextern "C" { 541bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 551bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 561bd4fe43Sopenharmony_ci#if (CMSIS_OS_VER == 2) 571bd4fe43Sopenharmony_ci 581bd4fe43Sopenharmony_ci/* Kernel initialization state */ 591bd4fe43Sopenharmony_cistatic osKernelState_t g_kernelState; 601bd4fe43Sopenharmony_ci 611bd4fe43Sopenharmony_ciextern BOOL g_taskScheduled; 621bd4fe43Sopenharmony_ci 631bd4fe43Sopenharmony_ci#define LOS_PRIORITY_WIN 8 641bd4fe43Sopenharmony_ci 651bd4fe43Sopenharmony_ciconst osVersion_t g_stLosVersion = { 001, 001 }; 661bd4fe43Sopenharmony_ci 671bd4fe43Sopenharmony_ci#define LITEOS_VERSION_MAJOR 1 681bd4fe43Sopenharmony_ci#define LITEOS_VERSION_MINOR 0 691bd4fe43Sopenharmony_ci#define LITEOS_VERSION_BUILD 0 701bd4fe43Sopenharmony_ci 711bd4fe43Sopenharmony_ci/* Kernel version and identification string definition */ 721bd4fe43Sopenharmony_ci#define KERNEL_VERSION (((UINT32)LITEOS_VERSION_MAJOR * 10000000UL) | \ 731bd4fe43Sopenharmony_ci ((UINT32)LITEOS_VERSION_MINOR * 10000UL) | \ 741bd4fe43Sopenharmony_ci ((UINT32)LITEOS_VERSION_BUILD * 1UL)) 751bd4fe43Sopenharmony_ci 761bd4fe43Sopenharmony_ci#define KERNEL_ID "HUAWEI-LiteOS" 771bd4fe43Sopenharmony_ci#define UNUSED(var) do { (void)var; } while (0) 781bd4fe43Sopenharmony_ci 791bd4fe43Sopenharmony_ci// ==== Kernel Management Functions ==== 801bd4fe43Sopenharmony_ciuint32_t osTaskStackWaterMarkGet(UINT32 taskID); 811bd4fe43Sopenharmony_ci 821bd4fe43Sopenharmony_ci 831bd4fe43Sopenharmony_ciosStatus_t osKernelInitialize(void) 841bd4fe43Sopenharmony_ci{ 851bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 861bd4fe43Sopenharmony_ci return osErrorISR; 871bd4fe43Sopenharmony_ci } 881bd4fe43Sopenharmony_ci 891bd4fe43Sopenharmony_ci if (g_kernelState != osKernelInactive) { 901bd4fe43Sopenharmony_ci return osError; 911bd4fe43Sopenharmony_ci } 921bd4fe43Sopenharmony_ci 931bd4fe43Sopenharmony_ci if (LOS_OK == LOS_KernelInit()) { 941bd4fe43Sopenharmony_ci g_kernelState = osKernelReady; 951bd4fe43Sopenharmony_ci return osOK; 961bd4fe43Sopenharmony_ci } else { 971bd4fe43Sopenharmony_ci return osError; 981bd4fe43Sopenharmony_ci } 991bd4fe43Sopenharmony_ci} 1001bd4fe43Sopenharmony_ci 1011bd4fe43Sopenharmony_ci 1021bd4fe43Sopenharmony_ciosStatus_t osKernelGetInfo(osVersion_t *version, char *id_buf, uint32_t id_size) 1031bd4fe43Sopenharmony_ci{ 1041bd4fe43Sopenharmony_ci uint32_t uwRet; 1051bd4fe43Sopenharmony_ci 1061bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 1071bd4fe43Sopenharmony_ci return osErrorISR; 1081bd4fe43Sopenharmony_ci } 1091bd4fe43Sopenharmony_ci 1101bd4fe43Sopenharmony_ci if (version != NULL) { 1111bd4fe43Sopenharmony_ci version->api = g_stLosVersion.api; 1121bd4fe43Sopenharmony_ci version->kernel = g_stLosVersion.kernel; 1131bd4fe43Sopenharmony_ci } 1141bd4fe43Sopenharmony_ci 1151bd4fe43Sopenharmony_ci if ((id_buf != NULL) && (id_size != 0U)) { 1161bd4fe43Sopenharmony_ci if (id_size > sizeof(KERNEL_ID)) { 1171bd4fe43Sopenharmony_ci id_size = sizeof(KERNEL_ID); 1181bd4fe43Sopenharmony_ci } 1191bd4fe43Sopenharmony_ci uwRet = memcpy_s(id_buf, id_size, KERNEL_ID, id_size); 1201bd4fe43Sopenharmony_ci if (uwRet != EOK) { 1211bd4fe43Sopenharmony_ci PRINT_ERR("%s[%d] memcpy failed, error type = %u\n", __FUNCTION__, __LINE__, uwRet); 1221bd4fe43Sopenharmony_ci return osError; 1231bd4fe43Sopenharmony_ci } 1241bd4fe43Sopenharmony_ci } 1251bd4fe43Sopenharmony_ci 1261bd4fe43Sopenharmony_ci return osOK; 1271bd4fe43Sopenharmony_ci} 1281bd4fe43Sopenharmony_ci 1291bd4fe43Sopenharmony_ci 1301bd4fe43Sopenharmony_ciosKernelState_t osKernelGetState(void) 1311bd4fe43Sopenharmony_ci{ 1321bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 1331bd4fe43Sopenharmony_ci return osKernelError; 1341bd4fe43Sopenharmony_ci } 1351bd4fe43Sopenharmony_ci 1361bd4fe43Sopenharmony_ci if (!g_taskScheduled) { 1371bd4fe43Sopenharmony_ci if (g_kernelState == osKernelReady) { 1381bd4fe43Sopenharmony_ci return osKernelReady; 1391bd4fe43Sopenharmony_ci } else { 1401bd4fe43Sopenharmony_ci return osKernelInactive; 1411bd4fe43Sopenharmony_ci } 1421bd4fe43Sopenharmony_ci } else if (g_losTaskLock > 0) { 1431bd4fe43Sopenharmony_ci return osKernelLocked; 1441bd4fe43Sopenharmony_ci } else { 1451bd4fe43Sopenharmony_ci return osKernelRunning; 1461bd4fe43Sopenharmony_ci } 1471bd4fe43Sopenharmony_ci} 1481bd4fe43Sopenharmony_ci 1491bd4fe43Sopenharmony_ci 1501bd4fe43Sopenharmony_ciosStatus_t osKernelStart(void) 1511bd4fe43Sopenharmony_ci{ 1521bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 1531bd4fe43Sopenharmony_ci return osErrorISR; 1541bd4fe43Sopenharmony_ci } 1551bd4fe43Sopenharmony_ci 1561bd4fe43Sopenharmony_ci if (g_kernelState == osKernelReady) { 1571bd4fe43Sopenharmony_ci if (LOS_OK == LOS_Start()) { 1581bd4fe43Sopenharmony_ci g_kernelState = osKernelRunning; 1591bd4fe43Sopenharmony_ci return osOK; 1601bd4fe43Sopenharmony_ci } else { 1611bd4fe43Sopenharmony_ci return osError; 1621bd4fe43Sopenharmony_ci } 1631bd4fe43Sopenharmony_ci } else { 1641bd4fe43Sopenharmony_ci return osError; 1651bd4fe43Sopenharmony_ci } 1661bd4fe43Sopenharmony_ci} 1671bd4fe43Sopenharmony_ci 1681bd4fe43Sopenharmony_ci 1691bd4fe43Sopenharmony_ciint32_t osKernelLock(void) 1701bd4fe43Sopenharmony_ci{ 1711bd4fe43Sopenharmony_ci int32_t lock; 1721bd4fe43Sopenharmony_ci 1731bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 1741bd4fe43Sopenharmony_ci return (int32_t)osErrorISR; 1751bd4fe43Sopenharmony_ci } 1761bd4fe43Sopenharmony_ci 1771bd4fe43Sopenharmony_ci if (!g_taskScheduled) { 1781bd4fe43Sopenharmony_ci return (int32_t)osError; 1791bd4fe43Sopenharmony_ci } 1801bd4fe43Sopenharmony_ci 1811bd4fe43Sopenharmony_ci if (g_losTaskLock > 0) { 1821bd4fe43Sopenharmony_ci lock = 1; 1831bd4fe43Sopenharmony_ci } else { 1841bd4fe43Sopenharmony_ci LOS_TaskLock(); 1851bd4fe43Sopenharmony_ci lock = 0; 1861bd4fe43Sopenharmony_ci } 1871bd4fe43Sopenharmony_ci 1881bd4fe43Sopenharmony_ci return lock; 1891bd4fe43Sopenharmony_ci} 1901bd4fe43Sopenharmony_ci 1911bd4fe43Sopenharmony_ci 1921bd4fe43Sopenharmony_ciint32_t osKernelUnlock(void) 1931bd4fe43Sopenharmony_ci{ 1941bd4fe43Sopenharmony_ci int32_t lock; 1951bd4fe43Sopenharmony_ci 1961bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 1971bd4fe43Sopenharmony_ci return (int32_t)osErrorISR; 1981bd4fe43Sopenharmony_ci } 1991bd4fe43Sopenharmony_ci 2001bd4fe43Sopenharmony_ci if (!g_taskScheduled) { 2011bd4fe43Sopenharmony_ci return (int32_t)osError; 2021bd4fe43Sopenharmony_ci } 2031bd4fe43Sopenharmony_ci 2041bd4fe43Sopenharmony_ci if (g_losTaskLock > 0) { 2051bd4fe43Sopenharmony_ci LOS_TaskUnlock(); 2061bd4fe43Sopenharmony_ci if (g_losTaskLock != 0) { 2071bd4fe43Sopenharmony_ci return (int32_t)osError; 2081bd4fe43Sopenharmony_ci } 2091bd4fe43Sopenharmony_ci lock = 1; 2101bd4fe43Sopenharmony_ci } else { 2111bd4fe43Sopenharmony_ci lock = 0; 2121bd4fe43Sopenharmony_ci } 2131bd4fe43Sopenharmony_ci 2141bd4fe43Sopenharmony_ci return lock; 2151bd4fe43Sopenharmony_ci} 2161bd4fe43Sopenharmony_ci 2171bd4fe43Sopenharmony_ci 2181bd4fe43Sopenharmony_ciint32_t osKernelRestoreLock(int32_t lock) 2191bd4fe43Sopenharmony_ci{ 2201bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 2211bd4fe43Sopenharmony_ci return (int32_t)osErrorISR; 2221bd4fe43Sopenharmony_ci } 2231bd4fe43Sopenharmony_ci 2241bd4fe43Sopenharmony_ci if (!g_taskScheduled) { 2251bd4fe43Sopenharmony_ci return (int32_t)osError; 2261bd4fe43Sopenharmony_ci } 2271bd4fe43Sopenharmony_ci 2281bd4fe43Sopenharmony_ci switch (lock) { 2291bd4fe43Sopenharmony_ci case 0: 2301bd4fe43Sopenharmony_ci LOS_TaskUnlock(); 2311bd4fe43Sopenharmony_ci if (g_losTaskLock != 0) { 2321bd4fe43Sopenharmony_ci break; 2331bd4fe43Sopenharmony_ci } 2341bd4fe43Sopenharmony_ci return 0; 2351bd4fe43Sopenharmony_ci case 1: 2361bd4fe43Sopenharmony_ci LOS_TaskLock(); 2371bd4fe43Sopenharmony_ci return 1; 2381bd4fe43Sopenharmony_ci default: 2391bd4fe43Sopenharmony_ci break; 2401bd4fe43Sopenharmony_ci } 2411bd4fe43Sopenharmony_ci 2421bd4fe43Sopenharmony_ci return (int32_t)osError; 2431bd4fe43Sopenharmony_ci} 2441bd4fe43Sopenharmony_ci 2451bd4fe43Sopenharmony_ci 2461bd4fe43Sopenharmony_ciuint32_t osKernelGetTickCount(void) 2471bd4fe43Sopenharmony_ci{ 2481bd4fe43Sopenharmony_ci uint64_t ticks; 2491bd4fe43Sopenharmony_ci UINTPTR uvIntSave; 2501bd4fe43Sopenharmony_ci 2511bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 2521bd4fe43Sopenharmony_ci#ifndef LITEOS_WIFI_IOT_VERSION 2531bd4fe43Sopenharmony_ci ticks = g_ullTickCount; 2541bd4fe43Sopenharmony_ci#else 2551bd4fe43Sopenharmony_ci ticks = g_tickCount; 2561bd4fe43Sopenharmony_ci#endif 2571bd4fe43Sopenharmony_ci } else { 2581bd4fe43Sopenharmony_ci uvIntSave = LOS_IntLock(); 2591bd4fe43Sopenharmony_ci#ifndef LITEOS_WIFI_IOT_VERSION 2601bd4fe43Sopenharmony_ci ticks = g_ullTickCount; 2611bd4fe43Sopenharmony_ci#else 2621bd4fe43Sopenharmony_ci ticks = g_tickCount; 2631bd4fe43Sopenharmony_ci#endif 2641bd4fe43Sopenharmony_ci LOS_IntRestore(uvIntSave); 2651bd4fe43Sopenharmony_ci } 2661bd4fe43Sopenharmony_ci 2671bd4fe43Sopenharmony_ci return (uint32_t)ticks; 2681bd4fe43Sopenharmony_ci} 2691bd4fe43Sopenharmony_ci 2701bd4fe43Sopenharmony_ciuint32_t osKernelGetTickFreq(void) 2711bd4fe43Sopenharmony_ci{ 2721bd4fe43Sopenharmony_ci uint32_t freq; 2731bd4fe43Sopenharmony_ci 2741bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 2751bd4fe43Sopenharmony_ci freq = 0U; 2761bd4fe43Sopenharmony_ci } else { 2771bd4fe43Sopenharmony_ci freq = LOSCFG_BASE_CORE_TICK_PER_SECOND; 2781bd4fe43Sopenharmony_ci } 2791bd4fe43Sopenharmony_ci 2801bd4fe43Sopenharmony_ci return (freq); 2811bd4fe43Sopenharmony_ci} 2821bd4fe43Sopenharmony_ci 2831bd4fe43Sopenharmony_ciextern VOID LOS_GetCpuCycle(UINT32 *puwCntHi, UINT32 *puwCntLo); 2841bd4fe43Sopenharmony_ciuint32_t osKernelGetSysTimerCount(void) 2851bd4fe43Sopenharmony_ci{ 2861bd4fe43Sopenharmony_ci uint32_t countHigh = 0; 2871bd4fe43Sopenharmony_ci uint32_t countLow = 0; 2881bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 2891bd4fe43Sopenharmony_ci countLow = 0U; 2901bd4fe43Sopenharmony_ci } else { 2911bd4fe43Sopenharmony_ci LOS_GetCpuCycle((UINT32 *)&countHigh, (UINT32 *)&countLow); 2921bd4fe43Sopenharmony_ci } 2931bd4fe43Sopenharmony_ci return countLow; 2941bd4fe43Sopenharmony_ci} 2951bd4fe43Sopenharmony_ci 2961bd4fe43Sopenharmony_ci 2971bd4fe43Sopenharmony_ciuint32_t osKernelGetSysTimerFreq(void) 2981bd4fe43Sopenharmony_ci{ 2991bd4fe43Sopenharmony_ci return OS_SYS_CLOCK; 3001bd4fe43Sopenharmony_ci} 3011bd4fe43Sopenharmony_ci 3021bd4fe43Sopenharmony_ci 3031bd4fe43Sopenharmony_ci// ==== Thread Management Functions ==== 3041bd4fe43Sopenharmony_ci 3051bd4fe43Sopenharmony_ciosThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr) 3061bd4fe43Sopenharmony_ci{ 3071bd4fe43Sopenharmony_ci UINT32 uwTid; 3081bd4fe43Sopenharmony_ci UINT32 uwRet; 3091bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 3101bd4fe43Sopenharmony_ci TSK_INIT_PARAM_S stTskInitParam; 3111bd4fe43Sopenharmony_ci 3121bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 3131bd4fe43Sopenharmony_ci return NULL; 3141bd4fe43Sopenharmony_ci } 3151bd4fe43Sopenharmony_ci 3161bd4fe43Sopenharmony_ci if ((attr == NULL) || (func == NULL) || (attr->priority < osPriorityLow1) || 3171bd4fe43Sopenharmony_ci (attr->priority > osPriorityAboveNormal6)) { 3181bd4fe43Sopenharmony_ci return (osThreadId_t)NULL; 3191bd4fe43Sopenharmony_ci } 3201bd4fe43Sopenharmony_ci 3211bd4fe43Sopenharmony_ci (void)memset_s(&stTskInitParam, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S)); 3221bd4fe43Sopenharmony_ci stTskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)func; 3231bd4fe43Sopenharmony_ci#ifndef LITEOS_WIFI_IOT_VERSION 3241bd4fe43Sopenharmony_ci stTskInitParam.uwArg = (UINT32)argument; 3251bd4fe43Sopenharmony_ci#else 3261bd4fe43Sopenharmony_ci stTskInitParam.auwArgs[0] = (UINT32)argument; 3271bd4fe43Sopenharmony_ci#endif 3281bd4fe43Sopenharmony_ci stTskInitParam.uwStackSize = attr->stack_size; 3291bd4fe43Sopenharmony_ci stTskInitParam.pcName = (CHAR *)attr->name; 3301bd4fe43Sopenharmony_ci stTskInitParam.usTaskPrio = OS_TASK_PRIORITY_LOWEST - ((UINT16)(attr->priority) - LOS_PRIORITY_WIN); /* 0~31 */ 3311bd4fe43Sopenharmony_ci 3321bd4fe43Sopenharmony_ci uwRet = LOS_TaskCreate(&uwTid, &stTskInitParam); 3331bd4fe43Sopenharmony_ci 3341bd4fe43Sopenharmony_ci if (LOS_OK != uwRet) { 3351bd4fe43Sopenharmony_ci return (osThreadId_t)NULL; 3361bd4fe43Sopenharmony_ci } 3371bd4fe43Sopenharmony_ci 3381bd4fe43Sopenharmony_ci pstTaskCB = OS_TCB_FROM_TID(uwTid); 3391bd4fe43Sopenharmony_ci 3401bd4fe43Sopenharmony_ci return (osThreadId_t)pstTaskCB; 3411bd4fe43Sopenharmony_ci} 3421bd4fe43Sopenharmony_ci 3431bd4fe43Sopenharmony_ci 3441bd4fe43Sopenharmony_ciconst char *osThreadGetName(osThreadId_t thread_id) 3451bd4fe43Sopenharmony_ci{ 3461bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 3471bd4fe43Sopenharmony_ci 3481bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE || thread_id == NULL) { 3491bd4fe43Sopenharmony_ci return NULL; 3501bd4fe43Sopenharmony_ci } 3511bd4fe43Sopenharmony_ci 3521bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 3531bd4fe43Sopenharmony_ci 3541bd4fe43Sopenharmony_ci return pstTaskCB->taskName; 3551bd4fe43Sopenharmony_ci} 3561bd4fe43Sopenharmony_ci 3571bd4fe43Sopenharmony_ci 3581bd4fe43Sopenharmony_ciosThreadId_t osThreadGetId(void) 3591bd4fe43Sopenharmony_ci{ 3601bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 3611bd4fe43Sopenharmony_ci return NULL; 3621bd4fe43Sopenharmony_ci } 3631bd4fe43Sopenharmony_ci 3641bd4fe43Sopenharmony_ci return (osThreadId_t)(g_losTask.runTask); 3651bd4fe43Sopenharmony_ci} 3661bd4fe43Sopenharmony_ci 3671bd4fe43Sopenharmony_civoid *osThreadGetArgument(void) 3681bd4fe43Sopenharmony_ci{ 3691bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 3701bd4fe43Sopenharmony_ci return 0; 3711bd4fe43Sopenharmony_ci } 3721bd4fe43Sopenharmony_ci 3731bd4fe43Sopenharmony_ci LosTaskCB *taskCb = (LosTaskCB *)osThreadGetId(); 3741bd4fe43Sopenharmony_ci if (taskCb == NULL) { 3751bd4fe43Sopenharmony_ci return NULL; 3761bd4fe43Sopenharmony_ci } 3771bd4fe43Sopenharmony_ci#ifndef LITEOS_WIFI_IOT_VERSION 3781bd4fe43Sopenharmony_ci return (void *)(taskCb->arg); 3791bd4fe43Sopenharmony_ci#else 3801bd4fe43Sopenharmony_ci return (void *)(taskCb->args[0]); 3811bd4fe43Sopenharmony_ci#endif 3821bd4fe43Sopenharmony_ci} 3831bd4fe43Sopenharmony_ci 3841bd4fe43Sopenharmony_ciosThreadState_t osThreadGetState(osThreadId_t thread_id) 3851bd4fe43Sopenharmony_ci{ 3861bd4fe43Sopenharmony_ci UINT16 taskStatus; 3871bd4fe43Sopenharmony_ci osThreadState_t stState; 3881bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 3891bd4fe43Sopenharmony_ci 3901bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE || thread_id == NULL) { 3911bd4fe43Sopenharmony_ci return osThreadError; 3921bd4fe43Sopenharmony_ci } 3931bd4fe43Sopenharmony_ci 3941bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 3951bd4fe43Sopenharmony_ci taskStatus = pstTaskCB->taskStatus; 3961bd4fe43Sopenharmony_ci 3971bd4fe43Sopenharmony_ci if (taskStatus & OS_TASK_STATUS_RUNNING) { 3981bd4fe43Sopenharmony_ci stState = osThreadRunning; 3991bd4fe43Sopenharmony_ci } else if (taskStatus & OS_TASK_STATUS_READY) { 4001bd4fe43Sopenharmony_ci stState = osThreadReady; 4011bd4fe43Sopenharmony_ci } else if (taskStatus & 4021bd4fe43Sopenharmony_ci (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND | OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_PEND_QUEUE)) { 4031bd4fe43Sopenharmony_ci stState = osThreadBlocked; 4041bd4fe43Sopenharmony_ci } else if (taskStatus & OS_TASK_STATUS_UNUSED) { 4051bd4fe43Sopenharmony_ci stState = osThreadInactive; 4061bd4fe43Sopenharmony_ci } else { 4071bd4fe43Sopenharmony_ci stState = osThreadError; 4081bd4fe43Sopenharmony_ci } 4091bd4fe43Sopenharmony_ci 4101bd4fe43Sopenharmony_ci return stState; 4111bd4fe43Sopenharmony_ci} 4121bd4fe43Sopenharmony_ci 4131bd4fe43Sopenharmony_ci 4141bd4fe43Sopenharmony_ciuint32_t osThreadGetStackSize(osThreadId_t thread_id) 4151bd4fe43Sopenharmony_ci{ 4161bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 4171bd4fe43Sopenharmony_ci 4181bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE || thread_id == NULL) { 4191bd4fe43Sopenharmony_ci return 0U; 4201bd4fe43Sopenharmony_ci } 4211bd4fe43Sopenharmony_ci 4221bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 4231bd4fe43Sopenharmony_ci 4241bd4fe43Sopenharmony_ci return pstTaskCB->stackSize; 4251bd4fe43Sopenharmony_ci} 4261bd4fe43Sopenharmony_ci 4271bd4fe43Sopenharmony_ci 4281bd4fe43Sopenharmony_ciuint32_t osTaskStackWaterMarkGet(UINT32 taskID) 4291bd4fe43Sopenharmony_ci{ 4301bd4fe43Sopenharmony_ci UINT32 uwCount = 0; 4311bd4fe43Sopenharmony_ci UINT32 *ptopOfStack; 4321bd4fe43Sopenharmony_ci UINTPTR uvIntSave; 4331bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 4341bd4fe43Sopenharmony_ci 4351bd4fe43Sopenharmony_ci if (taskID > LOSCFG_BASE_CORE_TSK_LIMIT) { 4361bd4fe43Sopenharmony_ci return 0; 4371bd4fe43Sopenharmony_ci } 4381bd4fe43Sopenharmony_ci 4391bd4fe43Sopenharmony_ci uvIntSave = LOS_IntLock(); 4401bd4fe43Sopenharmony_ci 4411bd4fe43Sopenharmony_ci pstTaskCB = OS_TCB_FROM_TID(taskID); 4421bd4fe43Sopenharmony_ci if (OS_TASK_STATUS_UNUSED & (pstTaskCB->taskStatus)) { 4431bd4fe43Sopenharmony_ci LOS_IntRestore(uvIntSave); 4441bd4fe43Sopenharmony_ci return 0; 4451bd4fe43Sopenharmony_ci } 4461bd4fe43Sopenharmony_ci 4471bd4fe43Sopenharmony_ci // first 4 bytes is OS_TASK_MAGIC_WORD, skip 4481bd4fe43Sopenharmony_ci ptopOfStack = (UINT32 *)(UINTPTR)pstTaskCB->topOfStack + 1; 4491bd4fe43Sopenharmony_ci 4501bd4fe43Sopenharmony_ci while (*ptopOfStack == (UINT32)OS_TASK_STACK_INIT) { 4511bd4fe43Sopenharmony_ci ++ptopOfStack; 4521bd4fe43Sopenharmony_ci ++uwCount; 4531bd4fe43Sopenharmony_ci } 4541bd4fe43Sopenharmony_ci 4551bd4fe43Sopenharmony_ci uwCount *= sizeof(UINT32); 4561bd4fe43Sopenharmony_ci 4571bd4fe43Sopenharmony_ci LOS_IntRestore(uvIntSave); 4581bd4fe43Sopenharmony_ci return uwCount; 4591bd4fe43Sopenharmony_ci} 4601bd4fe43Sopenharmony_ci 4611bd4fe43Sopenharmony_ci 4621bd4fe43Sopenharmony_ciuint32_t osThreadGetStackSpace(osThreadId_t thread_id) 4631bd4fe43Sopenharmony_ci{ 4641bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 4651bd4fe43Sopenharmony_ci 4661bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE || thread_id == NULL) { 4671bd4fe43Sopenharmony_ci return 0U; 4681bd4fe43Sopenharmony_ci } 4691bd4fe43Sopenharmony_ci 4701bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 4711bd4fe43Sopenharmony_ci 4721bd4fe43Sopenharmony_ci return osTaskStackWaterMarkGet(pstTaskCB->taskID); 4731bd4fe43Sopenharmony_ci} 4741bd4fe43Sopenharmony_ci 4751bd4fe43Sopenharmony_ci 4761bd4fe43Sopenharmony_ciosStatus_t osThreadSetPriority(osThreadId_t thread_id, osPriority_t priority) 4771bd4fe43Sopenharmony_ci{ 4781bd4fe43Sopenharmony_ci UINT32 uwRet; 4791bd4fe43Sopenharmony_ci UINT16 usPriority; 4801bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 4811bd4fe43Sopenharmony_ci 4821bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 4831bd4fe43Sopenharmony_ci return osErrorISR; 4841bd4fe43Sopenharmony_ci } 4851bd4fe43Sopenharmony_ci 4861bd4fe43Sopenharmony_ci if (thread_id == NULL) { 4871bd4fe43Sopenharmony_ci return osErrorParameter; 4881bd4fe43Sopenharmony_ci } 4891bd4fe43Sopenharmony_ci 4901bd4fe43Sopenharmony_ci if (priority < osPriorityLow1 || priority > osPriorityAboveNormal6) { 4911bd4fe43Sopenharmony_ci return osErrorParameter; 4921bd4fe43Sopenharmony_ci } 4931bd4fe43Sopenharmony_ci 4941bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 4951bd4fe43Sopenharmony_ci usPriority = OS_TASK_PRIORITY_LOWEST - ((UINT16)priority - LOS_PRIORITY_WIN); 4961bd4fe43Sopenharmony_ci uwRet = LOS_TaskPriSet(pstTaskCB->taskID, usPriority); 4971bd4fe43Sopenharmony_ci switch (uwRet) { 4981bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_PRIOR_ERROR: 4991bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_OPERATE_IDLE: 5001bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_ID_INVALID: 5011bd4fe43Sopenharmony_ci return osErrorParameter; 5021bd4fe43Sopenharmony_ci 5031bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_NOT_CREATED: 5041bd4fe43Sopenharmony_ci return osErrorResource; 5051bd4fe43Sopenharmony_ci 5061bd4fe43Sopenharmony_ci default: 5071bd4fe43Sopenharmony_ci return osOK; 5081bd4fe43Sopenharmony_ci } 5091bd4fe43Sopenharmony_ci} 5101bd4fe43Sopenharmony_ci 5111bd4fe43Sopenharmony_ci 5121bd4fe43Sopenharmony_ciosPriority_t osThreadGetPriority(osThreadId_t thread_id) 5131bd4fe43Sopenharmony_ci{ 5141bd4fe43Sopenharmony_ci UINT16 usRet; 5151bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 5161bd4fe43Sopenharmony_ci 5171bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE || thread_id == NULL) { 5181bd4fe43Sopenharmony_ci return osPriorityError; 5191bd4fe43Sopenharmony_ci } 5201bd4fe43Sopenharmony_ci 5211bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 5221bd4fe43Sopenharmony_ci usRet = LOS_TaskPriGet(pstTaskCB->taskID); 5231bd4fe43Sopenharmony_ci 5241bd4fe43Sopenharmony_ci if (usRet == (UINT16)OS_INVALID) { 5251bd4fe43Sopenharmony_ci return osPriorityError; 5261bd4fe43Sopenharmony_ci } 5271bd4fe43Sopenharmony_ci 5281bd4fe43Sopenharmony_ci return (osPriority_t)(OS_TASK_PRIORITY_LOWEST - (usRet - LOS_PRIORITY_WIN)); 5291bd4fe43Sopenharmony_ci} 5301bd4fe43Sopenharmony_ci 5311bd4fe43Sopenharmony_ci 5321bd4fe43Sopenharmony_ciosStatus_t osThreadYield(void) 5331bd4fe43Sopenharmony_ci{ 5341bd4fe43Sopenharmony_ci UINT32 uwRet; 5351bd4fe43Sopenharmony_ci 5361bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 5371bd4fe43Sopenharmony_ci return osErrorISR; 5381bd4fe43Sopenharmony_ci } 5391bd4fe43Sopenharmony_ci 5401bd4fe43Sopenharmony_ci uwRet = LOS_TaskYield(); 5411bd4fe43Sopenharmony_ci 5421bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 5431bd4fe43Sopenharmony_ci return osOK; 5441bd4fe43Sopenharmony_ci } 5451bd4fe43Sopenharmony_ci 5461bd4fe43Sopenharmony_ci return osError; 5471bd4fe43Sopenharmony_ci} 5481bd4fe43Sopenharmony_ci 5491bd4fe43Sopenharmony_ci 5501bd4fe43Sopenharmony_ciosStatus_t osThreadSuspend(osThreadId_t thread_id) 5511bd4fe43Sopenharmony_ci{ 5521bd4fe43Sopenharmony_ci UINT32 uwRet; 5531bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 5541bd4fe43Sopenharmony_ci 5551bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 5561bd4fe43Sopenharmony_ci return osErrorISR; 5571bd4fe43Sopenharmony_ci } 5581bd4fe43Sopenharmony_ci 5591bd4fe43Sopenharmony_ci if (thread_id == NULL) { 5601bd4fe43Sopenharmony_ci return osErrorParameter; 5611bd4fe43Sopenharmony_ci } 5621bd4fe43Sopenharmony_ci 5631bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 5641bd4fe43Sopenharmony_ci uwRet = LOS_TaskSuspend(pstTaskCB->taskID); 5651bd4fe43Sopenharmony_ci switch (uwRet) { 5661bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_OPERATE_IDLE: 5671bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED: 5681bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_ID_INVALID: 5691bd4fe43Sopenharmony_ci return osErrorParameter; 5701bd4fe43Sopenharmony_ci 5711bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_NOT_CREATED: 5721bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_ALREADY_SUSPENDED: 5731bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_SUSPEND_LOCKED: 5741bd4fe43Sopenharmony_ci return osErrorResource; 5751bd4fe43Sopenharmony_ci 5761bd4fe43Sopenharmony_ci default: 5771bd4fe43Sopenharmony_ci return osOK; 5781bd4fe43Sopenharmony_ci } 5791bd4fe43Sopenharmony_ci} 5801bd4fe43Sopenharmony_ci 5811bd4fe43Sopenharmony_ci 5821bd4fe43Sopenharmony_ciosStatus_t osThreadResume(osThreadId_t thread_id) 5831bd4fe43Sopenharmony_ci{ 5841bd4fe43Sopenharmony_ci UINT32 uwRet; 5851bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 5861bd4fe43Sopenharmony_ci 5871bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 5881bd4fe43Sopenharmony_ci return osErrorISR; 5891bd4fe43Sopenharmony_ci } 5901bd4fe43Sopenharmony_ci 5911bd4fe43Sopenharmony_ci if (thread_id == NULL) { 5921bd4fe43Sopenharmony_ci return osErrorParameter; 5931bd4fe43Sopenharmony_ci } 5941bd4fe43Sopenharmony_ci 5951bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 5961bd4fe43Sopenharmony_ci uwRet = LOS_TaskResume(pstTaskCB->taskID); 5971bd4fe43Sopenharmony_ci 5981bd4fe43Sopenharmony_ci switch (uwRet) { 5991bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_ID_INVALID: 6001bd4fe43Sopenharmony_ci return osErrorParameter; 6011bd4fe43Sopenharmony_ci 6021bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_NOT_CREATED: 6031bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_NOT_SUSPENDED: 6041bd4fe43Sopenharmony_ci return osErrorResource; 6051bd4fe43Sopenharmony_ci 6061bd4fe43Sopenharmony_ci default: 6071bd4fe43Sopenharmony_ci return osOK; 6081bd4fe43Sopenharmony_ci } 6091bd4fe43Sopenharmony_ci} 6101bd4fe43Sopenharmony_ci 6111bd4fe43Sopenharmony_ci 6121bd4fe43Sopenharmony_ciosStatus_t osThreadTerminate(osThreadId_t thread_id) 6131bd4fe43Sopenharmony_ci{ 6141bd4fe43Sopenharmony_ci UINT32 uwRet; 6151bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB = NULL; 6161bd4fe43Sopenharmony_ci 6171bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 6181bd4fe43Sopenharmony_ci return osErrorISR; 6191bd4fe43Sopenharmony_ci } 6201bd4fe43Sopenharmony_ci 6211bd4fe43Sopenharmony_ci if (thread_id == NULL) { 6221bd4fe43Sopenharmony_ci return osErrorParameter; 6231bd4fe43Sopenharmony_ci } 6241bd4fe43Sopenharmony_ci 6251bd4fe43Sopenharmony_ci pstTaskCB = (LosTaskCB *)thread_id; 6261bd4fe43Sopenharmony_ci uwRet = LOS_TaskDelete(pstTaskCB->taskID); 6271bd4fe43Sopenharmony_ci 6281bd4fe43Sopenharmony_ci switch (uwRet) { 6291bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_OPERATE_IDLE: 6301bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED: 6311bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_ID_INVALID: 6321bd4fe43Sopenharmony_ci return osErrorParameter; 6331bd4fe43Sopenharmony_ci 6341bd4fe43Sopenharmony_ci case LOS_ERRNO_TSK_NOT_CREATED: 6351bd4fe43Sopenharmony_ci return osErrorResource; 6361bd4fe43Sopenharmony_ci 6371bd4fe43Sopenharmony_ci default: 6381bd4fe43Sopenharmony_ci return osOK; 6391bd4fe43Sopenharmony_ci } 6401bd4fe43Sopenharmony_ci} 6411bd4fe43Sopenharmony_ci 6421bd4fe43Sopenharmony_ci 6431bd4fe43Sopenharmony_ciuint32_t osThreadGetCount(void) 6441bd4fe43Sopenharmony_ci{ 6451bd4fe43Sopenharmony_ci uint32_t uwCount = 0; 6461bd4fe43Sopenharmony_ci 6471bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 6481bd4fe43Sopenharmony_ci return 0U; 6491bd4fe43Sopenharmony_ci } 6501bd4fe43Sopenharmony_ci 6511bd4fe43Sopenharmony_ci for (uint32_t index = 0; index <= LOSCFG_BASE_CORE_TSK_LIMIT; index++) { 6521bd4fe43Sopenharmony_ci if (!((g_taskCBArray + index)->taskStatus & OS_TASK_STATUS_UNUSED)) { 6531bd4fe43Sopenharmony_ci uwCount++; 6541bd4fe43Sopenharmony_ci } 6551bd4fe43Sopenharmony_ci } 6561bd4fe43Sopenharmony_ci 6571bd4fe43Sopenharmony_ci return uwCount; 6581bd4fe43Sopenharmony_ci} 6591bd4fe43Sopenharmony_ci 6601bd4fe43Sopenharmony_ci 6611bd4fe43Sopenharmony_ci// ==== Generic Wait Functions ==== 6621bd4fe43Sopenharmony_ciWEAK UINT32 LOS_HalDelay(UINT32 ticks) 6631bd4fe43Sopenharmony_ci{ 6641bd4fe43Sopenharmony_ci UNUSED(ticks); 6651bd4fe43Sopenharmony_ci return LOS_ERRNO_TSK_DELAY_IN_INT; 6661bd4fe43Sopenharmony_ci} 6671bd4fe43Sopenharmony_ci 6681bd4fe43Sopenharmony_ci 6691bd4fe43Sopenharmony_ciosStatus_t osDelay(uint32_t ticks) 6701bd4fe43Sopenharmony_ci{ 6711bd4fe43Sopenharmony_ci UINT32 uwRet; 6721bd4fe43Sopenharmony_ci if (ticks == 0) { 6731bd4fe43Sopenharmony_ci return osOK; 6741bd4fe43Sopenharmony_ci } 6751bd4fe43Sopenharmony_ci if (osKernelGetState() != osKernelRunning) { 6761bd4fe43Sopenharmony_ci uwRet = LOS_HalDelay(ticks); 6771bd4fe43Sopenharmony_ci } else { 6781bd4fe43Sopenharmony_ci uwRet = LOS_TaskDelay(ticks); 6791bd4fe43Sopenharmony_ci } 6801bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 6811bd4fe43Sopenharmony_ci return osOK; 6821bd4fe43Sopenharmony_ci } else { 6831bd4fe43Sopenharmony_ci return osError; 6841bd4fe43Sopenharmony_ci } 6851bd4fe43Sopenharmony_ci} 6861bd4fe43Sopenharmony_ci 6871bd4fe43Sopenharmony_ci 6881bd4fe43Sopenharmony_ciosStatus_t osDelayUntil(uint32_t ticks) 6891bd4fe43Sopenharmony_ci{ 6901bd4fe43Sopenharmony_ci UINT32 uwRet; 6911bd4fe43Sopenharmony_ci UINT32 uwTicks; 6921bd4fe43Sopenharmony_ci UINT32 tickCount = osKernelGetTickCount(); 6931bd4fe43Sopenharmony_ci 6941bd4fe43Sopenharmony_ci if (ticks < tickCount) { 6951bd4fe43Sopenharmony_ci return osError; 6961bd4fe43Sopenharmony_ci } 6971bd4fe43Sopenharmony_ci 6981bd4fe43Sopenharmony_ci uwTicks = (UINT32)(ticks - tickCount); 6991bd4fe43Sopenharmony_ci 7001bd4fe43Sopenharmony_ci uwRet = LOS_TaskDelay(uwTicks); 7011bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 7021bd4fe43Sopenharmony_ci return osOK; 7031bd4fe43Sopenharmony_ci } else { 7041bd4fe43Sopenharmony_ci return osError; 7051bd4fe43Sopenharmony_ci } 7061bd4fe43Sopenharmony_ci} 7071bd4fe43Sopenharmony_ci 7081bd4fe43Sopenharmony_ci// ==== Timer Management Functions ==== 7091bd4fe43Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR == 1) 7101bd4fe43Sopenharmony_ciosTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr) 7111bd4fe43Sopenharmony_ci{ 7121bd4fe43Sopenharmony_ci UNUSED(attr); 7131bd4fe43Sopenharmony_ci UINT16 usSwTmrID; 7141bd4fe43Sopenharmony_ci UINT8 mode; 7151bd4fe43Sopenharmony_ci 7161bd4fe43Sopenharmony_ci if ((OS_INT_ACTIVE) || (NULL == func) || ((osTimerOnce != type) && (osTimerPeriodic != type))) { 7171bd4fe43Sopenharmony_ci return (osTimerId_t)NULL; 7181bd4fe43Sopenharmony_ci } 7191bd4fe43Sopenharmony_ci 7201bd4fe43Sopenharmony_ci if (osTimerOnce == type) { 7211bd4fe43Sopenharmony_ci mode = LOS_SWTMR_MODE_NO_SELFDELETE; 7221bd4fe43Sopenharmony_ci } else { 7231bd4fe43Sopenharmony_ci mode = LOS_SWTMR_MODE_PERIOD; 7241bd4fe43Sopenharmony_ci } 7251bd4fe43Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1) 7261bd4fe43Sopenharmony_ci if (LOS_OK != LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &usSwTmrID, (UINT32)(UINTPTR)argument, 7271bd4fe43Sopenharmony_ci osTimerRousesAllow, osTimerAlignIgnore)) { 7281bd4fe43Sopenharmony_ci return (osTimerId_t)NULL; 7291bd4fe43Sopenharmony_ci } 7301bd4fe43Sopenharmony_ci#else 7311bd4fe43Sopenharmony_ci if (LOS_OK != LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &usSwTmrID, (UINT32)(UINTPTR)argument)) { 7321bd4fe43Sopenharmony_ci return (osTimerId_t)NULL; 7331bd4fe43Sopenharmony_ci } 7341bd4fe43Sopenharmony_ci#endif 7351bd4fe43Sopenharmony_ci 7361bd4fe43Sopenharmony_ci return (osTimerId_t)OS_SWT_FROM_SID(usSwTmrID); 7371bd4fe43Sopenharmony_ci} 7381bd4fe43Sopenharmony_ci 7391bd4fe43Sopenharmony_ciosStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks) 7401bd4fe43Sopenharmony_ci{ 7411bd4fe43Sopenharmony_ci UINT32 uwRet; 7421bd4fe43Sopenharmony_ci SWTMR_CTRL_S *pstSwtmr; 7431bd4fe43Sopenharmony_ci 7441bd4fe43Sopenharmony_ci if ((0 == ticks) || (NULL == timer_id)) { 7451bd4fe43Sopenharmony_ci return osErrorParameter; 7461bd4fe43Sopenharmony_ci } 7471bd4fe43Sopenharmony_ci 7481bd4fe43Sopenharmony_ci pstSwtmr = (SWTMR_CTRL_S *)timer_id; 7491bd4fe43Sopenharmony_ci pstSwtmr->uwInterval = ticks; 7501bd4fe43Sopenharmony_ci uwRet = LOS_SwtmrStart(pstSwtmr->usTimerID); 7511bd4fe43Sopenharmony_ci if (LOS_OK == uwRet) { 7521bd4fe43Sopenharmony_ci return osOK; 7531bd4fe43Sopenharmony_ci } else if (LOS_ERRNO_SWTMR_ID_INVALID == uwRet) { 7541bd4fe43Sopenharmony_ci return osErrorParameter; 7551bd4fe43Sopenharmony_ci } else { 7561bd4fe43Sopenharmony_ci return osErrorResource; 7571bd4fe43Sopenharmony_ci } 7581bd4fe43Sopenharmony_ci} 7591bd4fe43Sopenharmony_ci 7601bd4fe43Sopenharmony_ci 7611bd4fe43Sopenharmony_ciconst char *osTimerGetName(osTimerId_t timer_id) 7621bd4fe43Sopenharmony_ci{ 7631bd4fe43Sopenharmony_ci UNUSED(timer_id); 7641bd4fe43Sopenharmony_ci return (const char *)NULL; 7651bd4fe43Sopenharmony_ci} 7661bd4fe43Sopenharmony_ci 7671bd4fe43Sopenharmony_ci 7681bd4fe43Sopenharmony_ciosStatus_t osTimerStop(osTimerId_t timer_id) 7691bd4fe43Sopenharmony_ci{ 7701bd4fe43Sopenharmony_ci UINT32 uwRet; 7711bd4fe43Sopenharmony_ci SWTMR_CTRL_S *pstSwtmr = (SWTMR_CTRL_S *)timer_id; 7721bd4fe43Sopenharmony_ci 7731bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 7741bd4fe43Sopenharmony_ci return osErrorISR; 7751bd4fe43Sopenharmony_ci } 7761bd4fe43Sopenharmony_ci 7771bd4fe43Sopenharmony_ci if (NULL == pstSwtmr) { 7781bd4fe43Sopenharmony_ci return osErrorParameter; 7791bd4fe43Sopenharmony_ci } 7801bd4fe43Sopenharmony_ci 7811bd4fe43Sopenharmony_ci uwRet = LOS_SwtmrStop(pstSwtmr->usTimerID); 7821bd4fe43Sopenharmony_ci if (LOS_OK == uwRet) { 7831bd4fe43Sopenharmony_ci return osOK; 7841bd4fe43Sopenharmony_ci } else if (LOS_ERRNO_SWTMR_ID_INVALID == uwRet) { 7851bd4fe43Sopenharmony_ci return osErrorParameter; 7861bd4fe43Sopenharmony_ci } else { 7871bd4fe43Sopenharmony_ci return osErrorResource; 7881bd4fe43Sopenharmony_ci } 7891bd4fe43Sopenharmony_ci} 7901bd4fe43Sopenharmony_ci 7911bd4fe43Sopenharmony_ci 7921bd4fe43Sopenharmony_ciuint32_t osTimerIsRunning(osTimerId_t timer_id) 7931bd4fe43Sopenharmony_ci{ 7941bd4fe43Sopenharmony_ci if ((OS_INT_ACTIVE) || (NULL == timer_id)) { 7951bd4fe43Sopenharmony_ci return 0; 7961bd4fe43Sopenharmony_ci } 7971bd4fe43Sopenharmony_ci 7981bd4fe43Sopenharmony_ci return (OS_SWTMR_STATUS_TICKING == ((SWTMR_CTRL_S *)timer_id)->ucState); 7991bd4fe43Sopenharmony_ci} 8001bd4fe43Sopenharmony_ci 8011bd4fe43Sopenharmony_ci 8021bd4fe43Sopenharmony_ciosStatus_t osTimerDelete(osTimerId_t timer_id) 8031bd4fe43Sopenharmony_ci{ 8041bd4fe43Sopenharmony_ci UINT32 uwRet; 8051bd4fe43Sopenharmony_ci SWTMR_CTRL_S *pstSwtmr = (SWTMR_CTRL_S *)timer_id; 8061bd4fe43Sopenharmony_ci 8071bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 8081bd4fe43Sopenharmony_ci return osErrorISR; 8091bd4fe43Sopenharmony_ci } 8101bd4fe43Sopenharmony_ci 8111bd4fe43Sopenharmony_ci if (NULL == pstSwtmr) { 8121bd4fe43Sopenharmony_ci return osErrorParameter; 8131bd4fe43Sopenharmony_ci } 8141bd4fe43Sopenharmony_ci 8151bd4fe43Sopenharmony_ci uwRet = LOS_SwtmrDelete(pstSwtmr->usTimerID); 8161bd4fe43Sopenharmony_ci if (LOS_OK == uwRet) { 8171bd4fe43Sopenharmony_ci return osOK; 8181bd4fe43Sopenharmony_ci } else if (LOS_ERRNO_SWTMR_ID_INVALID == uwRet) { 8191bd4fe43Sopenharmony_ci return osErrorParameter; 8201bd4fe43Sopenharmony_ci } else { 8211bd4fe43Sopenharmony_ci return osErrorResource; 8221bd4fe43Sopenharmony_ci } 8231bd4fe43Sopenharmony_ci} 8241bd4fe43Sopenharmony_ci#endif 8251bd4fe43Sopenharmony_ci 8261bd4fe43Sopenharmony_ciosEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr) 8271bd4fe43Sopenharmony_ci{ 8281bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB; 8291bd4fe43Sopenharmony_ci UINT32 uwRet; 8301bd4fe43Sopenharmony_ci 8311bd4fe43Sopenharmony_ci UNUSED(attr); 8321bd4fe43Sopenharmony_ci 8331bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 8341bd4fe43Sopenharmony_ci return (osEventFlagsId_t)NULL; 8351bd4fe43Sopenharmony_ci } 8361bd4fe43Sopenharmony_ci 8371bd4fe43Sopenharmony_ci pstEventCB = (PEVENT_CB_S)LOS_MemAlloc(m_aucSysMem0, sizeof(EVENT_CB_S)); 8381bd4fe43Sopenharmony_ci if (pstEventCB == NULL) { 8391bd4fe43Sopenharmony_ci return (osEventFlagsId_t)NULL; 8401bd4fe43Sopenharmony_ci } 8411bd4fe43Sopenharmony_ci 8421bd4fe43Sopenharmony_ci uwRet = LOS_EventInit(pstEventCB); 8431bd4fe43Sopenharmony_ci if (uwRet == LOS_ERRNO_EVENT_PTR_NULL) { 8441bd4fe43Sopenharmony_ci return (osEventFlagsId_t)NULL; 8451bd4fe43Sopenharmony_ci } else { 8461bd4fe43Sopenharmony_ci return (osEventFlagsId_t)pstEventCB; 8471bd4fe43Sopenharmony_ci } 8481bd4fe43Sopenharmony_ci} 8491bd4fe43Sopenharmony_ci 8501bd4fe43Sopenharmony_ci 8511bd4fe43Sopenharmony_ciconst char *osEventFlagsGetName(osEventFlagsId_t ef_id) 8521bd4fe43Sopenharmony_ci{ 8531bd4fe43Sopenharmony_ci UNUSED(ef_id); 8541bd4fe43Sopenharmony_ci 8551bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 8561bd4fe43Sopenharmony_ci return (const char *)NULL; 8571bd4fe43Sopenharmony_ci } 8581bd4fe43Sopenharmony_ci 8591bd4fe43Sopenharmony_ci return (const char *)NULL; 8601bd4fe43Sopenharmony_ci} 8611bd4fe43Sopenharmony_ci 8621bd4fe43Sopenharmony_ci 8631bd4fe43Sopenharmony_ciuint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags) 8641bd4fe43Sopenharmony_ci{ 8651bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id; 8661bd4fe43Sopenharmony_ci UINT32 uwRet; 8671bd4fe43Sopenharmony_ci uint32_t rflags; 8681bd4fe43Sopenharmony_ci if (pstEventCB == NULL) { 8691bd4fe43Sopenharmony_ci return osFlagsErrorParameter; 8701bd4fe43Sopenharmony_ci } 8711bd4fe43Sopenharmony_ci uwRet = LOS_EventWrite(pstEventCB, (UINT32)flags); 8721bd4fe43Sopenharmony_ci if (uwRet != LOS_OK) { 8731bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 8741bd4fe43Sopenharmony_ci } else { 8751bd4fe43Sopenharmony_ci rflags = pstEventCB->uwEventID; 8761bd4fe43Sopenharmony_ci return rflags; 8771bd4fe43Sopenharmony_ci } 8781bd4fe43Sopenharmony_ci} 8791bd4fe43Sopenharmony_ci 8801bd4fe43Sopenharmony_ci 8811bd4fe43Sopenharmony_ciuint32_t osEventFlagsClear(osEventFlagsId_t ef_id, uint32_t flags) 8821bd4fe43Sopenharmony_ci{ 8831bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id; 8841bd4fe43Sopenharmony_ci UINTPTR uwIntSave; 8851bd4fe43Sopenharmony_ci uint32_t rflags; 8861bd4fe43Sopenharmony_ci UINT32 uwRet; 8871bd4fe43Sopenharmony_ci 8881bd4fe43Sopenharmony_ci if (pstEventCB == NULL) { 8891bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 8901bd4fe43Sopenharmony_ci } 8911bd4fe43Sopenharmony_ci 8921bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 8931bd4fe43Sopenharmony_ci rflags = pstEventCB->uwEventID; 8941bd4fe43Sopenharmony_ci 8951bd4fe43Sopenharmony_ci uwRet = LOS_EventClear(pstEventCB, ~flags); 8961bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 8971bd4fe43Sopenharmony_ci if (uwRet != LOS_OK) { 8981bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 8991bd4fe43Sopenharmony_ci } else { 9001bd4fe43Sopenharmony_ci return rflags; 9011bd4fe43Sopenharmony_ci } 9021bd4fe43Sopenharmony_ci} 9031bd4fe43Sopenharmony_ci 9041bd4fe43Sopenharmony_ci 9051bd4fe43Sopenharmony_ciuint32_t osEventFlagsGet(osEventFlagsId_t ef_id) 9061bd4fe43Sopenharmony_ci{ 9071bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id; 9081bd4fe43Sopenharmony_ci UINTPTR uwIntSave; 9091bd4fe43Sopenharmony_ci uint32_t rflags; 9101bd4fe43Sopenharmony_ci 9111bd4fe43Sopenharmony_ci if (pstEventCB == NULL) { 9121bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 9131bd4fe43Sopenharmony_ci } 9141bd4fe43Sopenharmony_ci 9151bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 9161bd4fe43Sopenharmony_ci rflags = pstEventCB->uwEventID; 9171bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 9181bd4fe43Sopenharmony_ci 9191bd4fe43Sopenharmony_ci return rflags; 9201bd4fe43Sopenharmony_ci} 9211bd4fe43Sopenharmony_ci 9221bd4fe43Sopenharmony_ciuint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout) 9231bd4fe43Sopenharmony_ci{ 9241bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id; 9251bd4fe43Sopenharmony_ci UINT32 uwMode = 0; 9261bd4fe43Sopenharmony_ci UINT32 uwRet; 9271bd4fe43Sopenharmony_ci uint32_t rflags; 9281bd4fe43Sopenharmony_ci 9291bd4fe43Sopenharmony_ci if (options > (osFlagsWaitAny | osFlagsWaitAll | osFlagsNoClear)) { 9301bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 9311bd4fe43Sopenharmony_ci } 9321bd4fe43Sopenharmony_ci 9331bd4fe43Sopenharmony_ci if ((options & osFlagsWaitAll) == osFlagsWaitAll) { 9341bd4fe43Sopenharmony_ci uwMode |= LOS_WAITMODE_AND; 9351bd4fe43Sopenharmony_ci } else { 9361bd4fe43Sopenharmony_ci uwMode |= LOS_WAITMODE_OR; 9371bd4fe43Sopenharmony_ci } 9381bd4fe43Sopenharmony_ci 9391bd4fe43Sopenharmony_ci if ((options & osFlagsNoClear) == osFlagsNoClear) { 9401bd4fe43Sopenharmony_ci uwMode &= ~LOS_WAITMODE_CLR; 9411bd4fe43Sopenharmony_ci } else { 9421bd4fe43Sopenharmony_ci uwMode |= LOS_WAITMODE_CLR; 9431bd4fe43Sopenharmony_ci } 9441bd4fe43Sopenharmony_ci 9451bd4fe43Sopenharmony_ci uwRet = LOS_EventRead(pstEventCB, (UINT32)flags, uwMode, (UINT32)timeout); 9461bd4fe43Sopenharmony_ci switch (uwRet) { 9471bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_PTR_NULL: 9481bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_EVENTMASK_INVALID: 9491bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_SETBIT_INVALID: 9501bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorParameter; 9511bd4fe43Sopenharmony_ci 9521bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_READ_IN_INTERRUPT: 9531bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_FLAGS_INVALID: 9541bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_READ_IN_LOCK: 9551bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorResource; 9561bd4fe43Sopenharmony_ci 9571bd4fe43Sopenharmony_ci case LOS_ERRNO_EVENT_READ_TIMEOUT: 9581bd4fe43Sopenharmony_ci return (uint32_t)osFlagsErrorTimeout; 9591bd4fe43Sopenharmony_ci 9601bd4fe43Sopenharmony_ci default: 9611bd4fe43Sopenharmony_ci rflags = (uint32_t)uwRet; 9621bd4fe43Sopenharmony_ci return rflags; 9631bd4fe43Sopenharmony_ci } 9641bd4fe43Sopenharmony_ci} 9651bd4fe43Sopenharmony_ci 9661bd4fe43Sopenharmony_ciosStatus_t osEventFlagsDelete(osEventFlagsId_t ef_id) 9671bd4fe43Sopenharmony_ci{ 9681bd4fe43Sopenharmony_ci PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id; 9691bd4fe43Sopenharmony_ci UINTPTR uwIntSave; 9701bd4fe43Sopenharmony_ci osStatus_t uwRet; 9711bd4fe43Sopenharmony_ci 9721bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 9731bd4fe43Sopenharmony_ci if (LOS_EventDestroy(pstEventCB) == LOS_OK) { 9741bd4fe43Sopenharmony_ci uwRet = osOK; 9751bd4fe43Sopenharmony_ci } else { 9761bd4fe43Sopenharmony_ci uwRet = osErrorParameter; 9771bd4fe43Sopenharmony_ci } 9781bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 9791bd4fe43Sopenharmony_ci 9801bd4fe43Sopenharmony_ci if (LOS_MemFree(m_aucSysMem0, (void *)pstEventCB) == LOS_OK) { 9811bd4fe43Sopenharmony_ci uwRet = osOK; 9821bd4fe43Sopenharmony_ci } else { 9831bd4fe43Sopenharmony_ci uwRet = osErrorParameter; 9841bd4fe43Sopenharmony_ci } 9851bd4fe43Sopenharmony_ci 9861bd4fe43Sopenharmony_ci return uwRet; 9871bd4fe43Sopenharmony_ci} 9881bd4fe43Sopenharmony_ci 9891bd4fe43Sopenharmony_ci// ==== Mutex Management Functions ==== 9901bd4fe43Sopenharmony_ci#if (LOSCFG_BASE_IPC_MUX == 1) 9911bd4fe43Sopenharmony_ciosMutexId_t osMutexNew(const osMutexAttr_t *attr) 9921bd4fe43Sopenharmony_ci{ 9931bd4fe43Sopenharmony_ci UINT32 uwRet; 9941bd4fe43Sopenharmony_ci UINT32 uwMuxId; 9951bd4fe43Sopenharmony_ci 9961bd4fe43Sopenharmony_ci UNUSED(attr); 9971bd4fe43Sopenharmony_ci 9981bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 9991bd4fe43Sopenharmony_ci return NULL; 10001bd4fe43Sopenharmony_ci } 10011bd4fe43Sopenharmony_ci 10021bd4fe43Sopenharmony_ci uwRet = LOS_MuxCreate(&uwMuxId); 10031bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 10041bd4fe43Sopenharmony_ci return (osMutexId_t)(GET_MUX(uwMuxId)); 10051bd4fe43Sopenharmony_ci } else { 10061bd4fe43Sopenharmony_ci return (osMutexId_t)NULL; 10071bd4fe43Sopenharmony_ci } 10081bd4fe43Sopenharmony_ci} 10091bd4fe43Sopenharmony_ci 10101bd4fe43Sopenharmony_ci 10111bd4fe43Sopenharmony_ciosStatus_t osMutexAcquire(osMutexId_t mutex_id, uint32_t timeout) 10121bd4fe43Sopenharmony_ci{ 10131bd4fe43Sopenharmony_ci UINT32 uwRet; 10141bd4fe43Sopenharmony_ci 10151bd4fe43Sopenharmony_ci if (mutex_id == NULL) { 10161bd4fe43Sopenharmony_ci return osErrorParameter; 10171bd4fe43Sopenharmony_ci } 10181bd4fe43Sopenharmony_ci 10191bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE && (timeout != LOS_NO_WAIT)) { 10201bd4fe43Sopenharmony_ci timeout = 0; 10211bd4fe43Sopenharmony_ci } 10221bd4fe43Sopenharmony_ci 10231bd4fe43Sopenharmony_ci uwRet = LOS_MuxPend(((LosMuxCB *)mutex_id)->muxID, timeout); 10241bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 10251bd4fe43Sopenharmony_ci return osOK; 10261bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_MUX_TIMEOUT) { 10271bd4fe43Sopenharmony_ci return osErrorTimeout; 10281bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_MUX_INVALID) { 10291bd4fe43Sopenharmony_ci return osErrorParameter; 10301bd4fe43Sopenharmony_ci } else { 10311bd4fe43Sopenharmony_ci return osErrorResource; 10321bd4fe43Sopenharmony_ci } 10331bd4fe43Sopenharmony_ci} 10341bd4fe43Sopenharmony_ci 10351bd4fe43Sopenharmony_ci 10361bd4fe43Sopenharmony_ciosStatus_t osMutexRelease(osMutexId_t mutex_id) 10371bd4fe43Sopenharmony_ci{ 10381bd4fe43Sopenharmony_ci UINT32 uwRet; 10391bd4fe43Sopenharmony_ci 10401bd4fe43Sopenharmony_ci if (mutex_id == NULL) { 10411bd4fe43Sopenharmony_ci return osErrorParameter; 10421bd4fe43Sopenharmony_ci } 10431bd4fe43Sopenharmony_ci 10441bd4fe43Sopenharmony_ci uwRet = LOS_MuxPost(((LosMuxCB *)mutex_id)->muxID); 10451bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 10461bd4fe43Sopenharmony_ci return osOK; 10471bd4fe43Sopenharmony_ci } else { 10481bd4fe43Sopenharmony_ci return osErrorResource; 10491bd4fe43Sopenharmony_ci } 10501bd4fe43Sopenharmony_ci} 10511bd4fe43Sopenharmony_ci 10521bd4fe43Sopenharmony_ci 10531bd4fe43Sopenharmony_ciosThreadId_t osMutexGetOwner(osMutexId_t mutex_id) 10541bd4fe43Sopenharmony_ci{ 10551bd4fe43Sopenharmony_ci UINT32 uwIntSave; 10561bd4fe43Sopenharmony_ci LosTaskCB *pstTaskCB; 10571bd4fe43Sopenharmony_ci 10581bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 10591bd4fe43Sopenharmony_ci return NULL; 10601bd4fe43Sopenharmony_ci } 10611bd4fe43Sopenharmony_ci 10621bd4fe43Sopenharmony_ci if (mutex_id == NULL) { 10631bd4fe43Sopenharmony_ci return NULL; 10641bd4fe43Sopenharmony_ci } 10651bd4fe43Sopenharmony_ci 10661bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 10671bd4fe43Sopenharmony_ci pstTaskCB = ((LosMuxCB *)mutex_id)->owner; 10681bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 10691bd4fe43Sopenharmony_ci 10701bd4fe43Sopenharmony_ci return (osThreadId_t)pstTaskCB; 10711bd4fe43Sopenharmony_ci} 10721bd4fe43Sopenharmony_ci 10731bd4fe43Sopenharmony_ci 10741bd4fe43Sopenharmony_ciosStatus_t osMutexDelete(osMutexId_t mutex_id) 10751bd4fe43Sopenharmony_ci{ 10761bd4fe43Sopenharmony_ci UINT32 uwRet; 10771bd4fe43Sopenharmony_ci 10781bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 10791bd4fe43Sopenharmony_ci return osErrorISR; 10801bd4fe43Sopenharmony_ci } 10811bd4fe43Sopenharmony_ci 10821bd4fe43Sopenharmony_ci if (mutex_id == NULL) { 10831bd4fe43Sopenharmony_ci return osErrorParameter; 10841bd4fe43Sopenharmony_ci } 10851bd4fe43Sopenharmony_ci 10861bd4fe43Sopenharmony_ci uwRet = LOS_MuxDelete(((LosMuxCB *)mutex_id)->muxID); 10871bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 10881bd4fe43Sopenharmony_ci return osOK; 10891bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_MUX_INVALID) { 10901bd4fe43Sopenharmony_ci return osErrorParameter; 10911bd4fe43Sopenharmony_ci } else { 10921bd4fe43Sopenharmony_ci return osErrorResource; 10931bd4fe43Sopenharmony_ci } 10941bd4fe43Sopenharmony_ci} 10951bd4fe43Sopenharmony_ci#endif 10961bd4fe43Sopenharmony_ci 10971bd4fe43Sopenharmony_ci// ==== Semaphore Management Functions ==== 10981bd4fe43Sopenharmony_ci#if (LOSCFG_BASE_IPC_SEM == 1) 10991bd4fe43Sopenharmony_ci 11001bd4fe43Sopenharmony_ciosSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr) 11011bd4fe43Sopenharmony_ci{ 11021bd4fe43Sopenharmony_ci UINT32 uwRet; 11031bd4fe43Sopenharmony_ci UINT32 uwSemId; 11041bd4fe43Sopenharmony_ci 11051bd4fe43Sopenharmony_ci UNUSED(attr); 11061bd4fe43Sopenharmony_ci 11071bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 11081bd4fe43Sopenharmony_ci return (osSemaphoreId_t)NULL; 11091bd4fe43Sopenharmony_ci } 11101bd4fe43Sopenharmony_ci 11111bd4fe43Sopenharmony_ci if (1 == max_count) { 11121bd4fe43Sopenharmony_ci uwRet = LOS_BinarySemCreate((UINT16)initial_count, &uwSemId); 11131bd4fe43Sopenharmony_ci } else { 11141bd4fe43Sopenharmony_ci uwRet = LOS_SemCreate((UINT16)initial_count, &uwSemId); 11151bd4fe43Sopenharmony_ci } 11161bd4fe43Sopenharmony_ci 11171bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 11181bd4fe43Sopenharmony_ci return (osSemaphoreId_t)(GET_SEM(uwSemId)); 11191bd4fe43Sopenharmony_ci } else { 11201bd4fe43Sopenharmony_ci return (osSemaphoreId_t)NULL; 11211bd4fe43Sopenharmony_ci } 11221bd4fe43Sopenharmony_ci} 11231bd4fe43Sopenharmony_ci 11241bd4fe43Sopenharmony_ci 11251bd4fe43Sopenharmony_ciosStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id, uint32_t timeout) 11261bd4fe43Sopenharmony_ci{ 11271bd4fe43Sopenharmony_ci UINT32 uwRet; 11281bd4fe43Sopenharmony_ci 11291bd4fe43Sopenharmony_ci if (semaphore_id == NULL) { 11301bd4fe43Sopenharmony_ci return osErrorParameter; 11311bd4fe43Sopenharmony_ci } 11321bd4fe43Sopenharmony_ci 11331bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE && (timeout != LOS_NO_WAIT)) { 11341bd4fe43Sopenharmony_ci return osErrorISR; 11351bd4fe43Sopenharmony_ci } 11361bd4fe43Sopenharmony_ci 11371bd4fe43Sopenharmony_ci uwRet = LOS_SemPend(((LosSemCB *)semaphore_id)->semID, timeout); 11381bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 11391bd4fe43Sopenharmony_ci return osOK; 11401bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_SEM_TIMEOUT) { 11411bd4fe43Sopenharmony_ci return osErrorTimeout; 11421bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_SEM_INVALID) { 11431bd4fe43Sopenharmony_ci return osErrorParameter; 11441bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_SEM_PEND_INTERR) { 11451bd4fe43Sopenharmony_ci return osErrorISR; 11461bd4fe43Sopenharmony_ci } else { 11471bd4fe43Sopenharmony_ci return osErrorResource; 11481bd4fe43Sopenharmony_ci } 11491bd4fe43Sopenharmony_ci} 11501bd4fe43Sopenharmony_ci 11511bd4fe43Sopenharmony_ci 11521bd4fe43Sopenharmony_ciosStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id) 11531bd4fe43Sopenharmony_ci{ 11541bd4fe43Sopenharmony_ci UINT32 uwRet; 11551bd4fe43Sopenharmony_ci 11561bd4fe43Sopenharmony_ci if (semaphore_id == NULL) { 11571bd4fe43Sopenharmony_ci return osErrorParameter; 11581bd4fe43Sopenharmony_ci } 11591bd4fe43Sopenharmony_ci 11601bd4fe43Sopenharmony_ci uwRet = LOS_SemPost(((LosSemCB *)semaphore_id)->semID); 11611bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 11621bd4fe43Sopenharmony_ci return osOK; 11631bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_SEM_INVALID) { 11641bd4fe43Sopenharmony_ci return osErrorParameter; 11651bd4fe43Sopenharmony_ci } else { 11661bd4fe43Sopenharmony_ci return osErrorResource; 11671bd4fe43Sopenharmony_ci } 11681bd4fe43Sopenharmony_ci} 11691bd4fe43Sopenharmony_ci 11701bd4fe43Sopenharmony_ci 11711bd4fe43Sopenharmony_ciuint32_t osSemaphoreGetCount(osSemaphoreId_t semaphore_id) 11721bd4fe43Sopenharmony_ci{ 11731bd4fe43Sopenharmony_ci UINT32 uwIntSave; 11741bd4fe43Sopenharmony_ci UINT32 uwCount; 11751bd4fe43Sopenharmony_ci 11761bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 11771bd4fe43Sopenharmony_ci return 0; 11781bd4fe43Sopenharmony_ci } 11791bd4fe43Sopenharmony_ci 11801bd4fe43Sopenharmony_ci if (semaphore_id == NULL) { 11811bd4fe43Sopenharmony_ci return 0; 11821bd4fe43Sopenharmony_ci } 11831bd4fe43Sopenharmony_ci 11841bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 11851bd4fe43Sopenharmony_ci uwCount = ((LosSemCB *)semaphore_id)->semCount; 11861bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 11871bd4fe43Sopenharmony_ci 11881bd4fe43Sopenharmony_ci return uwCount; 11891bd4fe43Sopenharmony_ci} 11901bd4fe43Sopenharmony_ci 11911bd4fe43Sopenharmony_ci 11921bd4fe43Sopenharmony_ciosStatus_t osSemaphoreDelete(osSemaphoreId_t semaphore_id) 11931bd4fe43Sopenharmony_ci{ 11941bd4fe43Sopenharmony_ci UINT32 uwRet; 11951bd4fe43Sopenharmony_ci 11961bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 11971bd4fe43Sopenharmony_ci return osErrorISR; 11981bd4fe43Sopenharmony_ci } 11991bd4fe43Sopenharmony_ci 12001bd4fe43Sopenharmony_ci if (semaphore_id == NULL) { 12011bd4fe43Sopenharmony_ci return osErrorParameter; 12021bd4fe43Sopenharmony_ci } 12031bd4fe43Sopenharmony_ci 12041bd4fe43Sopenharmony_ci uwRet = LOS_SemDelete(((LosSemCB *)semaphore_id)->semID); 12051bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 12061bd4fe43Sopenharmony_ci return osOK; 12071bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_SEM_INVALID) { 12081bd4fe43Sopenharmony_ci return osErrorParameter; 12091bd4fe43Sopenharmony_ci } else { 12101bd4fe43Sopenharmony_ci return osErrorResource; 12111bd4fe43Sopenharmony_ci } 12121bd4fe43Sopenharmony_ci} 12131bd4fe43Sopenharmony_ci#endif 12141bd4fe43Sopenharmony_ci 12151bd4fe43Sopenharmony_ci 12161bd4fe43Sopenharmony_ci// ==== Message Queue Management Functions ==== 12171bd4fe43Sopenharmony_ci#if (LOSCFG_BASE_IPC_QUEUE == 1) 12181bd4fe43Sopenharmony_ciosMessageQueueId_t osMessageQueueNew(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr) 12191bd4fe43Sopenharmony_ci{ 12201bd4fe43Sopenharmony_ci UINT32 uwQueueID; 12211bd4fe43Sopenharmony_ci UINT32 uwRet; 12221bd4fe43Sopenharmony_ci UNUSED(attr); 12231bd4fe43Sopenharmony_ci osMessageQueueId_t handle; 12241bd4fe43Sopenharmony_ci 12251bd4fe43Sopenharmony_ci if (0 == msg_count || 0 == msg_size || OS_INT_ACTIVE) { 12261bd4fe43Sopenharmony_ci return (osMessageQueueId_t)NULL; 12271bd4fe43Sopenharmony_ci } 12281bd4fe43Sopenharmony_ci 12291bd4fe43Sopenharmony_ci uwRet = LOS_QueueCreate((char *)NULL, (UINT16)msg_count, &uwQueueID, 0, (UINT16)msg_size); 12301bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 12311bd4fe43Sopenharmony_ci handle = (osMessageQueueId_t)(GET_QUEUE_HANDLE(uwQueueID)); 12321bd4fe43Sopenharmony_ci } else { 12331bd4fe43Sopenharmony_ci handle = (osMessageQueueId_t)NULL; 12341bd4fe43Sopenharmony_ci } 12351bd4fe43Sopenharmony_ci 12361bd4fe43Sopenharmony_ci return handle; 12371bd4fe43Sopenharmony_ci} 12381bd4fe43Sopenharmony_ci 12391bd4fe43Sopenharmony_ci 12401bd4fe43Sopenharmony_ciosStatus_t osMessageQueuePut(osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout) 12411bd4fe43Sopenharmony_ci{ 12421bd4fe43Sopenharmony_ci UNUSED(msg_prio); 12431bd4fe43Sopenharmony_ci UINT32 uwRet; 12441bd4fe43Sopenharmony_ci UINT32 uwBufferSize; 12451bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 12461bd4fe43Sopenharmony_ci 12471bd4fe43Sopenharmony_ci if (pstQueue == NULL || msg_ptr == NULL || ((OS_INT_ACTIVE) && (0 != timeout))) { 12481bd4fe43Sopenharmony_ci return osErrorParameter; 12491bd4fe43Sopenharmony_ci } 12501bd4fe43Sopenharmony_ci if (pstQueue->queueSize < sizeof(UINT32)) { 12511bd4fe43Sopenharmony_ci return osErrorParameter; 12521bd4fe43Sopenharmony_ci } 12531bd4fe43Sopenharmony_ci uwBufferSize = (UINT32)(pstQueue->queueSize - sizeof(UINT32)); 12541bd4fe43Sopenharmony_ci uwRet = LOS_QueueWriteCopy((UINT32)pstQueue->queueID, (void *)msg_ptr, uwBufferSize, timeout); 12551bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 12561bd4fe43Sopenharmony_ci return osOK; 12571bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_QUEUE_INVALID || uwRet == LOS_ERRNO_QUEUE_NOT_CREATE) { 12581bd4fe43Sopenharmony_ci return osErrorParameter; 12591bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_QUEUE_TIMEOUT) { 12601bd4fe43Sopenharmony_ci return osErrorTimeout; 12611bd4fe43Sopenharmony_ci } else { 12621bd4fe43Sopenharmony_ci return osErrorResource; 12631bd4fe43Sopenharmony_ci } 12641bd4fe43Sopenharmony_ci} 12651bd4fe43Sopenharmony_ci 12661bd4fe43Sopenharmony_ci 12671bd4fe43Sopenharmony_ciosStatus_t osMessageQueueGet(osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout) 12681bd4fe43Sopenharmony_ci{ 12691bd4fe43Sopenharmony_ci UNUSED(msg_prio); 12701bd4fe43Sopenharmony_ci UINT32 uwRet; 12711bd4fe43Sopenharmony_ci UINT32 uwBufferSize; 12721bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 12731bd4fe43Sopenharmony_ci 12741bd4fe43Sopenharmony_ci if (pstQueue == NULL || msg_ptr == NULL || ((OS_INT_ACTIVE) && (0 != timeout))) { 12751bd4fe43Sopenharmony_ci return osErrorParameter; 12761bd4fe43Sopenharmony_ci } 12771bd4fe43Sopenharmony_ci 12781bd4fe43Sopenharmony_ci uwBufferSize = (UINT32)(pstQueue->queueSize - sizeof(UINT32)); 12791bd4fe43Sopenharmony_ci uwRet = LOS_QueueReadCopy((UINT32)pstQueue->queueID, msg_ptr, &uwBufferSize, timeout); 12801bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 12811bd4fe43Sopenharmony_ci return osOK; 12821bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_QUEUE_INVALID || uwRet == LOS_ERRNO_QUEUE_NOT_CREATE) { 12831bd4fe43Sopenharmony_ci return osErrorParameter; 12841bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_QUEUE_TIMEOUT) { 12851bd4fe43Sopenharmony_ci return osErrorTimeout; 12861bd4fe43Sopenharmony_ci } else { 12871bd4fe43Sopenharmony_ci return osErrorResource; 12881bd4fe43Sopenharmony_ci } 12891bd4fe43Sopenharmony_ci} 12901bd4fe43Sopenharmony_ci 12911bd4fe43Sopenharmony_ciuint32_t osMessageQueueGetCapacity(osMessageQueueId_t mq_id) 12921bd4fe43Sopenharmony_ci{ 12931bd4fe43Sopenharmony_ci uint32_t capacity; 12941bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 12951bd4fe43Sopenharmony_ci 12961bd4fe43Sopenharmony_ci if (pstQueue == NULL) { 12971bd4fe43Sopenharmony_ci capacity = 0U; 12981bd4fe43Sopenharmony_ci } else { 12991bd4fe43Sopenharmony_ci capacity = pstQueue->queueLen; 13001bd4fe43Sopenharmony_ci } 13011bd4fe43Sopenharmony_ci 13021bd4fe43Sopenharmony_ci return (capacity); 13031bd4fe43Sopenharmony_ci} 13041bd4fe43Sopenharmony_ci 13051bd4fe43Sopenharmony_ciuint32_t osMessageQueueGetMsgSize(osMessageQueueId_t mq_id) 13061bd4fe43Sopenharmony_ci{ 13071bd4fe43Sopenharmony_ci uint32_t size; 13081bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 13091bd4fe43Sopenharmony_ci 13101bd4fe43Sopenharmony_ci if (pstQueue == NULL) { 13111bd4fe43Sopenharmony_ci size = 0U; 13121bd4fe43Sopenharmony_ci } else { 13131bd4fe43Sopenharmony_ci size = pstQueue->queueSize - sizeof(UINT32); 13141bd4fe43Sopenharmony_ci } 13151bd4fe43Sopenharmony_ci 13161bd4fe43Sopenharmony_ci return (size); 13171bd4fe43Sopenharmony_ci} 13181bd4fe43Sopenharmony_ci 13191bd4fe43Sopenharmony_ci 13201bd4fe43Sopenharmony_ciuint32_t osMessageQueueGetCount(osMessageQueueId_t mq_id) 13211bd4fe43Sopenharmony_ci{ 13221bd4fe43Sopenharmony_ci uint32_t count; 13231bd4fe43Sopenharmony_ci UINTPTR uwIntSave; 13241bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 13251bd4fe43Sopenharmony_ci 13261bd4fe43Sopenharmony_ci if (pstQueue == NULL) { 13271bd4fe43Sopenharmony_ci count = 0U; 13281bd4fe43Sopenharmony_ci } else { 13291bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 13301bd4fe43Sopenharmony_ci count = (uint32_t)(pstQueue->readWriteableCnt[OS_QUEUE_READ]); 13311bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 13321bd4fe43Sopenharmony_ci } 13331bd4fe43Sopenharmony_ci return count; 13341bd4fe43Sopenharmony_ci} 13351bd4fe43Sopenharmony_ci 13361bd4fe43Sopenharmony_ci 13371bd4fe43Sopenharmony_ciuint32_t osMessageQueueGetSpace(osMessageQueueId_t mq_id) 13381bd4fe43Sopenharmony_ci{ 13391bd4fe43Sopenharmony_ci uint32_t space; 13401bd4fe43Sopenharmony_ci UINTPTR uwIntSave; 13411bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 13421bd4fe43Sopenharmony_ci 13431bd4fe43Sopenharmony_ci if (pstQueue == NULL) { 13441bd4fe43Sopenharmony_ci space = 0U; 13451bd4fe43Sopenharmony_ci } else { 13461bd4fe43Sopenharmony_ci uwIntSave = LOS_IntLock(); 13471bd4fe43Sopenharmony_ci space = (uint32_t)pstQueue->readWriteableCnt[OS_QUEUE_WRITE]; 13481bd4fe43Sopenharmony_ci LOS_IntRestore(uwIntSave); 13491bd4fe43Sopenharmony_ci } 13501bd4fe43Sopenharmony_ci return space; 13511bd4fe43Sopenharmony_ci} 13521bd4fe43Sopenharmony_ci 13531bd4fe43Sopenharmony_ciosStatus_t osMessageQueueDelete(osMessageQueueId_t mq_id) 13541bd4fe43Sopenharmony_ci{ 13551bd4fe43Sopenharmony_ci LosQueueCB *pstQueue = (LosQueueCB *)mq_id; 13561bd4fe43Sopenharmony_ci UINT32 uwRet; 13571bd4fe43Sopenharmony_ci 13581bd4fe43Sopenharmony_ci if (pstQueue == NULL) { 13591bd4fe43Sopenharmony_ci return osErrorParameter; 13601bd4fe43Sopenharmony_ci } 13611bd4fe43Sopenharmony_ci 13621bd4fe43Sopenharmony_ci if (OS_INT_ACTIVE) { 13631bd4fe43Sopenharmony_ci return osErrorISR; 13641bd4fe43Sopenharmony_ci } 13651bd4fe43Sopenharmony_ci 13661bd4fe43Sopenharmony_ci uwRet = LOS_QueueDelete((UINT32)pstQueue->queueID); 13671bd4fe43Sopenharmony_ci if (uwRet == LOS_OK) { 13681bd4fe43Sopenharmony_ci return osOK; 13691bd4fe43Sopenharmony_ci } else if (uwRet == LOS_ERRNO_QUEUE_NOT_FOUND || uwRet == LOS_ERRNO_QUEUE_NOT_CREATE) { 13701bd4fe43Sopenharmony_ci return osErrorParameter; 13711bd4fe43Sopenharmony_ci } else { 13721bd4fe43Sopenharmony_ci return osErrorResource; 13731bd4fe43Sopenharmony_ci } 13741bd4fe43Sopenharmony_ci} 13751bd4fe43Sopenharmony_civoid osThreadExit(void) 13761bd4fe43Sopenharmony_ci{ 13771bd4fe43Sopenharmony_ci return; 13781bd4fe43Sopenharmony_ci} 13791bd4fe43Sopenharmony_ci#endif 13801bd4fe43Sopenharmony_ci 13811bd4fe43Sopenharmony_ci#endif // (CMSIS_OS_VER == 2) 13821bd4fe43Sopenharmony_ci#ifdef __cplusplus 13831bd4fe43Sopenharmony_ci#if __cplusplus 13841bd4fe43Sopenharmony_ci} 13851bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 13861bd4fe43Sopenharmony_ci#endif /* __cplusplus */ 1387