xref: /kernel/liteos_m/kal/cmsis/cmsis_liteos2.c (revision 3d8536b4)
13d8536b4Sopenharmony_ci/*
23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
33d8536b4Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
43d8536b4Sopenharmony_ci *
53d8536b4Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
63d8536b4Sopenharmony_ci * are permitted provided that the following conditions are met:
73d8536b4Sopenharmony_ci *
83d8536b4Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
93d8536b4Sopenharmony_ci *    conditions and the following disclaimer.
103d8536b4Sopenharmony_ci *
113d8536b4Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
123d8536b4Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
133d8536b4Sopenharmony_ci *    provided with the distribution.
143d8536b4Sopenharmony_ci *
153d8536b4Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
163d8536b4Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
173d8536b4Sopenharmony_ci *    permission.
183d8536b4Sopenharmony_ci *
193d8536b4Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
203d8536b4Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
213d8536b4Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
223d8536b4Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
233d8536b4Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
243d8536b4Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
253d8536b4Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
263d8536b4Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
273d8536b4Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
283d8536b4Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
293d8536b4Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
303d8536b4Sopenharmony_ci */
313d8536b4Sopenharmony_ci
323d8536b4Sopenharmony_ci#include "cmsis_os2.h"
333d8536b4Sopenharmony_ci#include "kal.h"
343d8536b4Sopenharmony_ci#include "los_event.h"
353d8536b4Sopenharmony_ci#include "los_membox.h"
363d8536b4Sopenharmony_ci#include "los_memory.h"
373d8536b4Sopenharmony_ci#include "los_interrupt.h"
383d8536b4Sopenharmony_ci#include "los_mux.h"
393d8536b4Sopenharmony_ci#include "los_queue.h"
403d8536b4Sopenharmony_ci#include "los_sem.h"
413d8536b4Sopenharmony_ci#include "los_swtmr.h"
423d8536b4Sopenharmony_ci#include "los_task.h"
433d8536b4Sopenharmony_ci#include "los_timer.h"
443d8536b4Sopenharmony_ci#include "los_debug.h"
453d8536b4Sopenharmony_ci#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
463d8536b4Sopenharmony_ci#include "los_arch.h"
473d8536b4Sopenharmony_ci#endif
483d8536b4Sopenharmony_ci
493d8536b4Sopenharmony_ci#include "string.h"
503d8536b4Sopenharmony_ci#include "securec.h"
513d8536b4Sopenharmony_ci
523d8536b4Sopenharmony_ci/* Kernel initialization state */
533d8536b4Sopenharmony_cistatic osKernelState_t g_kernelState;
543d8536b4Sopenharmony_ci
553d8536b4Sopenharmony_ciextern BOOL g_taskScheduled;
563d8536b4Sopenharmony_ci
573d8536b4Sopenharmony_ci/* LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO <---> osPriorityNormal */
583d8536b4Sopenharmony_ci#define LOS_PRIORITY(cmsisPriority) (LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO - ((cmsisPriority) - osPriorityNormal))
593d8536b4Sopenharmony_ci#define CMSIS_PRIORITY(losPriority) (osPriorityNormal + (LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO - (losPriority)))
603d8536b4Sopenharmony_ci
613d8536b4Sopenharmony_ci/* OS_TASK_PRIORITY_HIGHEST and OS_TASK_PRIORITY_LOWEST is reserved for internal TIMER and IDLE task use only. */
623d8536b4Sopenharmony_ci#define ISVALID_LOS_PRIORITY(losPrio) ((losPrio) > OS_TASK_PRIORITY_HIGHEST && (losPrio) < OS_TASK_PRIORITY_LOWEST)
633d8536b4Sopenharmony_ci
643d8536b4Sopenharmony_ciconst osVersion_t g_stLosVersion = { 001, 001 };
653d8536b4Sopenharmony_ci
663d8536b4Sopenharmony_ci#define LITEOS_VERSION_MAJOR 1
673d8536b4Sopenharmony_ci#define LITEOS_VERSION_MINOR 0
683d8536b4Sopenharmony_ci#define LITEOS_VERSION_BUILD 0
693d8536b4Sopenharmony_ci
703d8536b4Sopenharmony_ci/* Kernel version and identification string definition */
713d8536b4Sopenharmony_ci#define KERNEL_VERSION            (((UINT32)LITEOS_VERSION_MAJOR * 10000000UL) | \
723d8536b4Sopenharmony_ci                                   ((UINT32)LITEOS_VERSION_MINOR *    10000UL) | \
733d8536b4Sopenharmony_ci                                   ((UINT32)LITEOS_VERSION_BUILD *        1UL))
743d8536b4Sopenharmony_ci
753d8536b4Sopenharmony_ci#define KERNEL_ID "HUAWEI-LiteOS"
763d8536b4Sopenharmony_ci
773d8536b4Sopenharmony_ci#define KERNEL_UNLOCKED 0
783d8536b4Sopenharmony_ci#define KERNEL_LOCKED   1
793d8536b4Sopenharmony_ci
803d8536b4Sopenharmony_ci//  ==== Kernel Management Functions ====
813d8536b4Sopenharmony_ciosStatus_t osKernelInitialize(void)
823d8536b4Sopenharmony_ci{
833d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
843d8536b4Sopenharmony_ci        return osErrorISR;
853d8536b4Sopenharmony_ci    }
863d8536b4Sopenharmony_ci
873d8536b4Sopenharmony_ci    if (g_kernelState != osKernelInactive) {
883d8536b4Sopenharmony_ci        return osError;
893d8536b4Sopenharmony_ci    }
903d8536b4Sopenharmony_ci
913d8536b4Sopenharmony_ci    if (LOS_KernelInit() == LOS_OK) {
923d8536b4Sopenharmony_ci        g_kernelState = osKernelReady;
933d8536b4Sopenharmony_ci        return osOK;
943d8536b4Sopenharmony_ci    } else {
953d8536b4Sopenharmony_ci        return osError;
963d8536b4Sopenharmony_ci    }
973d8536b4Sopenharmony_ci}
983d8536b4Sopenharmony_ci
993d8536b4Sopenharmony_ciosStatus_t osKernelGetInfo(osVersion_t *version, char *id_buf, uint32_t id_size)
1003d8536b4Sopenharmony_ci{
1013d8536b4Sopenharmony_ci    errno_t ret;
1023d8536b4Sopenharmony_ci
1033d8536b4Sopenharmony_ci    if ((version == NULL) || (id_buf == NULL) || (id_size == 0)) {
1043d8536b4Sopenharmony_ci        return osError;
1053d8536b4Sopenharmony_ci    }
1063d8536b4Sopenharmony_ci
1073d8536b4Sopenharmony_ci    ret = memcpy_s(id_buf, id_size, KERNEL_ID, sizeof(KERNEL_ID));
1083d8536b4Sopenharmony_ci    if (ret == EOK) {
1093d8536b4Sopenharmony_ci        version->api = g_stLosVersion.api;
1103d8536b4Sopenharmony_ci        version->kernel = g_stLosVersion.kernel;
1113d8536b4Sopenharmony_ci        return osOK;
1123d8536b4Sopenharmony_ci    } else {
1133d8536b4Sopenharmony_ci        PRINT_ERR("[%s] memcpy_s failed, error type = %d\n", __func__, ret);
1143d8536b4Sopenharmony_ci        return osError;
1153d8536b4Sopenharmony_ci    }
1163d8536b4Sopenharmony_ci}
1173d8536b4Sopenharmony_ci
1183d8536b4Sopenharmony_ciosKernelState_t osKernelGetState(void)
1193d8536b4Sopenharmony_ci{
1203d8536b4Sopenharmony_ci    if (!g_taskScheduled) {
1213d8536b4Sopenharmony_ci        if (g_kernelState == osKernelReady) {
1223d8536b4Sopenharmony_ci            return osKernelReady;
1233d8536b4Sopenharmony_ci        } else {
1243d8536b4Sopenharmony_ci            return osKernelInactive;
1253d8536b4Sopenharmony_ci        }
1263d8536b4Sopenharmony_ci    } else if (g_losTaskLock > 0) {
1273d8536b4Sopenharmony_ci        return osKernelLocked;
1283d8536b4Sopenharmony_ci    } else {
1293d8536b4Sopenharmony_ci        return osKernelRunning;
1303d8536b4Sopenharmony_ci    }
1313d8536b4Sopenharmony_ci}
1323d8536b4Sopenharmony_ci
1333d8536b4Sopenharmony_ciosStatus_t osKernelStart(void)
1343d8536b4Sopenharmony_ci{
1353d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
1363d8536b4Sopenharmony_ci        return osErrorISR;
1373d8536b4Sopenharmony_ci    }
1383d8536b4Sopenharmony_ci    if (g_kernelState != osKernelReady) {
1393d8536b4Sopenharmony_ci        return osError;
1403d8536b4Sopenharmony_ci    }
1413d8536b4Sopenharmony_ci
1423d8536b4Sopenharmony_ci    if (LOS_Start() == LOS_OK) {
1433d8536b4Sopenharmony_ci        g_kernelState = osKernelRunning;
1443d8536b4Sopenharmony_ci        return osOK;
1453d8536b4Sopenharmony_ci    } else {
1463d8536b4Sopenharmony_ci        return osError;
1473d8536b4Sopenharmony_ci    }
1483d8536b4Sopenharmony_ci}
1493d8536b4Sopenharmony_ci
1503d8536b4Sopenharmony_ciint32_t osKernelLock(void)
1513d8536b4Sopenharmony_ci{
1523d8536b4Sopenharmony_ci    int32_t lock;
1533d8536b4Sopenharmony_ci
1543d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
1553d8536b4Sopenharmony_ci        return (int32_t)osErrorISR;
1563d8536b4Sopenharmony_ci    }
1573d8536b4Sopenharmony_ci
1583d8536b4Sopenharmony_ci    if (!g_taskScheduled) {
1593d8536b4Sopenharmony_ci        return (int32_t)osError;
1603d8536b4Sopenharmony_ci    }
1613d8536b4Sopenharmony_ci
1623d8536b4Sopenharmony_ci    if (g_losTaskLock > 0) {
1633d8536b4Sopenharmony_ci        lock = KERNEL_LOCKED;
1643d8536b4Sopenharmony_ci    } else {
1653d8536b4Sopenharmony_ci        LOS_TaskLock();
1663d8536b4Sopenharmony_ci        lock = KERNEL_UNLOCKED;
1673d8536b4Sopenharmony_ci    }
1683d8536b4Sopenharmony_ci
1693d8536b4Sopenharmony_ci    return lock;
1703d8536b4Sopenharmony_ci}
1713d8536b4Sopenharmony_ci
1723d8536b4Sopenharmony_ciint32_t osKernelUnlock(void)
1733d8536b4Sopenharmony_ci{
1743d8536b4Sopenharmony_ci    int32_t lock;
1753d8536b4Sopenharmony_ci
1763d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
1773d8536b4Sopenharmony_ci        return (int32_t)osErrorISR;
1783d8536b4Sopenharmony_ci    }
1793d8536b4Sopenharmony_ci
1803d8536b4Sopenharmony_ci    if (!g_taskScheduled) {
1813d8536b4Sopenharmony_ci        return (int32_t)osError;
1823d8536b4Sopenharmony_ci    }
1833d8536b4Sopenharmony_ci
1843d8536b4Sopenharmony_ci    if (g_losTaskLock > 0) {
1853d8536b4Sopenharmony_ci        LOS_TaskUnlock();
1863d8536b4Sopenharmony_ci        if (g_losTaskLock != 0) {
1873d8536b4Sopenharmony_ci            return (int32_t)osError;
1883d8536b4Sopenharmony_ci        }
1893d8536b4Sopenharmony_ci        lock = KERNEL_LOCKED;
1903d8536b4Sopenharmony_ci    } else {
1913d8536b4Sopenharmony_ci        lock = KERNEL_UNLOCKED;
1923d8536b4Sopenharmony_ci    }
1933d8536b4Sopenharmony_ci
1943d8536b4Sopenharmony_ci    return lock;
1953d8536b4Sopenharmony_ci}
1963d8536b4Sopenharmony_ci
1973d8536b4Sopenharmony_ciint32_t osKernelRestoreLock(int32_t lock)
1983d8536b4Sopenharmony_ci{
1993d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
2003d8536b4Sopenharmony_ci        return (int32_t)osErrorISR;
2013d8536b4Sopenharmony_ci    }
2023d8536b4Sopenharmony_ci
2033d8536b4Sopenharmony_ci    if (!g_taskScheduled) {
2043d8536b4Sopenharmony_ci        return (int32_t)osError;
2053d8536b4Sopenharmony_ci    }
2063d8536b4Sopenharmony_ci
2073d8536b4Sopenharmony_ci    switch (lock) {
2083d8536b4Sopenharmony_ci        case KERNEL_UNLOCKED:
2093d8536b4Sopenharmony_ci            LOS_TaskUnlock();
2103d8536b4Sopenharmony_ci            if (g_losTaskLock != 0) {
2113d8536b4Sopenharmony_ci                break;
2123d8536b4Sopenharmony_ci            }
2133d8536b4Sopenharmony_ci            return KERNEL_UNLOCKED;
2143d8536b4Sopenharmony_ci        case KERNEL_LOCKED:
2153d8536b4Sopenharmony_ci            LOS_TaskLock();
2163d8536b4Sopenharmony_ci            return KERNEL_LOCKED;
2173d8536b4Sopenharmony_ci        default:
2183d8536b4Sopenharmony_ci            break;
2193d8536b4Sopenharmony_ci    }
2203d8536b4Sopenharmony_ci
2213d8536b4Sopenharmony_ci    return (int32_t)osError;
2223d8536b4Sopenharmony_ci}
2233d8536b4Sopenharmony_ci
2243d8536b4Sopenharmony_ciuint32_t osKernelGetTickCount(void)
2253d8536b4Sopenharmony_ci{
2263d8536b4Sopenharmony_ci    uint64_t ticks = LOS_TickCountGet();
2273d8536b4Sopenharmony_ci    return (uint32_t)ticks;
2283d8536b4Sopenharmony_ci}
2293d8536b4Sopenharmony_ci
2303d8536b4Sopenharmony_ciuint32_t osKernelGetTickFreq(void)
2313d8536b4Sopenharmony_ci{
2323d8536b4Sopenharmony_ci    return (uint32_t)LOSCFG_BASE_CORE_TICK_PER_SECOND;
2333d8536b4Sopenharmony_ci}
2343d8536b4Sopenharmony_ci
2353d8536b4Sopenharmony_ciuint32_t osKernelGetSysTimerCount(void)
2363d8536b4Sopenharmony_ci{
2373d8536b4Sopenharmony_ci    return (uint32_t)LOS_SysCycleGet();
2383d8536b4Sopenharmony_ci}
2393d8536b4Sopenharmony_ci
2403d8536b4Sopenharmony_ciuint32_t osKernelGetSysTimerFreq(void)
2413d8536b4Sopenharmony_ci{
2423d8536b4Sopenharmony_ci    return g_sysClock;
2433d8536b4Sopenharmony_ci}
2443d8536b4Sopenharmony_ci
2453d8536b4Sopenharmony_ci//  ==== Thread Management Functions ====
2463d8536b4Sopenharmony_ciosThreadId_t osThreadNew(osThreadFunc_t func, void *argument, const osThreadAttr_t *attr)
2473d8536b4Sopenharmony_ci{
2483d8536b4Sopenharmony_ci    UINT32 tid;
2493d8536b4Sopenharmony_ci    UINT32 ret;
2503d8536b4Sopenharmony_ci    osThreadAttr_t attrTemp = {0};
2513d8536b4Sopenharmony_ci    TSK_INIT_PARAM_S stTskInitParam = {0};
2523d8536b4Sopenharmony_ci    UINT16 priority;
2533d8536b4Sopenharmony_ci
2543d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || (func == NULL)) {
2553d8536b4Sopenharmony_ci        return (osThreadId_t)NULL;
2563d8536b4Sopenharmony_ci    }
2573d8536b4Sopenharmony_ci
2583d8536b4Sopenharmony_ci    if (attr == NULL) {
2593d8536b4Sopenharmony_ci        attrTemp.priority = osPriorityNormal,
2603d8536b4Sopenharmony_ci        attr = &attrTemp;
2613d8536b4Sopenharmony_ci    }
2623d8536b4Sopenharmony_ci
2633d8536b4Sopenharmony_ci    priority = LOS_PRIORITY(attr->priority);
2643d8536b4Sopenharmony_ci    if (!ISVALID_LOS_PRIORITY(priority)) {
2653d8536b4Sopenharmony_ci        /* unsupported priority */
2663d8536b4Sopenharmony_ci        return (osThreadId_t)NULL;
2673d8536b4Sopenharmony_ci    }
2683d8536b4Sopenharmony_ci    stTskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)func;
2693d8536b4Sopenharmony_ci    stTskInitParam.uwArg = (UINT32)argument;
2703d8536b4Sopenharmony_ci    if ((attr->stack_mem != NULL) && (attr->stack_size != 0)) {
2713d8536b4Sopenharmony_ci        stTskInitParam.stackAddr = (UINTPTR)attr->stack_mem;
2723d8536b4Sopenharmony_ci        stTskInitParam.uwStackSize = attr->stack_size;
2733d8536b4Sopenharmony_ci    } else if (attr->stack_size != 0) {
2743d8536b4Sopenharmony_ci        stTskInitParam.uwStackSize = attr->stack_size;
2753d8536b4Sopenharmony_ci    } else {
2763d8536b4Sopenharmony_ci        stTskInitParam.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
2773d8536b4Sopenharmony_ci    }
2783d8536b4Sopenharmony_ci    if (attr->name != NULL) {
2793d8536b4Sopenharmony_ci        stTskInitParam.pcName = (char *)attr->name;
2803d8536b4Sopenharmony_ci    } else {
2813d8536b4Sopenharmony_ci        stTskInitParam.pcName = "CmsisTask";
2823d8536b4Sopenharmony_ci    }
2833d8536b4Sopenharmony_ci    if (attr->attr_bits == osThreadJoinable) {
2843d8536b4Sopenharmony_ci        stTskInitParam.uwResved = LOS_TASK_ATTR_JOINABLE;
2853d8536b4Sopenharmony_ci    }
2863d8536b4Sopenharmony_ci    stTskInitParam.usTaskPrio = priority;
2873d8536b4Sopenharmony_ci    ret = LOS_TaskCreate(&tid, &stTskInitParam);
2883d8536b4Sopenharmony_ci    if (ret != LOS_OK) {
2893d8536b4Sopenharmony_ci        return (osThreadId_t)NULL;
2903d8536b4Sopenharmony_ci    }
2913d8536b4Sopenharmony_ci
2923d8536b4Sopenharmony_ci    return (osThreadId_t)OS_TCB_FROM_TID(tid);
2933d8536b4Sopenharmony_ci}
2943d8536b4Sopenharmony_ci
2953d8536b4Sopenharmony_ciconst char *osThreadGetName(osThreadId_t thread_id)
2963d8536b4Sopenharmony_ci{
2973d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
2983d8536b4Sopenharmony_ci
2993d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || thread_id == NULL) {
3003d8536b4Sopenharmony_ci        return NULL;
3013d8536b4Sopenharmony_ci    }
3023d8536b4Sopenharmony_ci
3033d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
3043d8536b4Sopenharmony_ci
3053d8536b4Sopenharmony_ci    return pstTaskCB->taskName;
3063d8536b4Sopenharmony_ci}
3073d8536b4Sopenharmony_ci
3083d8536b4Sopenharmony_ciosThreadId_t osThreadGetId(void)
3093d8536b4Sopenharmony_ci{
3103d8536b4Sopenharmony_ci    return (osThreadId_t)(g_losTask.runTask);
3113d8536b4Sopenharmony_ci}
3123d8536b4Sopenharmony_ci
3133d8536b4Sopenharmony_civoid *osThreadGetArgument(void)
3143d8536b4Sopenharmony_ci{
3153d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
3163d8536b4Sopenharmony_ci        return 0;
3173d8536b4Sopenharmony_ci    }
3183d8536b4Sopenharmony_ci
3193d8536b4Sopenharmony_ci    LosTaskCB *taskCb = (LosTaskCB *)osThreadGetId();
3203d8536b4Sopenharmony_ci    if (taskCb == NULL) {
3213d8536b4Sopenharmony_ci        return NULL;
3223d8536b4Sopenharmony_ci    }
3233d8536b4Sopenharmony_ci    return (void *)(taskCb->arg);
3243d8536b4Sopenharmony_ci}
3253d8536b4Sopenharmony_ci
3263d8536b4Sopenharmony_ciosThreadState_t osThreadGetState(osThreadId_t thread_id)
3273d8536b4Sopenharmony_ci{
3283d8536b4Sopenharmony_ci    UINT16 taskStatus;
3293d8536b4Sopenharmony_ci    osThreadState_t stState;
3303d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
3313d8536b4Sopenharmony_ci
3323d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || thread_id == NULL) {
3333d8536b4Sopenharmony_ci        return osThreadError;
3343d8536b4Sopenharmony_ci    }
3353d8536b4Sopenharmony_ci
3363d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
3373d8536b4Sopenharmony_ci    taskStatus = pstTaskCB->taskStatus;
3383d8536b4Sopenharmony_ci
3393d8536b4Sopenharmony_ci    if (taskStatus & OS_TASK_STATUS_RUNNING) {
3403d8536b4Sopenharmony_ci        stState = osThreadRunning;
3413d8536b4Sopenharmony_ci    } else if (taskStatus & OS_TASK_STATUS_READY) {
3423d8536b4Sopenharmony_ci        stState = osThreadReady;
3433d8536b4Sopenharmony_ci    } else if (taskStatus &
3443d8536b4Sopenharmony_ci        (OS_TASK_STATUS_DELAY | OS_TASK_STATUS_PEND |
3453d8536b4Sopenharmony_ci         OS_TASK_STATUS_SUSPEND | OS_TASK_STATUS_PEND_TIME)) {
3463d8536b4Sopenharmony_ci        stState = osThreadBlocked;
3473d8536b4Sopenharmony_ci    } else if (taskStatus & OS_TASK_STATUS_UNUSED) {
3483d8536b4Sopenharmony_ci        stState = osThreadInactive;
3493d8536b4Sopenharmony_ci    } else {
3503d8536b4Sopenharmony_ci        stState = osThreadError;
3513d8536b4Sopenharmony_ci    }
3523d8536b4Sopenharmony_ci
3533d8536b4Sopenharmony_ci    return stState;
3543d8536b4Sopenharmony_ci}
3553d8536b4Sopenharmony_ci
3563d8536b4Sopenharmony_ciuint32_t osThreadGetStackSize(osThreadId_t thread_id)
3573d8536b4Sopenharmony_ci{
3583d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
3593d8536b4Sopenharmony_ci
3603d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || thread_id == NULL) {
3613d8536b4Sopenharmony_ci        return 0U;
3623d8536b4Sopenharmony_ci    }
3633d8536b4Sopenharmony_ci
3643d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
3653d8536b4Sopenharmony_ci
3663d8536b4Sopenharmony_ci    return pstTaskCB->stackSize;
3673d8536b4Sopenharmony_ci}
3683d8536b4Sopenharmony_ci
3693d8536b4Sopenharmony_ciuint32_t osTaskStackWaterMarkGet(UINT32 taskID)
3703d8536b4Sopenharmony_ci{
3713d8536b4Sopenharmony_ci    UINT32 count = 0;
3723d8536b4Sopenharmony_ci    UINT32 *ptopOfStack = NULL;
3733d8536b4Sopenharmony_ci    UINT32 intSave;
3743d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
3753d8536b4Sopenharmony_ci
3763d8536b4Sopenharmony_ci    if (taskID > LOSCFG_BASE_CORE_TSK_LIMIT) {
3773d8536b4Sopenharmony_ci        return 0;
3783d8536b4Sopenharmony_ci    }
3793d8536b4Sopenharmony_ci
3803d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
3813d8536b4Sopenharmony_ci
3823d8536b4Sopenharmony_ci    pstTaskCB = OS_TCB_FROM_TID(taskID);
3833d8536b4Sopenharmony_ci    if (OS_TASK_STATUS_UNUSED & (pstTaskCB->taskStatus)) {
3843d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
3853d8536b4Sopenharmony_ci        return 0;
3863d8536b4Sopenharmony_ci    }
3873d8536b4Sopenharmony_ci
3883d8536b4Sopenharmony_ci    // first 4 bytes is OS_TASK_MAGIC_WORD, skip
3893d8536b4Sopenharmony_ci    ptopOfStack = (UINT32 *)(UINTPTR)pstTaskCB->topOfStack + 1;
3903d8536b4Sopenharmony_ci
3913d8536b4Sopenharmony_ci    while (*ptopOfStack == (UINT32)OS_TASK_STACK_INIT) {
3923d8536b4Sopenharmony_ci        ++ptopOfStack;
3933d8536b4Sopenharmony_ci        ++count;
3943d8536b4Sopenharmony_ci    }
3953d8536b4Sopenharmony_ci
3963d8536b4Sopenharmony_ci    count *= sizeof(UINT32);
3973d8536b4Sopenharmony_ci
3983d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
3993d8536b4Sopenharmony_ci    return count;
4003d8536b4Sopenharmony_ci}
4013d8536b4Sopenharmony_ci
4023d8536b4Sopenharmony_ciuint32_t osThreadGetStackSpace(osThreadId_t thread_id)
4033d8536b4Sopenharmony_ci{
4043d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
4053d8536b4Sopenharmony_ci
4063d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || thread_id == NULL) {
4073d8536b4Sopenharmony_ci        return 0U;
4083d8536b4Sopenharmony_ci    }
4093d8536b4Sopenharmony_ci
4103d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
4113d8536b4Sopenharmony_ci
4123d8536b4Sopenharmony_ci    return osTaskStackWaterMarkGet(pstTaskCB->taskID);
4133d8536b4Sopenharmony_ci}
4143d8536b4Sopenharmony_ci
4153d8536b4Sopenharmony_ciosStatus_t osThreadSetPriority(osThreadId_t thread_id, osPriority_t priority)
4163d8536b4Sopenharmony_ci{
4173d8536b4Sopenharmony_ci    UINT32 ret;
4183d8536b4Sopenharmony_ci    UINT16 prio;
4193d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
4203d8536b4Sopenharmony_ci
4213d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
4223d8536b4Sopenharmony_ci        return osErrorISR;
4233d8536b4Sopenharmony_ci    }
4243d8536b4Sopenharmony_ci
4253d8536b4Sopenharmony_ci    if (thread_id == NULL) {
4263d8536b4Sopenharmony_ci        return osErrorParameter;
4273d8536b4Sopenharmony_ci    }
4283d8536b4Sopenharmony_ci
4293d8536b4Sopenharmony_ci    prio = LOS_PRIORITY(priority);
4303d8536b4Sopenharmony_ci    if (!ISVALID_LOS_PRIORITY(prio)) {
4313d8536b4Sopenharmony_ci        return osErrorParameter;
4323d8536b4Sopenharmony_ci    }
4333d8536b4Sopenharmony_ci
4343d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
4353d8536b4Sopenharmony_ci    ret = LOS_TaskPriSet(pstTaskCB->taskID, prio);
4363d8536b4Sopenharmony_ci    switch (ret) {
4373d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_PRIOR_ERROR:
4383d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_OPERATE_SYSTEM_TASK:
4393d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_ID_INVALID:
4403d8536b4Sopenharmony_ci            return osErrorParameter;
4413d8536b4Sopenharmony_ci
4423d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_NOT_CREATED:
4433d8536b4Sopenharmony_ci            return osErrorResource;
4443d8536b4Sopenharmony_ci
4453d8536b4Sopenharmony_ci        default:
4463d8536b4Sopenharmony_ci            return osOK;
4473d8536b4Sopenharmony_ci    }
4483d8536b4Sopenharmony_ci}
4493d8536b4Sopenharmony_ci
4503d8536b4Sopenharmony_ciosPriority_t osThreadGetPriority(osThreadId_t thread_id)
4513d8536b4Sopenharmony_ci{
4523d8536b4Sopenharmony_ci    UINT16 ret;
4533d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
4543d8536b4Sopenharmony_ci
4553d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE || thread_id == NULL) {
4563d8536b4Sopenharmony_ci        return osPriorityError;
4573d8536b4Sopenharmony_ci    }
4583d8536b4Sopenharmony_ci
4593d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
4603d8536b4Sopenharmony_ci    ret = LOS_TaskPriGet(pstTaskCB->taskID);
4613d8536b4Sopenharmony_ci
4623d8536b4Sopenharmony_ci    if ((ret == (UINT16)OS_INVALID) || (ret > OS_TASK_PRIORITY_LOWEST)) {
4633d8536b4Sopenharmony_ci        return osPriorityError;
4643d8536b4Sopenharmony_ci    }
4653d8536b4Sopenharmony_ci
4663d8536b4Sopenharmony_ci    return (osPriority_t)CMSIS_PRIORITY(ret);
4673d8536b4Sopenharmony_ci}
4683d8536b4Sopenharmony_ci
4693d8536b4Sopenharmony_ciosStatus_t osThreadYield(void)
4703d8536b4Sopenharmony_ci{
4713d8536b4Sopenharmony_ci    UINT32 ret;
4723d8536b4Sopenharmony_ci
4733d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
4743d8536b4Sopenharmony_ci        return osErrorISR;
4753d8536b4Sopenharmony_ci    }
4763d8536b4Sopenharmony_ci
4773d8536b4Sopenharmony_ci    ret = LOS_TaskYield();
4783d8536b4Sopenharmony_ci
4793d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
4803d8536b4Sopenharmony_ci        return osOK;
4813d8536b4Sopenharmony_ci    }
4823d8536b4Sopenharmony_ci
4833d8536b4Sopenharmony_ci    return osError;
4843d8536b4Sopenharmony_ci}
4853d8536b4Sopenharmony_ci
4863d8536b4Sopenharmony_ciosStatus_t osThreadSuspend(osThreadId_t thread_id)
4873d8536b4Sopenharmony_ci{
4883d8536b4Sopenharmony_ci    UINT32 ret;
4893d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
4903d8536b4Sopenharmony_ci
4913d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
4923d8536b4Sopenharmony_ci        return osErrorISR;
4933d8536b4Sopenharmony_ci    }
4943d8536b4Sopenharmony_ci
4953d8536b4Sopenharmony_ci    if (thread_id == NULL) {
4963d8536b4Sopenharmony_ci        return osErrorParameter;
4973d8536b4Sopenharmony_ci    }
4983d8536b4Sopenharmony_ci
4993d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
5003d8536b4Sopenharmony_ci    ret = LOS_TaskSuspend(pstTaskCB->taskID);
5013d8536b4Sopenharmony_ci    switch (ret) {
5023d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_OPERATE_IDLE:
5033d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED:
5043d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_ID_INVALID:
5053d8536b4Sopenharmony_ci            return osErrorParameter;
5063d8536b4Sopenharmony_ci
5073d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_NOT_CREATED:
5083d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_ALREADY_SUSPENDED:
5093d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_SUSPEND_LOCKED:
5103d8536b4Sopenharmony_ci            return osErrorResource;
5113d8536b4Sopenharmony_ci
5123d8536b4Sopenharmony_ci        default:
5133d8536b4Sopenharmony_ci            return osOK;
5143d8536b4Sopenharmony_ci    }
5153d8536b4Sopenharmony_ci}
5163d8536b4Sopenharmony_ci
5173d8536b4Sopenharmony_ciosStatus_t osThreadResume(osThreadId_t thread_id)
5183d8536b4Sopenharmony_ci{
5193d8536b4Sopenharmony_ci    UINT32 ret;
5203d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
5213d8536b4Sopenharmony_ci
5223d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
5233d8536b4Sopenharmony_ci        return osErrorISR;
5243d8536b4Sopenharmony_ci    }
5253d8536b4Sopenharmony_ci
5263d8536b4Sopenharmony_ci    if (thread_id == NULL) {
5273d8536b4Sopenharmony_ci        return osErrorParameter;
5283d8536b4Sopenharmony_ci    }
5293d8536b4Sopenharmony_ci
5303d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
5313d8536b4Sopenharmony_ci    ret = LOS_TaskResume(pstTaskCB->taskID);
5323d8536b4Sopenharmony_ci
5333d8536b4Sopenharmony_ci    switch (ret) {
5343d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_ID_INVALID:
5353d8536b4Sopenharmony_ci            return osErrorParameter;
5363d8536b4Sopenharmony_ci
5373d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_NOT_CREATED:
5383d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_NOT_SUSPENDED:
5393d8536b4Sopenharmony_ci            return osErrorResource;
5403d8536b4Sopenharmony_ci
5413d8536b4Sopenharmony_ci        default:
5423d8536b4Sopenharmony_ci            return osOK;
5433d8536b4Sopenharmony_ci    }
5443d8536b4Sopenharmony_ci}
5453d8536b4Sopenharmony_ci
5463d8536b4Sopenharmony_ciosStatus_t osThreadDetach(osThreadId_t thread_id)
5473d8536b4Sopenharmony_ci{
5483d8536b4Sopenharmony_ci    UINT32 ret;
5493d8536b4Sopenharmony_ci    LosTaskCB *taskCB = (LosTaskCB *)thread_id;
5503d8536b4Sopenharmony_ci
5513d8536b4Sopenharmony_ci    if (thread_id == NULL) {
5523d8536b4Sopenharmony_ci        return osErrorParameter;
5533d8536b4Sopenharmony_ci    }
5543d8536b4Sopenharmony_ci
5553d8536b4Sopenharmony_ci    ret = LOS_TaskDetach(taskCB->taskID);
5563d8536b4Sopenharmony_ci    if (ret == LOS_ERRNO_TSK_NOT_ALLOW_IN_INT) {
5573d8536b4Sopenharmony_ci        return osErrorISR;
5583d8536b4Sopenharmony_ci    } else if (ret != LOS_OK) {
5593d8536b4Sopenharmony_ci        return osErrorResource;
5603d8536b4Sopenharmony_ci    }
5613d8536b4Sopenharmony_ci
5623d8536b4Sopenharmony_ci    return osOK;
5633d8536b4Sopenharmony_ci}
5643d8536b4Sopenharmony_ci
5653d8536b4Sopenharmony_ciosStatus_t osThreadJoin(osThreadId_t thread_id)
5663d8536b4Sopenharmony_ci{
5673d8536b4Sopenharmony_ci    UINT32 ret;
5683d8536b4Sopenharmony_ci    LosTaskCB *taskCB = (LosTaskCB *)thread_id;
5693d8536b4Sopenharmony_ci
5703d8536b4Sopenharmony_ci    if (thread_id == NULL) {
5713d8536b4Sopenharmony_ci        return osErrorParameter;
5723d8536b4Sopenharmony_ci    }
5733d8536b4Sopenharmony_ci
5743d8536b4Sopenharmony_ci    ret = LOS_TaskJoin(taskCB->taskID, NULL);
5753d8536b4Sopenharmony_ci    if (ret == LOS_ERRNO_TSK_NOT_ALLOW_IN_INT) {
5763d8536b4Sopenharmony_ci        return osErrorISR;
5773d8536b4Sopenharmony_ci    } else if (ret != LOS_OK) {
5783d8536b4Sopenharmony_ci        return osErrorResource;
5793d8536b4Sopenharmony_ci    }
5803d8536b4Sopenharmony_ci
5813d8536b4Sopenharmony_ci    return osOK;
5823d8536b4Sopenharmony_ci}
5833d8536b4Sopenharmony_ci
5843d8536b4Sopenharmony_ciosStatus_t osThreadTerminate(osThreadId_t thread_id)
5853d8536b4Sopenharmony_ci{
5863d8536b4Sopenharmony_ci    UINT32 ret;
5873d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
5883d8536b4Sopenharmony_ci
5893d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
5903d8536b4Sopenharmony_ci        return osErrorISR;
5913d8536b4Sopenharmony_ci    }
5923d8536b4Sopenharmony_ci
5933d8536b4Sopenharmony_ci    if (thread_id == NULL) {
5943d8536b4Sopenharmony_ci        return osErrorParameter;
5953d8536b4Sopenharmony_ci    }
5963d8536b4Sopenharmony_ci
5973d8536b4Sopenharmony_ci    pstTaskCB = (LosTaskCB *)thread_id;
5983d8536b4Sopenharmony_ci    ret = LOS_TaskDelete(pstTaskCB->taskID);
5993d8536b4Sopenharmony_ci
6003d8536b4Sopenharmony_ci    switch (ret) {
6013d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_OPERATE_IDLE:
6023d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_SUSPEND_SWTMR_NOT_ALLOWED:
6033d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_ID_INVALID:
6043d8536b4Sopenharmony_ci            return osErrorParameter;
6053d8536b4Sopenharmony_ci
6063d8536b4Sopenharmony_ci        case LOS_ERRNO_TSK_NOT_CREATED:
6073d8536b4Sopenharmony_ci            return osErrorResource;
6083d8536b4Sopenharmony_ci
6093d8536b4Sopenharmony_ci        default:
6103d8536b4Sopenharmony_ci            return osOK;
6113d8536b4Sopenharmony_ci    }
6123d8536b4Sopenharmony_ci}
6133d8536b4Sopenharmony_ci
6143d8536b4Sopenharmony_ciuint32_t osThreadGetCount(void)
6153d8536b4Sopenharmony_ci{
6163d8536b4Sopenharmony_ci    uint32_t count = 0;
6173d8536b4Sopenharmony_ci
6183d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
6193d8536b4Sopenharmony_ci        return 0U;
6203d8536b4Sopenharmony_ci    }
6213d8536b4Sopenharmony_ci
6223d8536b4Sopenharmony_ci    for (uint32_t index = 0; index <= LOSCFG_BASE_CORE_TSK_LIMIT; index++) {
6233d8536b4Sopenharmony_ci        if (!((g_taskCBArray + index)->taskStatus & OS_TASK_STATUS_UNUSED)) {
6243d8536b4Sopenharmony_ci            count++;
6253d8536b4Sopenharmony_ci        }
6263d8536b4Sopenharmony_ci    }
6273d8536b4Sopenharmony_ci
6283d8536b4Sopenharmony_ci    return count;
6293d8536b4Sopenharmony_ci}
6303d8536b4Sopenharmony_ci
6313d8536b4Sopenharmony_civoid osThreadExit(void)
6323d8536b4Sopenharmony_ci{
6333d8536b4Sopenharmony_ci    (void)LOS_TaskDelete(LOS_CurTaskIDGet());
6343d8536b4Sopenharmony_ci    UNREACHABLE;
6353d8536b4Sopenharmony_ci}
6363d8536b4Sopenharmony_ci
6373d8536b4Sopenharmony_ci/* before kernel running osDelay is implemented by HalDelay interface */
6383d8536b4Sopenharmony_ciWEAK VOID HalDelay(UINT32 ticks)
6393d8536b4Sopenharmony_ci{
6403d8536b4Sopenharmony_ci
6413d8536b4Sopenharmony_ci}
6423d8536b4Sopenharmony_ci
6433d8536b4Sopenharmony_ciosStatus_t osDelay(uint32_t ticks)
6443d8536b4Sopenharmony_ci{
6453d8536b4Sopenharmony_ci    UINT32 ret;
6463d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
6473d8536b4Sopenharmony_ci        return osErrorISR;
6483d8536b4Sopenharmony_ci    }
6493d8536b4Sopenharmony_ci    if (ticks == 0) {
6503d8536b4Sopenharmony_ci        return osErrorParameter;
6513d8536b4Sopenharmony_ci    }
6523d8536b4Sopenharmony_ci
6533d8536b4Sopenharmony_ci    if (osKernelGetState() != osKernelRunning) {
6543d8536b4Sopenharmony_ci        HalDelay(ticks);
6553d8536b4Sopenharmony_ci        return osOK;
6563d8536b4Sopenharmony_ci    }
6573d8536b4Sopenharmony_ci
6583d8536b4Sopenharmony_ci    ret = LOS_TaskDelay(ticks);
6593d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
6603d8536b4Sopenharmony_ci        return osOK;
6613d8536b4Sopenharmony_ci    } else {
6623d8536b4Sopenharmony_ci        return osError;
6633d8536b4Sopenharmony_ci    }
6643d8536b4Sopenharmony_ci}
6653d8536b4Sopenharmony_ci
6663d8536b4Sopenharmony_ciosStatus_t osDelayUntil(uint32_t ticks)
6673d8536b4Sopenharmony_ci{
6683d8536b4Sopenharmony_ci    UINT32 ret;
6693d8536b4Sopenharmony_ci    UINT32 uwTicks;
6703d8536b4Sopenharmony_ci    UINT32 tickCount = osKernelGetTickCount();
6713d8536b4Sopenharmony_ci
6723d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
6733d8536b4Sopenharmony_ci        return osErrorISR;
6743d8536b4Sopenharmony_ci    }
6753d8536b4Sopenharmony_ci
6763d8536b4Sopenharmony_ci    if (ticks < tickCount) {
6773d8536b4Sopenharmony_ci        return osError;
6783d8536b4Sopenharmony_ci    }
6793d8536b4Sopenharmony_ci
6803d8536b4Sopenharmony_ci    uwTicks = (UINT32)(ticks - tickCount);
6813d8536b4Sopenharmony_ci
6823d8536b4Sopenharmony_ci    ret = LOS_TaskDelay(uwTicks);
6833d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
6843d8536b4Sopenharmony_ci        return osOK;
6853d8536b4Sopenharmony_ci    } else {
6863d8536b4Sopenharmony_ci        return osError;
6873d8536b4Sopenharmony_ci    }
6883d8536b4Sopenharmony_ci}
6893d8536b4Sopenharmony_ci
6903d8536b4Sopenharmony_ci//  ==== Timer Management Functions ====
6913d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR == 1)
6923d8536b4Sopenharmony_ciosTimerId_t osTimerNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr)
6933d8536b4Sopenharmony_ci{
6943d8536b4Sopenharmony_ci    UNUSED(attr);
6953d8536b4Sopenharmony_ci    UINT32 swtmrId;
6963d8536b4Sopenharmony_ci    UINT8 mode;
6973d8536b4Sopenharmony_ci
6983d8536b4Sopenharmony_ci    if ((func == NULL) || OS_INT_ACTIVE) {
6993d8536b4Sopenharmony_ci        return NULL;
7003d8536b4Sopenharmony_ci    }
7013d8536b4Sopenharmony_ci
7023d8536b4Sopenharmony_ci    if (type == osTimerOnce) {
7033d8536b4Sopenharmony_ci        mode = LOS_SWTMR_MODE_NO_SELFDELETE;
7043d8536b4Sopenharmony_ci    } else if (type == osTimerPeriodic) {
7053d8536b4Sopenharmony_ci        mode = LOS_SWTMR_MODE_PERIOD;
7063d8536b4Sopenharmony_ci    } else {
7073d8536b4Sopenharmony_ci        return NULL;
7083d8536b4Sopenharmony_ci    }
7093d8536b4Sopenharmony_ci
7103d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
7113d8536b4Sopenharmony_ci    if (LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &swtmrId, (UINT32)(UINTPTR)argument,
7123d8536b4Sopenharmony_ci        osTimerRousesAllow, osTimerAlignIgnore) != LOS_OK) {
7133d8536b4Sopenharmony_ci        return (osTimerId_t)NULL;
7143d8536b4Sopenharmony_ci    }
7153d8536b4Sopenharmony_ci#else
7163d8536b4Sopenharmony_ci    if (LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &swtmrId, (UINT32)(UINTPTR)argument) != LOS_OK) {
7173d8536b4Sopenharmony_ci        return (osTimerId_t)NULL;
7183d8536b4Sopenharmony_ci    }
7193d8536b4Sopenharmony_ci#endif
7203d8536b4Sopenharmony_ci    return (osTimerId_t)OS_SWT_FROM_SID(swtmrId);
7213d8536b4Sopenharmony_ci}
7223d8536b4Sopenharmony_ci
7233d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
7243d8536b4Sopenharmony_ciosTimerId_t osTimerExtNew(osTimerFunc_t func, osTimerType_t type, void *argument, const osTimerAttr_t *attr,
7253d8536b4Sopenharmony_ci    osTimerRouses_t ucRouses, osTimerAlign_t ucSensitive)
7263d8536b4Sopenharmony_ci{
7273d8536b4Sopenharmony_ci    UNUSED(attr);
7283d8536b4Sopenharmony_ci    UINT32 usSwTmrID;
7293d8536b4Sopenharmony_ci    UINT8 mode;
7303d8536b4Sopenharmony_ci
7313d8536b4Sopenharmony_ci    if ((OS_INT_ACTIVE) || (NULL == func) || ((osTimerOnce != type) && (osTimerPeriodic != type))) {
7323d8536b4Sopenharmony_ci        return (osTimerId_t)NULL;
7333d8536b4Sopenharmony_ci    }
7343d8536b4Sopenharmony_ci
7353d8536b4Sopenharmony_ci    if (osTimerOnce == type) {
7363d8536b4Sopenharmony_ci        mode = LOS_SWTMR_MODE_NO_SELFDELETE;
7373d8536b4Sopenharmony_ci    } else {
7383d8536b4Sopenharmony_ci        mode = LOS_SWTMR_MODE_PERIOD;
7393d8536b4Sopenharmony_ci    }
7403d8536b4Sopenharmony_ci    if (LOS_OK != LOS_SwtmrCreate(1, mode, (SWTMR_PROC_FUNC)func, &usSwTmrID,
7413d8536b4Sopenharmony_ci        (UINT32)(UINTPTR)argument, ucRouses, ucSensitive)) {
7423d8536b4Sopenharmony_ci        return (osTimerId_t)NULL;
7433d8536b4Sopenharmony_ci    }
7443d8536b4Sopenharmony_ci
7453d8536b4Sopenharmony_ci    return (osTimerId_t)OS_SWT_FROM_SID(usSwTmrID);
7463d8536b4Sopenharmony_ci}
7473d8536b4Sopenharmony_ci#endif
7483d8536b4Sopenharmony_ci
7493d8536b4Sopenharmony_ciosStatus_t osTimerStart(osTimerId_t timer_id, uint32_t ticks)
7503d8536b4Sopenharmony_ci{
7513d8536b4Sopenharmony_ci    UINT32 ret;
7523d8536b4Sopenharmony_ci    SWTMR_CTRL_S *pstSwtmr = NULL;
7533d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
7543d8536b4Sopenharmony_ci        return osErrorISR;
7553d8536b4Sopenharmony_ci    }
7563d8536b4Sopenharmony_ci    if ((ticks == 0) || (timer_id == NULL)) {
7573d8536b4Sopenharmony_ci        return osErrorParameter;
7583d8536b4Sopenharmony_ci    }
7593d8536b4Sopenharmony_ci
7603d8536b4Sopenharmony_ci    UINT32 intSave = LOS_IntLock();
7613d8536b4Sopenharmony_ci    pstSwtmr = (SWTMR_CTRL_S *)timer_id;
7623d8536b4Sopenharmony_ci    pstSwtmr->uwInterval = ticks;
7633d8536b4Sopenharmony_ci    ret = LOS_SwtmrStart(pstSwtmr->usTimerID);
7643d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
7653d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
7663d8536b4Sopenharmony_ci        return osOK;
7673d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SWTMR_ID_INVALID) {
7683d8536b4Sopenharmony_ci        return osErrorParameter;
7693d8536b4Sopenharmony_ci    } else {
7703d8536b4Sopenharmony_ci        return osErrorResource;
7713d8536b4Sopenharmony_ci    }
7723d8536b4Sopenharmony_ci}
7733d8536b4Sopenharmony_ci
7743d8536b4Sopenharmony_ciconst char *osTimerGetName(osTimerId_t timer_id)
7753d8536b4Sopenharmony_ci{
7763d8536b4Sopenharmony_ci    UNUSED(timer_id);
7773d8536b4Sopenharmony_ci    return (const char *)NULL;
7783d8536b4Sopenharmony_ci}
7793d8536b4Sopenharmony_ci
7803d8536b4Sopenharmony_ciosStatus_t osTimerStop(osTimerId_t timer_id)
7813d8536b4Sopenharmony_ci{
7823d8536b4Sopenharmony_ci    UINT32 ret;
7833d8536b4Sopenharmony_ci    SWTMR_CTRL_S *pstSwtmr = (SWTMR_CTRL_S *)timer_id;
7843d8536b4Sopenharmony_ci
7853d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
7863d8536b4Sopenharmony_ci        return osErrorISR;
7873d8536b4Sopenharmony_ci    }
7883d8536b4Sopenharmony_ci
7893d8536b4Sopenharmony_ci    if (pstSwtmr == NULL) {
7903d8536b4Sopenharmony_ci        return osErrorParameter;
7913d8536b4Sopenharmony_ci    }
7923d8536b4Sopenharmony_ci
7933d8536b4Sopenharmony_ci    ret = LOS_SwtmrStop(pstSwtmr->usTimerID);
7943d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
7953d8536b4Sopenharmony_ci        return osOK;
7963d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SWTMR_ID_INVALID) {
7973d8536b4Sopenharmony_ci        return osErrorParameter;
7983d8536b4Sopenharmony_ci    } else {
7993d8536b4Sopenharmony_ci        return osErrorResource;
8003d8536b4Sopenharmony_ci    }
8013d8536b4Sopenharmony_ci}
8023d8536b4Sopenharmony_ci
8033d8536b4Sopenharmony_ciuint32_t osTimerIsRunning(osTimerId_t timer_id)
8043d8536b4Sopenharmony_ci{
8053d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
8063d8536b4Sopenharmony_ci        return (uint32_t)osErrorISR;
8073d8536b4Sopenharmony_ci    }
8083d8536b4Sopenharmony_ci    if (timer_id == NULL) {
8093d8536b4Sopenharmony_ci        return 0;
8103d8536b4Sopenharmony_ci    }
8113d8536b4Sopenharmony_ci
8123d8536b4Sopenharmony_ci    return (OS_SWTMR_STATUS_TICKING == ((SWTMR_CTRL_S *)timer_id)->ucState);
8133d8536b4Sopenharmony_ci}
8143d8536b4Sopenharmony_ci
8153d8536b4Sopenharmony_ciosStatus_t osTimerDelete(osTimerId_t timer_id)
8163d8536b4Sopenharmony_ci{
8173d8536b4Sopenharmony_ci    UINT32 ret;
8183d8536b4Sopenharmony_ci    SWTMR_CTRL_S *pstSwtmr = (SWTMR_CTRL_S *)timer_id;
8193d8536b4Sopenharmony_ci
8203d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
8213d8536b4Sopenharmony_ci        return osErrorISR;
8223d8536b4Sopenharmony_ci    }
8233d8536b4Sopenharmony_ci    if (pstSwtmr == NULL) {
8243d8536b4Sopenharmony_ci        return osErrorParameter;
8253d8536b4Sopenharmony_ci    }
8263d8536b4Sopenharmony_ci    ret = LOS_SwtmrDelete(pstSwtmr->usTimerID);
8273d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
8283d8536b4Sopenharmony_ci        return osOK;
8293d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SWTMR_ID_INVALID) {
8303d8536b4Sopenharmony_ci        return osErrorParameter;
8313d8536b4Sopenharmony_ci    } else {
8323d8536b4Sopenharmony_ci        return osErrorResource;
8333d8536b4Sopenharmony_ci    }
8343d8536b4Sopenharmony_ci}
8353d8536b4Sopenharmony_ci#endif
8363d8536b4Sopenharmony_ci
8373d8536b4Sopenharmony_ciosEventFlagsId_t osEventFlagsNew(const osEventFlagsAttr_t *attr)
8383d8536b4Sopenharmony_ci{
8393d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB;
8403d8536b4Sopenharmony_ci    UINT32 ret;
8413d8536b4Sopenharmony_ci
8423d8536b4Sopenharmony_ci    UNUSED(attr);
8433d8536b4Sopenharmony_ci
8443d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
8453d8536b4Sopenharmony_ci        return (osEventFlagsId_t)NULL;
8463d8536b4Sopenharmony_ci    }
8473d8536b4Sopenharmony_ci
8483d8536b4Sopenharmony_ci    pstEventCB = (PEVENT_CB_S)LOS_MemAlloc(m_aucSysMem0, sizeof(EVENT_CB_S));
8493d8536b4Sopenharmony_ci    if (pstEventCB == NULL) {
8503d8536b4Sopenharmony_ci        return (osEventFlagsId_t)NULL;
8513d8536b4Sopenharmony_ci    }
8523d8536b4Sopenharmony_ci
8533d8536b4Sopenharmony_ci    ret = LOS_EventInit(pstEventCB);
8543d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
8553d8536b4Sopenharmony_ci        return (osEventFlagsId_t)pstEventCB;
8563d8536b4Sopenharmony_ci    } else {
8573d8536b4Sopenharmony_ci        if (LOS_MemFree(m_aucSysMem0, pstEventCB) != LOS_OK) {
8583d8536b4Sopenharmony_ci            PRINT_ERR("[%s] memory free fail!\n", __func__);
8593d8536b4Sopenharmony_ci        }
8603d8536b4Sopenharmony_ci        return NULL;
8613d8536b4Sopenharmony_ci    }
8623d8536b4Sopenharmony_ci}
8633d8536b4Sopenharmony_ci
8643d8536b4Sopenharmony_ciconst char *osEventFlagsGetName(osEventFlagsId_t ef_id)
8653d8536b4Sopenharmony_ci{
8663d8536b4Sopenharmony_ci    (void)ef_id;
8673d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
8683d8536b4Sopenharmony_ci        return NULL;
8693d8536b4Sopenharmony_ci    }
8703d8536b4Sopenharmony_ci    return NULL;
8713d8536b4Sopenharmony_ci}
8723d8536b4Sopenharmony_ci
8733d8536b4Sopenharmony_ciuint32_t osEventFlagsSet(osEventFlagsId_t ef_id, uint32_t flags)
8743d8536b4Sopenharmony_ci{
8753d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id;
8763d8536b4Sopenharmony_ci    UINT32 ret;
8773d8536b4Sopenharmony_ci    uint32_t rflags;
8783d8536b4Sopenharmony_ci
8793d8536b4Sopenharmony_ci    if (pstEventCB == NULL) {
8803d8536b4Sopenharmony_ci        return osFlagsErrorParameter;
8813d8536b4Sopenharmony_ci    }
8823d8536b4Sopenharmony_ci
8833d8536b4Sopenharmony_ci    ret = LOS_EventWrite(pstEventCB, (UINT32)flags);
8843d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
8853d8536b4Sopenharmony_ci        rflags = pstEventCB->uwEventID;
8863d8536b4Sopenharmony_ci        return rflags;
8873d8536b4Sopenharmony_ci    } else {
8883d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorResource;
8893d8536b4Sopenharmony_ci    }
8903d8536b4Sopenharmony_ci}
8913d8536b4Sopenharmony_ci
8923d8536b4Sopenharmony_ciuint32_t osEventFlagsClear(osEventFlagsId_t ef_id, uint32_t flags)
8933d8536b4Sopenharmony_ci{
8943d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id;
8953d8536b4Sopenharmony_ci    UINT32 intSave;
8963d8536b4Sopenharmony_ci    uint32_t rflags;
8973d8536b4Sopenharmony_ci    UINT32 ret;
8983d8536b4Sopenharmony_ci
8993d8536b4Sopenharmony_ci    if (pstEventCB == NULL) {
9003d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
9013d8536b4Sopenharmony_ci    }
9023d8536b4Sopenharmony_ci
9033d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
9043d8536b4Sopenharmony_ci    rflags = pstEventCB->uwEventID;
9053d8536b4Sopenharmony_ci
9063d8536b4Sopenharmony_ci    ret = LOS_EventClear(pstEventCB, ~flags);
9073d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
9083d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
9093d8536b4Sopenharmony_ci        return rflags;
9103d8536b4Sopenharmony_ci    } else {
9113d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorResource;
9123d8536b4Sopenharmony_ci    }
9133d8536b4Sopenharmony_ci}
9143d8536b4Sopenharmony_ci
9153d8536b4Sopenharmony_ciuint32_t osEventFlagsGet(osEventFlagsId_t ef_id)
9163d8536b4Sopenharmony_ci{
9173d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id;
9183d8536b4Sopenharmony_ci    UINT32 intSave;
9193d8536b4Sopenharmony_ci    uint32_t rflags;
9203d8536b4Sopenharmony_ci
9213d8536b4Sopenharmony_ci    if (pstEventCB == NULL) {
9223d8536b4Sopenharmony_ci        return 0;
9233d8536b4Sopenharmony_ci    }
9243d8536b4Sopenharmony_ci
9253d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
9263d8536b4Sopenharmony_ci    rflags = pstEventCB->uwEventID;
9273d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
9283d8536b4Sopenharmony_ci
9293d8536b4Sopenharmony_ci    return rflags;
9303d8536b4Sopenharmony_ci}
9313d8536b4Sopenharmony_ci
9323d8536b4Sopenharmony_ciuint32_t osEventFlagsWait(osEventFlagsId_t ef_id, uint32_t flags, uint32_t options, uint32_t timeout)
9333d8536b4Sopenharmony_ci{
9343d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id;
9353d8536b4Sopenharmony_ci    UINT32 mode = 0;
9363d8536b4Sopenharmony_ci    UINT32 ret;
9373d8536b4Sopenharmony_ci    uint32_t rflags;
9383d8536b4Sopenharmony_ci
9393d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE && (timeout != 0)) {
9403d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
9413d8536b4Sopenharmony_ci    }
9423d8536b4Sopenharmony_ci
9433d8536b4Sopenharmony_ci    if (options > (osFlagsWaitAny | osFlagsWaitAll | osFlagsNoClear)) {
9443d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
9453d8536b4Sopenharmony_ci    }
9463d8536b4Sopenharmony_ci
9473d8536b4Sopenharmony_ci    if ((options & osFlagsWaitAll) == osFlagsWaitAll) {
9483d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_AND;
9493d8536b4Sopenharmony_ci    } else {
9503d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_OR;
9513d8536b4Sopenharmony_ci    }
9523d8536b4Sopenharmony_ci
9533d8536b4Sopenharmony_ci    if ((options & osFlagsNoClear) == osFlagsNoClear) {
9543d8536b4Sopenharmony_ci        mode &= ~LOS_WAITMODE_CLR;
9553d8536b4Sopenharmony_ci    } else {
9563d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_CLR;
9573d8536b4Sopenharmony_ci    }
9583d8536b4Sopenharmony_ci
9593d8536b4Sopenharmony_ci    ret = LOS_EventRead(pstEventCB, (UINT32)flags, mode, (UINT32)timeout);
9603d8536b4Sopenharmony_ci    switch (ret) {
9613d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_PTR_NULL:
9623d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_EVENTMASK_INVALID:
9633d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_FLAGS_INVALID:
9643d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_SETBIT_INVALID:
9653d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorParameter;
9663d8536b4Sopenharmony_ci
9673d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_READ_IN_INTERRUPT:
9683d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_READ_IN_LOCK:
9693d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorResource;
9703d8536b4Sopenharmony_ci
9713d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_READ_TIMEOUT:
9723d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorTimeout;
9733d8536b4Sopenharmony_ci
9743d8536b4Sopenharmony_ci        default:
9753d8536b4Sopenharmony_ci            rflags = (uint32_t)ret;
9763d8536b4Sopenharmony_ci            return rflags;
9773d8536b4Sopenharmony_ci    }
9783d8536b4Sopenharmony_ci}
9793d8536b4Sopenharmony_ci
9803d8536b4Sopenharmony_ciosStatus_t osEventFlagsDelete(osEventFlagsId_t ef_id)
9813d8536b4Sopenharmony_ci{
9823d8536b4Sopenharmony_ci    PEVENT_CB_S pstEventCB = (PEVENT_CB_S)ef_id;
9833d8536b4Sopenharmony_ci    UINT32 intSave;
9843d8536b4Sopenharmony_ci    osStatus_t ret = osOK;
9853d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
9863d8536b4Sopenharmony_ci        return osErrorISR;
9873d8536b4Sopenharmony_ci    }
9883d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
9893d8536b4Sopenharmony_ci    if (LOS_EventDestroy(pstEventCB) != LOS_OK) {
9903d8536b4Sopenharmony_ci        ret = osErrorParameter;
9913d8536b4Sopenharmony_ci    }
9923d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
9933d8536b4Sopenharmony_ci
9943d8536b4Sopenharmony_ci    if (LOS_MemFree(m_aucSysMem0, (void *)pstEventCB) != LOS_OK) {
9953d8536b4Sopenharmony_ci        ret = osErrorParameter;
9963d8536b4Sopenharmony_ci    }
9973d8536b4Sopenharmony_ci
9983d8536b4Sopenharmony_ci    return ret;
9993d8536b4Sopenharmony_ci}
10003d8536b4Sopenharmony_ci
10013d8536b4Sopenharmony_ci//  ==== Mutex Management Functions ====
10023d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_MUX == 1)
10033d8536b4Sopenharmony_ciosMutexId_t osMutexNew(const osMutexAttr_t *attr)
10043d8536b4Sopenharmony_ci{
10053d8536b4Sopenharmony_ci    UINT32 ret;
10063d8536b4Sopenharmony_ci    UINT32 muxId;
10073d8536b4Sopenharmony_ci
10083d8536b4Sopenharmony_ci#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
10093d8536b4Sopenharmony_ci    UINTPTR regLR = ArchLRGet();
10103d8536b4Sopenharmony_ci#endif
10113d8536b4Sopenharmony_ci
10123d8536b4Sopenharmony_ci    UNUSED(attr);
10133d8536b4Sopenharmony_ci
10143d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
10153d8536b4Sopenharmony_ci        return NULL;
10163d8536b4Sopenharmony_ci    }
10173d8536b4Sopenharmony_ci
10183d8536b4Sopenharmony_ci    ret = LOS_MuxCreate(&muxId);
10193d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
10203d8536b4Sopenharmony_ci#if (LOSCFG_MUTEX_CREATE_TRACE == 1)
10213d8536b4Sopenharmony_ci        OsSetMutexCreateInfo(GET_MUX(muxId), regLR);
10223d8536b4Sopenharmony_ci#endif
10233d8536b4Sopenharmony_ci        return (osMutexId_t)(GET_MUX(muxId));
10243d8536b4Sopenharmony_ci    } else {
10253d8536b4Sopenharmony_ci        return (osMutexId_t)NULL;
10263d8536b4Sopenharmony_ci    }
10273d8536b4Sopenharmony_ci}
10283d8536b4Sopenharmony_ci
10293d8536b4Sopenharmony_ciosStatus_t osMutexAcquire(osMutexId_t mutex_id, uint32_t timeout)
10303d8536b4Sopenharmony_ci{
10313d8536b4Sopenharmony_ci    LosMuxCB *muxCB = (LosMuxCB *)mutex_id;
10323d8536b4Sopenharmony_ci    UINT32 ret;
10333d8536b4Sopenharmony_ci
10343d8536b4Sopenharmony_ci    if (muxCB == NULL) {
10353d8536b4Sopenharmony_ci        return osErrorParameter;
10363d8536b4Sopenharmony_ci    }
10373d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
10383d8536b4Sopenharmony_ci        return osErrorISR;
10393d8536b4Sopenharmony_ci    }
10403d8536b4Sopenharmony_ci
10413d8536b4Sopenharmony_ci    ret = LOS_MuxPend(muxCB->muxID, timeout);
10423d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
10433d8536b4Sopenharmony_ci        return osOK;
10443d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_MUX_INVALID) {
10453d8536b4Sopenharmony_ci        return osErrorParameter;
10463d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_MUX_TIMEOUT) {
10473d8536b4Sopenharmony_ci        return osErrorTimeout;
10483d8536b4Sopenharmony_ci    } else {
10493d8536b4Sopenharmony_ci        return osErrorResource;
10503d8536b4Sopenharmony_ci    }
10513d8536b4Sopenharmony_ci}
10523d8536b4Sopenharmony_ci
10533d8536b4Sopenharmony_ciosStatus_t osMutexRelease(osMutexId_t mutex_id)
10543d8536b4Sopenharmony_ci{
10553d8536b4Sopenharmony_ci    LosMuxCB *muxCB = (LosMuxCB *)mutex_id;
10563d8536b4Sopenharmony_ci    UINT32 ret;
10573d8536b4Sopenharmony_ci
10583d8536b4Sopenharmony_ci    if (muxCB == NULL) {
10593d8536b4Sopenharmony_ci        return osErrorParameter;
10603d8536b4Sopenharmony_ci    }
10613d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
10623d8536b4Sopenharmony_ci        return osErrorISR;
10633d8536b4Sopenharmony_ci    }
10643d8536b4Sopenharmony_ci
10653d8536b4Sopenharmony_ci    ret = LOS_MuxPost(muxCB->muxID);
10663d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
10673d8536b4Sopenharmony_ci        return osOK;
10683d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_MUX_INVALID) {
10693d8536b4Sopenharmony_ci        return osErrorParameter;
10703d8536b4Sopenharmony_ci    } else {
10713d8536b4Sopenharmony_ci        return osErrorResource;
10723d8536b4Sopenharmony_ci    }
10733d8536b4Sopenharmony_ci}
10743d8536b4Sopenharmony_ci
10753d8536b4Sopenharmony_ciosThreadId_t osMutexGetOwner(osMutexId_t mutex_id)
10763d8536b4Sopenharmony_ci{
10773d8536b4Sopenharmony_ci    UINT32 intSave;
10783d8536b4Sopenharmony_ci    LosTaskCB *pstTaskCB = NULL;
10793d8536b4Sopenharmony_ci
10803d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
10813d8536b4Sopenharmony_ci        return NULL;
10823d8536b4Sopenharmony_ci    }
10833d8536b4Sopenharmony_ci
10843d8536b4Sopenharmony_ci    if (mutex_id == NULL) {
10853d8536b4Sopenharmony_ci        return NULL;
10863d8536b4Sopenharmony_ci    }
10873d8536b4Sopenharmony_ci
10883d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
10893d8536b4Sopenharmony_ci    pstTaskCB = ((LosMuxCB *)mutex_id)->owner;
10903d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
10913d8536b4Sopenharmony_ci
10923d8536b4Sopenharmony_ci    return (osThreadId_t)pstTaskCB;
10933d8536b4Sopenharmony_ci}
10943d8536b4Sopenharmony_ci
10953d8536b4Sopenharmony_ciosStatus_t osMutexDelete(osMutexId_t mutex_id)
10963d8536b4Sopenharmony_ci{
10973d8536b4Sopenharmony_ci    UINT32 ret;
10983d8536b4Sopenharmony_ci
10993d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
11003d8536b4Sopenharmony_ci        return osErrorISR;
11013d8536b4Sopenharmony_ci    }
11023d8536b4Sopenharmony_ci
11033d8536b4Sopenharmony_ci    if (mutex_id == NULL) {
11043d8536b4Sopenharmony_ci        return osErrorParameter;
11053d8536b4Sopenharmony_ci    }
11063d8536b4Sopenharmony_ci
11073d8536b4Sopenharmony_ci    ret = LOS_MuxDelete(((LosMuxCB *)mutex_id)->muxID);
11083d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
11093d8536b4Sopenharmony_ci        return osOK;
11103d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_MUX_INVALID) {
11113d8536b4Sopenharmony_ci        return osErrorParameter;
11123d8536b4Sopenharmony_ci    } else {
11133d8536b4Sopenharmony_ci        return osErrorResource;
11143d8536b4Sopenharmony_ci    }
11153d8536b4Sopenharmony_ci}
11163d8536b4Sopenharmony_ci#endif
11173d8536b4Sopenharmony_ci
11183d8536b4Sopenharmony_ci//  ==== Semaphore Management Functions ====
11193d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_SEM == 1)
11203d8536b4Sopenharmony_ciosSemaphoreId_t osSemaphoreNew(uint32_t max_count, uint32_t initial_count, const osSemaphoreAttr_t *attr)
11213d8536b4Sopenharmony_ci{
11223d8536b4Sopenharmony_ci    UINT32 ret;
11233d8536b4Sopenharmony_ci    UINT32 semId;
11243d8536b4Sopenharmony_ci
11253d8536b4Sopenharmony_ci    UNUSED(attr);
11263d8536b4Sopenharmony_ci
11273d8536b4Sopenharmony_ci    if ((initial_count > max_count) || (max_count > OS_SEM_COUNTING_MAX_COUNT) || (max_count == 0) || OS_INT_ACTIVE) {
11283d8536b4Sopenharmony_ci        return NULL;
11293d8536b4Sopenharmony_ci    }
11303d8536b4Sopenharmony_ci
11313d8536b4Sopenharmony_ci    if (max_count == 1) {
11323d8536b4Sopenharmony_ci        ret = LOS_BinarySemCreate((UINT16)initial_count, &semId);
11333d8536b4Sopenharmony_ci    } else {
11343d8536b4Sopenharmony_ci        ret = LOS_SemCreate((UINT16)initial_count, &semId);
11353d8536b4Sopenharmony_ci    }
11363d8536b4Sopenharmony_ci
11373d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
11383d8536b4Sopenharmony_ci        return (osSemaphoreId_t)(GET_SEM(semId));
11393d8536b4Sopenharmony_ci    } else {
11403d8536b4Sopenharmony_ci        return (osSemaphoreId_t)NULL;
11413d8536b4Sopenharmony_ci    }
11423d8536b4Sopenharmony_ci}
11433d8536b4Sopenharmony_ci
11443d8536b4Sopenharmony_ciconst char *osSemaphoreGetName(osSemaphoreId_t semaphore_id)
11453d8536b4Sopenharmony_ci{
11463d8536b4Sopenharmony_ci    UNUSED(semaphore_id);
11473d8536b4Sopenharmony_ci    return NULL;
11483d8536b4Sopenharmony_ci}
11493d8536b4Sopenharmony_ci
11503d8536b4Sopenharmony_ciosStatus_t osSemaphoreAcquire(osSemaphoreId_t semaphore_id, uint32_t timeout)
11513d8536b4Sopenharmony_ci{
11523d8536b4Sopenharmony_ci    LosSemCB *semCB = (LosSemCB *)semaphore_id;
11533d8536b4Sopenharmony_ci    UINT32 ret;
11543d8536b4Sopenharmony_ci
11553d8536b4Sopenharmony_ci    if ((semCB == NULL) || (OS_INT_ACTIVE && (timeout != 0))) {
11563d8536b4Sopenharmony_ci        return osErrorParameter;
11573d8536b4Sopenharmony_ci    }
11583d8536b4Sopenharmony_ci
11593d8536b4Sopenharmony_ci    ret = LOS_SemPend(semCB->semID, timeout);
11603d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
11613d8536b4Sopenharmony_ci        return osOK;
11623d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SEM_INVALID) {
11633d8536b4Sopenharmony_ci        return osErrorParameter;
11643d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SEM_TIMEOUT) {
11653d8536b4Sopenharmony_ci        return osErrorTimeout;
11663d8536b4Sopenharmony_ci    } else {
11673d8536b4Sopenharmony_ci        return osErrorResource;
11683d8536b4Sopenharmony_ci    }
11693d8536b4Sopenharmony_ci}
11703d8536b4Sopenharmony_ci
11713d8536b4Sopenharmony_ciosStatus_t osSemaphoreRelease(osSemaphoreId_t semaphore_id)
11723d8536b4Sopenharmony_ci{
11733d8536b4Sopenharmony_ci    UINT32 ret;
11743d8536b4Sopenharmony_ci
11753d8536b4Sopenharmony_ci    if (semaphore_id == NULL) {
11763d8536b4Sopenharmony_ci        return osErrorParameter;
11773d8536b4Sopenharmony_ci    }
11783d8536b4Sopenharmony_ci
11793d8536b4Sopenharmony_ci    ret = LOS_SemPost(((LosSemCB *)semaphore_id)->semID);
11803d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
11813d8536b4Sopenharmony_ci        return osOK;
11823d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SEM_INVALID) {
11833d8536b4Sopenharmony_ci        return osErrorParameter;
11843d8536b4Sopenharmony_ci    } else {
11853d8536b4Sopenharmony_ci        return osErrorResource;
11863d8536b4Sopenharmony_ci    }
11873d8536b4Sopenharmony_ci}
11883d8536b4Sopenharmony_ci
11893d8536b4Sopenharmony_ciuint32_t osSemaphoreGetCount(osSemaphoreId_t semaphore_id)
11903d8536b4Sopenharmony_ci{
11913d8536b4Sopenharmony_ci    LosSemCB *semCB = (LosSemCB *)semaphore_id;
11923d8536b4Sopenharmony_ci    UINT32 intSave;
11933d8536b4Sopenharmony_ci    UINT16 count;
11943d8536b4Sopenharmony_ci
11953d8536b4Sopenharmony_ci    if (semCB == NULL) {
11963d8536b4Sopenharmony_ci        return 0;
11973d8536b4Sopenharmony_ci    }
11983d8536b4Sopenharmony_ci
11993d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
12003d8536b4Sopenharmony_ci    if (semCB->semStat == 0) {
12013d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
12023d8536b4Sopenharmony_ci        return 0;
12033d8536b4Sopenharmony_ci    }
12043d8536b4Sopenharmony_ci
12053d8536b4Sopenharmony_ci    count = semCB->semCount;
12063d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
12073d8536b4Sopenharmony_ci
12083d8536b4Sopenharmony_ci    return (uint32_t)count;
12093d8536b4Sopenharmony_ci}
12103d8536b4Sopenharmony_ci
12113d8536b4Sopenharmony_ciosStatus_t osSemaphoreDelete(osSemaphoreId_t semaphore_id)
12123d8536b4Sopenharmony_ci{
12133d8536b4Sopenharmony_ci    UINT32 ret;
12143d8536b4Sopenharmony_ci
12153d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
12163d8536b4Sopenharmony_ci        return osErrorISR;
12173d8536b4Sopenharmony_ci    }
12183d8536b4Sopenharmony_ci
12193d8536b4Sopenharmony_ci    if (semaphore_id == NULL) {
12203d8536b4Sopenharmony_ci        return osErrorParameter;
12213d8536b4Sopenharmony_ci    }
12223d8536b4Sopenharmony_ci
12233d8536b4Sopenharmony_ci    ret = LOS_SemDelete(((LosSemCB *)semaphore_id)->semID);
12243d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
12253d8536b4Sopenharmony_ci        return osOK;
12263d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_SEM_INVALID) {
12273d8536b4Sopenharmony_ci        return osErrorParameter;
12283d8536b4Sopenharmony_ci    } else {
12293d8536b4Sopenharmony_ci        return osErrorResource;
12303d8536b4Sopenharmony_ci    }
12313d8536b4Sopenharmony_ci}
12323d8536b4Sopenharmony_ci#endif
12333d8536b4Sopenharmony_ci
12343d8536b4Sopenharmony_ci//  ==== Message Queue Management Functions ====
12353d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_QUEUE == 1)
12363d8536b4Sopenharmony_citypedef enum {
12373d8536b4Sopenharmony_ci    ATTR_CAPACITY = 0,
12383d8536b4Sopenharmony_ci    ATTR_MSGSIZE = 1,
12393d8536b4Sopenharmony_ci    ATTR_COUNT = 2,
12403d8536b4Sopenharmony_ci    ATTR_SPACE = 3
12413d8536b4Sopenharmony_ci} QueueAttribute;
12423d8536b4Sopenharmony_ci
12433d8536b4Sopenharmony_ciosMessageQueueId_t osMessageQueueNew(uint32_t msg_count, uint32_t msg_size, const osMessageQueueAttr_t *attr)
12443d8536b4Sopenharmony_ci{
12453d8536b4Sopenharmony_ci    UINT32 queueId;
12463d8536b4Sopenharmony_ci    UINT32 ret;
12473d8536b4Sopenharmony_ci    osMessageQueueId_t handle;
12483d8536b4Sopenharmony_ci    const char *queueName = NULL;
12493d8536b4Sopenharmony_ci
12503d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_QUEUE_STATIC == 1)
12513d8536b4Sopenharmony_ci    UINT32 queueSize = 0;
12523d8536b4Sopenharmony_ci    UINT8 *staticMem = NULL;
12533d8536b4Sopenharmony_ci#endif
12543d8536b4Sopenharmony_ci
12553d8536b4Sopenharmony_ci    if ((msg_count == 0) || (msg_size == 0) || OS_INT_ACTIVE) {
12563d8536b4Sopenharmony_ci        return (osMessageQueueId_t)NULL;
12573d8536b4Sopenharmony_ci    }
12583d8536b4Sopenharmony_ci
12593d8536b4Sopenharmony_ci    if (attr != NULL) {
12603d8536b4Sopenharmony_ci        queueName = attr->name;
12613d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_QUEUE_STATIC == 1)
12623d8536b4Sopenharmony_ci        queueSize = attr->mq_size;
12633d8536b4Sopenharmony_ci        staticMem = attr->mq_mem;
12643d8536b4Sopenharmony_ci        if (((queueSize == 0) && (staticMem != NULL)) || ((queueSize != 0) && (staticMem == NULL))) {
12653d8536b4Sopenharmony_ci            return (osMessageQueueId_t)NULL;
12663d8536b4Sopenharmony_ci        }
12673d8536b4Sopenharmony_ci#endif
12683d8536b4Sopenharmony_ci    }
12693d8536b4Sopenharmony_ci
12703d8536b4Sopenharmony_ci#if (LOSCFG_BASE_IPC_QUEUE_STATIC == 1)
12713d8536b4Sopenharmony_ci    if (staticMem != NULL) {
12723d8536b4Sopenharmony_ci        ret = LOS_QueueCreateStatic((const CHAR *)queueName, (UINT16)msg_count, &queueId, \
12733d8536b4Sopenharmony_ci                                    (UINT8 *)staticMem, 0, (UINT16)queueSize / msg_count);
12743d8536b4Sopenharmony_ci    } else {
12753d8536b4Sopenharmony_ci        ret = LOS_QueueCreate((const CHAR *)queueName, (UINT16)msg_count, &queueId, 0, (UINT16)msg_size);
12763d8536b4Sopenharmony_ci    }
12773d8536b4Sopenharmony_ci#else
12783d8536b4Sopenharmony_ci    ret = LOS_QueueCreate((const CHAR *)queueName, (UINT16)msg_count, &queueId, 0, (UINT16)msg_size);
12793d8536b4Sopenharmony_ci#endif
12803d8536b4Sopenharmony_ci
12813d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
12823d8536b4Sopenharmony_ci        handle = (osMessageQueueId_t)(GET_QUEUE_HANDLE(queueId));
12833d8536b4Sopenharmony_ci    } else {
12843d8536b4Sopenharmony_ci        handle = (osMessageQueueId_t)NULL;
12853d8536b4Sopenharmony_ci    }
12863d8536b4Sopenharmony_ci
12873d8536b4Sopenharmony_ci    return handle;
12883d8536b4Sopenharmony_ci}
12893d8536b4Sopenharmony_ci
12903d8536b4Sopenharmony_ciSTATIC osStatus_t osMessageQueueOp(osMessageQueueId_t mq_id, VOID *msg_ptr, UINT32 timeout, QueueReadWrite rw)
12913d8536b4Sopenharmony_ci{
12923d8536b4Sopenharmony_ci    LosQueueCB *queueCB = (LosQueueCB *)mq_id;
12933d8536b4Sopenharmony_ci    UINT32 ret;
12943d8536b4Sopenharmony_ci    UINT32 bufferSize;
12953d8536b4Sopenharmony_ci
12963d8536b4Sopenharmony_ci    if ((queueCB == NULL) || (msg_ptr == NULL) || (OS_INT_ACTIVE && (timeout != 0))) {
12973d8536b4Sopenharmony_ci        return osErrorParameter;
12983d8536b4Sopenharmony_ci    }
12993d8536b4Sopenharmony_ci
13003d8536b4Sopenharmony_ci    bufferSize = (UINT32)(queueCB->queueSize - sizeof(UINT32));
13013d8536b4Sopenharmony_ci    if (rw == OS_QUEUE_WRITE) {
13023d8536b4Sopenharmony_ci        ret = LOS_QueueWriteCopy(queueCB->queueID, msg_ptr, bufferSize, timeout);
13033d8536b4Sopenharmony_ci    } else {
13043d8536b4Sopenharmony_ci        ret = LOS_QueueReadCopy(queueCB->queueID, msg_ptr, &bufferSize, timeout);
13053d8536b4Sopenharmony_ci    }
13063d8536b4Sopenharmony_ci
13073d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
13083d8536b4Sopenharmony_ci        return osOK;
13093d8536b4Sopenharmony_ci    } else if ((ret == LOS_ERRNO_QUEUE_INVALID) || (ret == LOS_ERRNO_QUEUE_NOT_CREATE)) {
13103d8536b4Sopenharmony_ci        return osErrorParameter;
13113d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_QUEUE_TIMEOUT) {
13123d8536b4Sopenharmony_ci        return osErrorTimeout;
13133d8536b4Sopenharmony_ci    } else {
13143d8536b4Sopenharmony_ci        return osErrorResource;
13153d8536b4Sopenharmony_ci    }
13163d8536b4Sopenharmony_ci}
13173d8536b4Sopenharmony_ci
13183d8536b4Sopenharmony_ciosStatus_t osMessageQueuePut(osMessageQueueId_t mq_id, const void *msg_ptr, uint8_t msg_prio, uint32_t timeout)
13193d8536b4Sopenharmony_ci{
13203d8536b4Sopenharmony_ci    UNUSED(msg_prio);
13213d8536b4Sopenharmony_ci    return osMessageQueueOp(mq_id, (VOID *)msg_ptr, (UINT32)timeout, OS_QUEUE_WRITE);
13223d8536b4Sopenharmony_ci}
13233d8536b4Sopenharmony_ci
13243d8536b4Sopenharmony_ciosStatus_t osMessageQueueGet(osMessageQueueId_t mq_id, void *msg_ptr, uint8_t *msg_prio, uint32_t timeout)
13253d8536b4Sopenharmony_ci{
13263d8536b4Sopenharmony_ci    UNUSED(msg_prio);
13273d8536b4Sopenharmony_ci    return osMessageQueueOp(mq_id, (VOID *)msg_ptr, (UINT32)timeout, OS_QUEUE_READ);
13283d8536b4Sopenharmony_ci}
13293d8536b4Sopenharmony_ci
13303d8536b4Sopenharmony_ciSTATIC UINT16 osMessageQueueGetAttr(osMessageQueueId_t mq_id, QueueAttribute attr)
13313d8536b4Sopenharmony_ci{
13323d8536b4Sopenharmony_ci    LosQueueCB *queueCB = (LosQueueCB *)mq_id;
13333d8536b4Sopenharmony_ci    UINT16 attrVal = 0;
13343d8536b4Sopenharmony_ci
13353d8536b4Sopenharmony_ci    if (queueCB == NULL) {
13363d8536b4Sopenharmony_ci        return 0;
13373d8536b4Sopenharmony_ci    }
13383d8536b4Sopenharmony_ci
13393d8536b4Sopenharmony_ci    if (queueCB->queueState == OS_QUEUE_UNUSED) {
13403d8536b4Sopenharmony_ci        return 0;
13413d8536b4Sopenharmony_ci    }
13423d8536b4Sopenharmony_ci
13433d8536b4Sopenharmony_ci    switch (attr) {
13443d8536b4Sopenharmony_ci        case ATTR_CAPACITY:
13453d8536b4Sopenharmony_ci            attrVal = queueCB->queueLen;
13463d8536b4Sopenharmony_ci            break;
13473d8536b4Sopenharmony_ci        case ATTR_MSGSIZE:
13483d8536b4Sopenharmony_ci            attrVal = queueCB->queueSize - sizeof(UINT32);
13493d8536b4Sopenharmony_ci            break;
13503d8536b4Sopenharmony_ci        case ATTR_COUNT:
13513d8536b4Sopenharmony_ci            attrVal = queueCB->readWriteableCnt[OS_QUEUE_READ];
13523d8536b4Sopenharmony_ci            break;
13533d8536b4Sopenharmony_ci        case ATTR_SPACE:
13543d8536b4Sopenharmony_ci            attrVal = queueCB->readWriteableCnt[OS_QUEUE_WRITE];
13553d8536b4Sopenharmony_ci            break;
13563d8536b4Sopenharmony_ci        default:
13573d8536b4Sopenharmony_ci            break;
13583d8536b4Sopenharmony_ci    }
13593d8536b4Sopenharmony_ci
13603d8536b4Sopenharmony_ci    return attrVal;
13613d8536b4Sopenharmony_ci}
13623d8536b4Sopenharmony_ci
13633d8536b4Sopenharmony_ciuint32_t osMessageQueueGetCapacity(osMessageQueueId_t mq_id)
13643d8536b4Sopenharmony_ci{
13653d8536b4Sopenharmony_ci    return (uint32_t)osMessageQueueGetAttr(mq_id, ATTR_CAPACITY);
13663d8536b4Sopenharmony_ci}
13673d8536b4Sopenharmony_ci
13683d8536b4Sopenharmony_ciuint32_t osMessageQueueGetMsgSize(osMessageQueueId_t mq_id)
13693d8536b4Sopenharmony_ci{
13703d8536b4Sopenharmony_ci    return (uint32_t)osMessageQueueGetAttr(mq_id, ATTR_MSGSIZE);
13713d8536b4Sopenharmony_ci}
13723d8536b4Sopenharmony_ci
13733d8536b4Sopenharmony_ciuint32_t osMessageQueueGetCount(osMessageQueueId_t mq_id)
13743d8536b4Sopenharmony_ci{
13753d8536b4Sopenharmony_ci    return (uint32_t)osMessageQueueGetAttr(mq_id, ATTR_COUNT);
13763d8536b4Sopenharmony_ci}
13773d8536b4Sopenharmony_ci
13783d8536b4Sopenharmony_ciuint32_t osMessageQueueGetSpace(osMessageQueueId_t mq_id)
13793d8536b4Sopenharmony_ci{
13803d8536b4Sopenharmony_ci    return (uint32_t)osMessageQueueGetAttr(mq_id, ATTR_SPACE);
13813d8536b4Sopenharmony_ci}
13823d8536b4Sopenharmony_ci
13833d8536b4Sopenharmony_ciosStatus_t osMessageQueueDelete(osMessageQueueId_t mq_id)
13843d8536b4Sopenharmony_ci{
13853d8536b4Sopenharmony_ci    LosQueueCB *pstQueue = (LosQueueCB *)mq_id;
13863d8536b4Sopenharmony_ci    UINT32 ret;
13873d8536b4Sopenharmony_ci
13883d8536b4Sopenharmony_ci    if (pstQueue == NULL) {
13893d8536b4Sopenharmony_ci        return osErrorParameter;
13903d8536b4Sopenharmony_ci    }
13913d8536b4Sopenharmony_ci
13923d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
13933d8536b4Sopenharmony_ci        return osErrorISR;
13943d8536b4Sopenharmony_ci    }
13953d8536b4Sopenharmony_ci
13963d8536b4Sopenharmony_ci    ret = LOS_QueueDelete((UINT32)pstQueue->queueID);
13973d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
13983d8536b4Sopenharmony_ci        return osOK;
13993d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_QUEUE_NOT_FOUND || ret == LOS_ERRNO_QUEUE_NOT_CREATE) {
14003d8536b4Sopenharmony_ci        return osErrorParameter;
14013d8536b4Sopenharmony_ci    } else {
14023d8536b4Sopenharmony_ci        return osErrorResource;
14033d8536b4Sopenharmony_ci    }
14043d8536b4Sopenharmony_ci}
14053d8536b4Sopenharmony_ci
14063d8536b4Sopenharmony_ciconst char *osMessageQueueGetName(osMessageQueueId_t mq_id)
14073d8536b4Sopenharmony_ci{
14083d8536b4Sopenharmony_ci    if (mq_id == NULL) {
14093d8536b4Sopenharmony_ci        return NULL;
14103d8536b4Sopenharmony_ci    }
14113d8536b4Sopenharmony_ci
14123d8536b4Sopenharmony_ci    LosQueueCB *pstQueue = (LosQueueCB *)mq_id;
14133d8536b4Sopenharmony_ci
14143d8536b4Sopenharmony_ci    return (const char *)pstQueue->queueName;
14153d8536b4Sopenharmony_ci}
14163d8536b4Sopenharmony_ci#endif
14173d8536b4Sopenharmony_ci
14183d8536b4Sopenharmony_ci#define MP_ALLOC        1U
14193d8536b4Sopenharmony_ci#define MD_ALLOC        2U
14203d8536b4Sopenharmony_ci#define MEM_POOL_VALID  0xFFEEFF00
14213d8536b4Sopenharmony_ci
14223d8536b4Sopenharmony_citypedef struct {
14233d8536b4Sopenharmony_ci    LOS_MEMBOX_INFO poolInfo;
14243d8536b4Sopenharmony_ci    void            *poolBase;
14253d8536b4Sopenharmony_ci    uint32_t        poolSize;
14263d8536b4Sopenharmony_ci    uint32_t        status;
14273d8536b4Sopenharmony_ci    const char      *name;
14283d8536b4Sopenharmony_ci} MemPoolCB;
14293d8536b4Sopenharmony_ci
14303d8536b4Sopenharmony_ciosMemoryPoolId_t osMemoryPoolNew(uint32_t block_count, uint32_t block_size, const osMemoryPoolAttr_t *attr)
14313d8536b4Sopenharmony_ci{
14323d8536b4Sopenharmony_ci    MemPoolCB *mp = NULL;
14333d8536b4Sopenharmony_ci    const char *name = NULL;
14343d8536b4Sopenharmony_ci    LOS_MEMBOX_NODE *node = NULL;
14353d8536b4Sopenharmony_ci    uint32_t memCB = 0;
14363d8536b4Sopenharmony_ci    uint32_t memMP = 0;
14373d8536b4Sopenharmony_ci    uint32_t size;
14383d8536b4Sopenharmony_ci    uint32_t index;
14393d8536b4Sopenharmony_ci
14403d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
14413d8536b4Sopenharmony_ci        return NULL;
14423d8536b4Sopenharmony_ci    }
14433d8536b4Sopenharmony_ci
14443d8536b4Sopenharmony_ci    if ((block_count == 0) || (block_size == 0)) {
14453d8536b4Sopenharmony_ci        return NULL;
14463d8536b4Sopenharmony_ci    }
14473d8536b4Sopenharmony_ci
14483d8536b4Sopenharmony_ci    size = block_count * block_size;
14493d8536b4Sopenharmony_ci
14503d8536b4Sopenharmony_ci    if (attr != NULL) {
14513d8536b4Sopenharmony_ci        if ((attr->cb_mem != NULL) && (attr->cb_size >= sizeof(MemPoolCB))) {
14523d8536b4Sopenharmony_ci            memCB = 1;
14533d8536b4Sopenharmony_ci        }
14543d8536b4Sopenharmony_ci
14553d8536b4Sopenharmony_ci        if ((attr->mp_mem != NULL) &&
14563d8536b4Sopenharmony_ci            (((UINTPTR)attr->mp_mem & 0x3) == 0) &&  /* 0x3: Check if array is 4-byte aligned. */
14573d8536b4Sopenharmony_ci            (attr->mp_size >= size)) {
14583d8536b4Sopenharmony_ci            memMP = 1;
14593d8536b4Sopenharmony_ci        }
14603d8536b4Sopenharmony_ci        name = attr->name;
14613d8536b4Sopenharmony_ci    }
14623d8536b4Sopenharmony_ci
14633d8536b4Sopenharmony_ci    if (memCB == 0) {
14643d8536b4Sopenharmony_ci        mp = LOS_MemAlloc(OS_SYS_MEM_ADDR, sizeof(MemPoolCB));
14653d8536b4Sopenharmony_ci        if (mp == NULL) {
14663d8536b4Sopenharmony_ci            return NULL;
14673d8536b4Sopenharmony_ci        }
14683d8536b4Sopenharmony_ci        mp->status = MP_ALLOC;
14693d8536b4Sopenharmony_ci    } else if ((attr != NULL) && (attr->cb_mem != NULL)) {
14703d8536b4Sopenharmony_ci        mp = attr->cb_mem;
14713d8536b4Sopenharmony_ci        mp->status = 0;
14723d8536b4Sopenharmony_ci    } else {
14733d8536b4Sopenharmony_ci        return NULL;
14743d8536b4Sopenharmony_ci    }
14753d8536b4Sopenharmony_ci
14763d8536b4Sopenharmony_ci    if (memMP == 0) {
14773d8536b4Sopenharmony_ci        mp->poolBase = LOS_MemAlloc(OS_SYS_MEM_ADDR, size);
14783d8536b4Sopenharmony_ci        if ((mp->poolBase == NULL) && (mp->status & MP_ALLOC)) {
14793d8536b4Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, mp);
14803d8536b4Sopenharmony_ci            return NULL;
14813d8536b4Sopenharmony_ci        }
14823d8536b4Sopenharmony_ci        mp->status |= MD_ALLOC;
14833d8536b4Sopenharmony_ci    } else if ((attr != NULL) && (attr->mp_mem != NULL)) {
14843d8536b4Sopenharmony_ci        mp->poolBase = attr->mp_mem;
14853d8536b4Sopenharmony_ci    } else {
14863d8536b4Sopenharmony_ci        if (mp->status & MP_ALLOC) {
14873d8536b4Sopenharmony_ci            (void)LOS_MemFree(OS_SYS_MEM_ADDR, mp);
14883d8536b4Sopenharmony_ci        }
14893d8536b4Sopenharmony_ci        return NULL;
14903d8536b4Sopenharmony_ci    }
14913d8536b4Sopenharmony_ci    mp->poolSize = size;
14923d8536b4Sopenharmony_ci    mp->name = name;
14933d8536b4Sopenharmony_ci    mp->poolInfo.uwBlkCnt = 0;
14943d8536b4Sopenharmony_ci    mp->poolInfo.uwBlkNum = block_count;
14953d8536b4Sopenharmony_ci    mp->poolInfo.uwBlkSize = block_size;
14963d8536b4Sopenharmony_ci
14973d8536b4Sopenharmony_ci    node = (LOS_MEMBOX_NODE *)mp->poolBase;
14983d8536b4Sopenharmony_ci    mp->poolInfo.stFreeList.pstNext = node;
14993d8536b4Sopenharmony_ci    for (index = 0; index < block_count - 1; ++index) {
15003d8536b4Sopenharmony_ci        node->pstNext = OS_MEMBOX_NEXT(node, block_size);
15013d8536b4Sopenharmony_ci        node = node->pstNext;
15023d8536b4Sopenharmony_ci    }
15033d8536b4Sopenharmony_ci    node->pstNext = NULL;
15043d8536b4Sopenharmony_ci
15053d8536b4Sopenharmony_ci    mp->status |= MEM_POOL_VALID;
15063d8536b4Sopenharmony_ci
15073d8536b4Sopenharmony_ci    return mp;
15083d8536b4Sopenharmony_ci}
15093d8536b4Sopenharmony_ci
15103d8536b4Sopenharmony_civoid *osMemoryPoolAlloc(osMemoryPoolId_t mp_id, uint32_t timeout)
15113d8536b4Sopenharmony_ci{
15123d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
15133d8536b4Sopenharmony_ci    LOS_MEMBOX_NODE *node = NULL;
15143d8536b4Sopenharmony_ci    UINT32 intSave;
15153d8536b4Sopenharmony_ci
15163d8536b4Sopenharmony_ci    UNUSED(timeout);
15173d8536b4Sopenharmony_ci
15183d8536b4Sopenharmony_ci    if (mp_id == NULL) {
15193d8536b4Sopenharmony_ci        return NULL;
15203d8536b4Sopenharmony_ci    }
15213d8536b4Sopenharmony_ci
15223d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
15233d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) == MEM_POOL_VALID) {
15243d8536b4Sopenharmony_ci        node = mp->poolInfo.stFreeList.pstNext;
15253d8536b4Sopenharmony_ci        if (node != NULL) {
15263d8536b4Sopenharmony_ci            mp->poolInfo.stFreeList.pstNext = node->pstNext;
15273d8536b4Sopenharmony_ci            mp->poolInfo.uwBlkCnt++;
15283d8536b4Sopenharmony_ci        }
15293d8536b4Sopenharmony_ci    }
15303d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
15313d8536b4Sopenharmony_ci
15323d8536b4Sopenharmony_ci    return node;
15333d8536b4Sopenharmony_ci}
15343d8536b4Sopenharmony_ci
15353d8536b4Sopenharmony_ciosStatus_t osMemoryPoolFree(osMemoryPoolId_t mp_id, void *block)
15363d8536b4Sopenharmony_ci{
15373d8536b4Sopenharmony_ci
15383d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
15393d8536b4Sopenharmony_ci    LOS_MEMBOX_NODE *node = NULL;
15403d8536b4Sopenharmony_ci    LOS_MEMBOX_NODE *nodeTmp = NULL;
15413d8536b4Sopenharmony_ci    UINT32 intSave;
15423d8536b4Sopenharmony_ci
15433d8536b4Sopenharmony_ci    if ((mp_id == NULL) || (block == NULL)) {
15443d8536b4Sopenharmony_ci        return osErrorParameter;
15453d8536b4Sopenharmony_ci    }
15463d8536b4Sopenharmony_ci
15473d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
15483d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
15493d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
15503d8536b4Sopenharmony_ci        return osErrorResource;
15513d8536b4Sopenharmony_ci    }
15523d8536b4Sopenharmony_ci
15533d8536b4Sopenharmony_ci    if (((UINTPTR)block < (UINTPTR)mp->poolBase) ||
15543d8536b4Sopenharmony_ci        ((UINTPTR)block >= ((UINTPTR)mp->poolBase + (UINTPTR)mp->poolSize))) {
15553d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
15563d8536b4Sopenharmony_ci        return osErrorParameter;
15573d8536b4Sopenharmony_ci    }
15583d8536b4Sopenharmony_ci
15593d8536b4Sopenharmony_ci    node = (LOS_MEMBOX_NODE *)block;
15603d8536b4Sopenharmony_ci    nodeTmp = mp->poolInfo.stFreeList.pstNext;
15613d8536b4Sopenharmony_ci    mp->poolInfo.stFreeList.pstNext = node;
15623d8536b4Sopenharmony_ci    node->pstNext = nodeTmp;
15633d8536b4Sopenharmony_ci    mp->poolInfo.uwBlkCnt--;
15643d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
15653d8536b4Sopenharmony_ci
15663d8536b4Sopenharmony_ci    return osOK;
15673d8536b4Sopenharmony_ci}
15683d8536b4Sopenharmony_ci
15693d8536b4Sopenharmony_ciosStatus_t osMemoryPoolDelete(osMemoryPoolId_t mp_id)
15703d8536b4Sopenharmony_ci{
15713d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
15723d8536b4Sopenharmony_ci    UINT32 intSave;
15733d8536b4Sopenharmony_ci
15743d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
15753d8536b4Sopenharmony_ci        return osErrorISR;
15763d8536b4Sopenharmony_ci    }
15773d8536b4Sopenharmony_ci
15783d8536b4Sopenharmony_ci    if (mp_id == NULL) {
15793d8536b4Sopenharmony_ci        return osErrorParameter;
15803d8536b4Sopenharmony_ci    }
15813d8536b4Sopenharmony_ci
15823d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
15833d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
15843d8536b4Sopenharmony_ci        LOS_IntRestore(intSave);
15853d8536b4Sopenharmony_ci        return osErrorResource;
15863d8536b4Sopenharmony_ci    }
15873d8536b4Sopenharmony_ci
15883d8536b4Sopenharmony_ci    if (mp->status & MD_ALLOC) {
15893d8536b4Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, mp->poolBase);
15903d8536b4Sopenharmony_ci        mp->poolBase = NULL;
15913d8536b4Sopenharmony_ci    }
15923d8536b4Sopenharmony_ci
15933d8536b4Sopenharmony_ci    mp->name = NULL;
15943d8536b4Sopenharmony_ci    mp->status &= ~MEM_POOL_VALID;
15953d8536b4Sopenharmony_ci
15963d8536b4Sopenharmony_ci    if (mp->status & MP_ALLOC) {
15973d8536b4Sopenharmony_ci        (void)LOS_MemFree(OS_SYS_MEM_ADDR, mp);
15983d8536b4Sopenharmony_ci    }
15993d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
16003d8536b4Sopenharmony_ci
16013d8536b4Sopenharmony_ci    return osOK;
16023d8536b4Sopenharmony_ci}
16033d8536b4Sopenharmony_ci
16043d8536b4Sopenharmony_ciuint32_t osMemoryPoolGetCapacity(osMemoryPoolId_t mp_id)
16053d8536b4Sopenharmony_ci{
16063d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
16073d8536b4Sopenharmony_ci    UINT32 intSave;
16083d8536b4Sopenharmony_ci    uint32_t num;
16093d8536b4Sopenharmony_ci
16103d8536b4Sopenharmony_ci    if (mp_id == NULL) {
16113d8536b4Sopenharmony_ci        return 0;
16123d8536b4Sopenharmony_ci    }
16133d8536b4Sopenharmony_ci
16143d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
16153d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
16163d8536b4Sopenharmony_ci        num = 0;
16173d8536b4Sopenharmony_ci    } else {
16183d8536b4Sopenharmony_ci        num = mp->poolInfo.uwBlkNum;
16193d8536b4Sopenharmony_ci    }
16203d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
16213d8536b4Sopenharmony_ci
16223d8536b4Sopenharmony_ci    return num;
16233d8536b4Sopenharmony_ci}
16243d8536b4Sopenharmony_ci
16253d8536b4Sopenharmony_ciuint32_t osMemoryPoolGetBlockSize(osMemoryPoolId_t mp_id)
16263d8536b4Sopenharmony_ci{
16273d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
16283d8536b4Sopenharmony_ci    UINT32 intSave;
16293d8536b4Sopenharmony_ci    uint32_t size;
16303d8536b4Sopenharmony_ci
16313d8536b4Sopenharmony_ci    if (mp_id == NULL) {
16323d8536b4Sopenharmony_ci        return 0;
16333d8536b4Sopenharmony_ci    }
16343d8536b4Sopenharmony_ci
16353d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
16363d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
16373d8536b4Sopenharmony_ci        size = 0;
16383d8536b4Sopenharmony_ci    } else {
16393d8536b4Sopenharmony_ci        size = mp->poolInfo.uwBlkSize;
16403d8536b4Sopenharmony_ci    }
16413d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
16423d8536b4Sopenharmony_ci
16433d8536b4Sopenharmony_ci    return size;
16443d8536b4Sopenharmony_ci}
16453d8536b4Sopenharmony_ci
16463d8536b4Sopenharmony_ciuint32_t osMemoryPoolGetCount(osMemoryPoolId_t mp_id)
16473d8536b4Sopenharmony_ci{
16483d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
16493d8536b4Sopenharmony_ci    UINT32 intSave;
16503d8536b4Sopenharmony_ci    uint32_t count;
16513d8536b4Sopenharmony_ci
16523d8536b4Sopenharmony_ci    if (mp_id == NULL) {
16533d8536b4Sopenharmony_ci        return 0;
16543d8536b4Sopenharmony_ci    }
16553d8536b4Sopenharmony_ci
16563d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
16573d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
16583d8536b4Sopenharmony_ci        count = 0;
16593d8536b4Sopenharmony_ci    } else {
16603d8536b4Sopenharmony_ci        count = mp->poolInfo.uwBlkCnt;
16613d8536b4Sopenharmony_ci    }
16623d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
16633d8536b4Sopenharmony_ci
16643d8536b4Sopenharmony_ci    return count;
16653d8536b4Sopenharmony_ci}
16663d8536b4Sopenharmony_ci
16673d8536b4Sopenharmony_ciuint32_t osMemoryPoolGetSpace(osMemoryPoolId_t mp_id)
16683d8536b4Sopenharmony_ci{
16693d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
16703d8536b4Sopenharmony_ci    UINT32 intSave;
16713d8536b4Sopenharmony_ci    uint32_t space;
16723d8536b4Sopenharmony_ci
16733d8536b4Sopenharmony_ci    if (mp_id == NULL) {
16743d8536b4Sopenharmony_ci        return 0;
16753d8536b4Sopenharmony_ci    }
16763d8536b4Sopenharmony_ci
16773d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
16783d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) != MEM_POOL_VALID) {
16793d8536b4Sopenharmony_ci        space = 0;
16803d8536b4Sopenharmony_ci    } else {
16813d8536b4Sopenharmony_ci        space = mp->poolInfo.uwBlkNum - mp->poolInfo.uwBlkCnt;
16823d8536b4Sopenharmony_ci    }
16833d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
16843d8536b4Sopenharmony_ci
16853d8536b4Sopenharmony_ci    return space;
16863d8536b4Sopenharmony_ci
16873d8536b4Sopenharmony_ci}
16883d8536b4Sopenharmony_ci
16893d8536b4Sopenharmony_ciconst char *osMemoryPoolGetName(osMemoryPoolId_t mp_id)
16903d8536b4Sopenharmony_ci{
16913d8536b4Sopenharmony_ci    MemPoolCB *mp = (MemPoolCB *)mp_id;
16923d8536b4Sopenharmony_ci    const char *p = NULL;
16933d8536b4Sopenharmony_ci    UINT32 intSave;
16943d8536b4Sopenharmony_ci
16953d8536b4Sopenharmony_ci    if (mp_id == NULL) {
16963d8536b4Sopenharmony_ci        return NULL;
16973d8536b4Sopenharmony_ci    }
16983d8536b4Sopenharmony_ci
16993d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
17003d8536b4Sopenharmony_ci        return NULL;
17013d8536b4Sopenharmony_ci    }
17023d8536b4Sopenharmony_ci
17033d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
17043d8536b4Sopenharmony_ci    if ((mp->status & MEM_POOL_VALID) == MEM_POOL_VALID) {
17053d8536b4Sopenharmony_ci        p = mp->name;
17063d8536b4Sopenharmony_ci    }
17073d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
17083d8536b4Sopenharmony_ci
17093d8536b4Sopenharmony_ci    return p;
17103d8536b4Sopenharmony_ci}
17113d8536b4Sopenharmony_ci
17123d8536b4Sopenharmony_ci//  ==== Thread Flags Functions ====
17133d8536b4Sopenharmony_ciuint32_t osThreadFlagsSet(osThreadId_t thread_id, uint32_t flags)
17143d8536b4Sopenharmony_ci{
17153d8536b4Sopenharmony_ci    LosTaskCB *taskCB = (LosTaskCB *)thread_id;
17163d8536b4Sopenharmony_ci    UINT32 ret;
17173d8536b4Sopenharmony_ci    EVENT_CB_S *eventCB = NULL;
17183d8536b4Sopenharmony_ci    UINT32 eventSave;
17193d8536b4Sopenharmony_ci
17203d8536b4Sopenharmony_ci    if (taskCB == NULL) {
17213d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
17223d8536b4Sopenharmony_ci    }
17233d8536b4Sopenharmony_ci
17243d8536b4Sopenharmony_ci    eventCB = &(taskCB->event);
17253d8536b4Sopenharmony_ci    eventSave = eventCB->uwEventID;
17263d8536b4Sopenharmony_ci    ret = LOS_EventWrite(eventCB, (UINT32)flags);
17273d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
17283d8536b4Sopenharmony_ci        return ((uint32_t)eventSave | flags);
17293d8536b4Sopenharmony_ci    } else if (ret == LOS_ERRNO_EVENT_SETBIT_INVALID) {
17303d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
17313d8536b4Sopenharmony_ci    } else {
17323d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorResource;
17333d8536b4Sopenharmony_ci    }
17343d8536b4Sopenharmony_ci}
17353d8536b4Sopenharmony_ci
17363d8536b4Sopenharmony_ciuint32_t osThreadFlagsClear(uint32_t flags)
17373d8536b4Sopenharmony_ci{
17383d8536b4Sopenharmony_ci    UINT32 ret;
17393d8536b4Sopenharmony_ci    UINT32 saveFlags;
17403d8536b4Sopenharmony_ci    LosTaskCB *runTask = NULL;
17413d8536b4Sopenharmony_ci    EVENT_CB_S *eventCB = NULL;
17423d8536b4Sopenharmony_ci
17433d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
17443d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorUnknown;
17453d8536b4Sopenharmony_ci    }
17463d8536b4Sopenharmony_ci
17473d8536b4Sopenharmony_ci    runTask = g_losTask.runTask;
17483d8536b4Sopenharmony_ci    eventCB = &(runTask->event);
17493d8536b4Sopenharmony_ci    saveFlags = eventCB->uwEventID;
17503d8536b4Sopenharmony_ci
17513d8536b4Sopenharmony_ci    ret = LOS_EventClear(eventCB, ~(UINT32)flags);
17523d8536b4Sopenharmony_ci    if (ret == LOS_OK) {
17533d8536b4Sopenharmony_ci        return (uint32_t)saveFlags;
17543d8536b4Sopenharmony_ci    }
17553d8536b4Sopenharmony_ci
17563d8536b4Sopenharmony_ci    return (uint32_t)osFlagsErrorResource;
17573d8536b4Sopenharmony_ci}
17583d8536b4Sopenharmony_ci
17593d8536b4Sopenharmony_ciuint32_t osThreadFlagsGet(void)
17603d8536b4Sopenharmony_ci{
17613d8536b4Sopenharmony_ci    LosTaskCB *runTask = NULL;
17623d8536b4Sopenharmony_ci    EVENT_CB_S *eventCB = NULL;
17633d8536b4Sopenharmony_ci
17643d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
17653d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorUnknown;
17663d8536b4Sopenharmony_ci    }
17673d8536b4Sopenharmony_ci
17683d8536b4Sopenharmony_ci    runTask = g_losTask.runTask;
17693d8536b4Sopenharmony_ci    eventCB = &(runTask->event);
17703d8536b4Sopenharmony_ci
17713d8536b4Sopenharmony_ci    return (uint32_t)(eventCB->uwEventID);
17723d8536b4Sopenharmony_ci}
17733d8536b4Sopenharmony_ci
17743d8536b4Sopenharmony_ciuint32_t osThreadFlagsWait(uint32_t flags, uint32_t options, uint32_t timeout)
17753d8536b4Sopenharmony_ci{
17763d8536b4Sopenharmony_ci    UINT32 ret;
17773d8536b4Sopenharmony_ci    UINT32 mode = 0;
17783d8536b4Sopenharmony_ci    LosTaskCB *runTask = NULL;
17793d8536b4Sopenharmony_ci    EVENT_CB_S *eventCB = NULL;
17803d8536b4Sopenharmony_ci
17813d8536b4Sopenharmony_ci    if (OS_INT_ACTIVE) {
17823d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorUnknown;
17833d8536b4Sopenharmony_ci    }
17843d8536b4Sopenharmony_ci
17853d8536b4Sopenharmony_ci    if (options > (osFlagsWaitAny | osFlagsWaitAll | osFlagsNoClear)) {
17863d8536b4Sopenharmony_ci        return (uint32_t)osFlagsErrorParameter;
17873d8536b4Sopenharmony_ci    }
17883d8536b4Sopenharmony_ci
17893d8536b4Sopenharmony_ci    if ((options & osFlagsWaitAll) == osFlagsWaitAll) {
17903d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_AND;
17913d8536b4Sopenharmony_ci    } else {
17923d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_OR;
17933d8536b4Sopenharmony_ci    }
17943d8536b4Sopenharmony_ci
17953d8536b4Sopenharmony_ci    if ((options & osFlagsNoClear) == osFlagsNoClear) {
17963d8536b4Sopenharmony_ci        mode &= ~LOS_WAITMODE_CLR;
17973d8536b4Sopenharmony_ci    } else {
17983d8536b4Sopenharmony_ci        mode |= LOS_WAITMODE_CLR;
17993d8536b4Sopenharmony_ci    }
18003d8536b4Sopenharmony_ci
18013d8536b4Sopenharmony_ci    runTask = g_losTask.runTask;
18023d8536b4Sopenharmony_ci    eventCB = &(runTask->event);
18033d8536b4Sopenharmony_ci
18043d8536b4Sopenharmony_ci    ret = LOS_EventRead(eventCB, (UINT32)flags, mode, (UINT32)timeout);
18053d8536b4Sopenharmony_ci    if (!(ret & LOS_ERRTYPE_ERROR)) {
18063d8536b4Sopenharmony_ci        return (uint32_t)eventCB->uwEventID | ret;
18073d8536b4Sopenharmony_ci    }
18083d8536b4Sopenharmony_ci
18093d8536b4Sopenharmony_ci    switch (ret) {
18103d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_PTR_NULL:
18113d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_SETBIT_INVALID:
18123d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_EVENTMASK_INVALID:
18133d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_FLAGS_INVALID:
18143d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorParameter;
18153d8536b4Sopenharmony_ci        case LOS_ERRNO_EVENT_READ_TIMEOUT:
18163d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorTimeout;
18173d8536b4Sopenharmony_ci        default:
18183d8536b4Sopenharmony_ci            return (uint32_t)osFlagsErrorResource;
18193d8536b4Sopenharmony_ci    }
18203d8536b4Sopenharmony_ci}
1821