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