13d8536b4Sopenharmony_ci/*
23d8536b4Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
33d8536b4Sopenharmony_ci * Copyright (c) 2020-2022 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 "los_cpup.h"
333d8536b4Sopenharmony_ci#include "securec.h"
343d8536b4Sopenharmony_ci#include "los_memory.h"
353d8536b4Sopenharmony_ci#include "los_debug.h"
363d8536b4Sopenharmony_ci#include "los_tick.h"
373d8536b4Sopenharmony_ci
383d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR == 1)
393d8536b4Sopenharmony_ci#include "los_swtmr.h"
403d8536b4Sopenharmony_ci#endif
413d8536b4Sopenharmony_ci
423d8536b4Sopenharmony_ci#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)
433d8536b4Sopenharmony_ci#include "los_arch_interrupt.h"
443d8536b4Sopenharmony_ci#endif
453d8536b4Sopenharmony_ci
463d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_CPUP == 1)
473d8536b4Sopenharmony_ci/**
483d8536b4Sopenharmony_ci * @ingroup los_cpup
493d8536b4Sopenharmony_ci * CPU usage-type macro: used for tasks.
503d8536b4Sopenharmony_ci */
513d8536b4Sopenharmony_ci#define OS_THREAD_TYPE_TASK     0
523d8536b4Sopenharmony_ci
533d8536b4Sopenharmony_ci/**
543d8536b4Sopenharmony_ci * @ingroup los_cpup
553d8536b4Sopenharmony_ci * CPU usage-type macro: used for hardware interrupts.
563d8536b4Sopenharmony_ci */
573d8536b4Sopenharmony_ci#define OS_THREAD_TYPE_HWI      1
583d8536b4Sopenharmony_ci
593d8536b4Sopenharmony_ci#define OS_CPUP_RECORD_PERIOD   (g_sysClock)
603d8536b4Sopenharmony_ci
613d8536b4Sopenharmony_ci#define OS_SYS_CYCLE_TO_US(cycle)  ((cycle) / (g_sysClock)) * OS_SYS_US_PER_SECOND + \
623d8536b4Sopenharmony_ci    ((cycle) % (g_sysClock) * OS_SYS_US_PER_SECOND / (g_sysClock))
633d8536b4Sopenharmony_ci
643d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT16    g_cpupInitFlg = 0;
653d8536b4Sopenharmony_ciLITE_OS_SEC_BSS OsCpupCB  *g_cpup = NULL;
663d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT64    g_lastRecordTime;
673d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT16    g_hisPos; /* current Sampling point of historyTime */
683d8536b4Sopenharmony_ci
693d8536b4Sopenharmony_ci#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)
703d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT16    g_irqCpupInitFlg = 0;
713d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT16    g_irqHisPos = 0; /* current Sampling point of historyTime */
723d8536b4Sopenharmony_ciLITE_OS_SEC_BSS UINT64    g_irqLastRecordTime;
733d8536b4Sopenharmony_ciLITE_OS_SEC_BSS OsIrqCpupCB *g_irqCpup = NULL;
743d8536b4Sopenharmony_ciLITE_OS_SEC_BSS STATIC UINT64 g_cpuHistoryTime[OS_CPUP_HISTORY_RECORD_NUM];
753d8536b4Sopenharmony_ci#define OS_CPUP_USED      0x1U
763d8536b4Sopenharmony_ci
773d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR == 1)
783d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID)
793d8536b4Sopenharmony_ci{
803d8536b4Sopenharmony_ci    UINT16 prevPos;
813d8536b4Sopenharmony_ci    UINT32 loop;
823d8536b4Sopenharmony_ci    UINT32 intSave;
833d8536b4Sopenharmony_ci
843d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
853d8536b4Sopenharmony_ci    prevPos = g_irqHisPos;
863d8536b4Sopenharmony_ci
873d8536b4Sopenharmony_ci    if (g_irqHisPos == OS_CPUP_HISTORY_RECORD_NUM - 1) {
883d8536b4Sopenharmony_ci        g_irqHisPos = 0;
893d8536b4Sopenharmony_ci    } else {
903d8536b4Sopenharmony_ci        g_irqHisPos++;
913d8536b4Sopenharmony_ci    }
923d8536b4Sopenharmony_ci
933d8536b4Sopenharmony_ci    g_cpuHistoryTime[prevPos] = 0;
943d8536b4Sopenharmony_ci    for (loop = 0; loop < LOSCFG_PLATFORM_HWI_LIMIT; loop++) {
953d8536b4Sopenharmony_ci        if (g_irqCpup[loop].status != OS_CPUP_USED) {
963d8536b4Sopenharmony_ci            continue;
973d8536b4Sopenharmony_ci        }
983d8536b4Sopenharmony_ci        g_irqCpup[loop].historyTime[prevPos] = g_irqCpup[loop].allTime;
993d8536b4Sopenharmony_ci        g_cpuHistoryTime[prevPos] += g_irqCpup[loop].allTime;
1003d8536b4Sopenharmony_ci    }
1013d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
1023d8536b4Sopenharmony_ci
1033d8536b4Sopenharmony_ci    return;
1043d8536b4Sopenharmony_ci}
1053d8536b4Sopenharmony_ci
1063d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 OsCpupGuardCreator(VOID)
1073d8536b4Sopenharmony_ci{
1083d8536b4Sopenharmony_ci    UINT32 cpupSwtmrID;
1093d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR_ALIGN == 1)
1103d8536b4Sopenharmony_ci    (VOID)LOS_SwtmrCreate(LOSCFG_BASE_CORE_TICK_PER_SECOND, LOS_SWTMR_MODE_PERIOD,
1113d8536b4Sopenharmony_ci                          (SWTMR_PROC_FUNC)OsCpupGuard, &cpupSwtmrID, 0,
1123d8536b4Sopenharmony_ci                          OS_SWTMR_ROUSES_ALLOW, OS_SWTMR_ALIGN_INSENSITIVE);
1133d8536b4Sopenharmony_ci#else
1143d8536b4Sopenharmony_ci    (VOID)LOS_SwtmrCreate(LOSCFG_BASE_CORE_TICK_PER_SECOND, LOS_SWTMR_MODE_PERIOD,
1153d8536b4Sopenharmony_ci                          (SWTMR_PROC_FUNC)OsCpupGuard, &cpupSwtmrID, 0);
1163d8536b4Sopenharmony_ci#endif
1173d8536b4Sopenharmony_ci
1183d8536b4Sopenharmony_ci    (VOID)LOS_SwtmrStart(cpupSwtmrID);
1193d8536b4Sopenharmony_ci
1203d8536b4Sopenharmony_ci    return LOS_OK;
1213d8536b4Sopenharmony_ci}
1223d8536b4Sopenharmony_ci#endif
1233d8536b4Sopenharmony_ci
1243d8536b4Sopenharmony_ci/*****************************************************************************
1253d8536b4Sopenharmony_ciFunction   : OsCpupDaemonInit
1263d8536b4Sopenharmony_ciDescription: initialization of CPUP Daemon
1273d8536b4Sopenharmony_ciInput      : None
1283d8536b4Sopenharmony_ciReturn     : LOS_OK or Error Information
1293d8536b4Sopenharmony_ci*****************************************************************************/
1303d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 OsCpupDaemonInit()
1313d8536b4Sopenharmony_ci{
1323d8536b4Sopenharmony_ci#if (LOSCFG_BASE_CORE_SWTMR == 1)
1333d8536b4Sopenharmony_ci    (VOID)OsCpupGuardCreator();
1343d8536b4Sopenharmony_ci    g_irqCpupInitFlg = 1;
1353d8536b4Sopenharmony_ci#endif
1363d8536b4Sopenharmony_ci
1373d8536b4Sopenharmony_ci    return LOS_OK;
1383d8536b4Sopenharmony_ci}
1393d8536b4Sopenharmony_ci#endif
1403d8536b4Sopenharmony_ci
1413d8536b4Sopenharmony_ci/*****************************************************************************
1423d8536b4Sopenharmony_ciFunction   : OsCpupInit
1433d8536b4Sopenharmony_ciDescription: initialization of CPUP
1443d8536b4Sopenharmony_ciInput      : None
1453d8536b4Sopenharmony_ciReturn     : LOS_OK or Error Information
1463d8536b4Sopenharmony_ci*****************************************************************************/
1473d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit()
1483d8536b4Sopenharmony_ci{
1493d8536b4Sopenharmony_ci    UINT32 size;
1503d8536b4Sopenharmony_ci    CHAR *cpupMem = NULL;
1513d8536b4Sopenharmony_ci
1523d8536b4Sopenharmony_ci    size = g_taskMaxNum * sizeof(OsCpupCB);
1533d8536b4Sopenharmony_ci#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)
1543d8536b4Sopenharmony_ci    size += LOSCFG_PLATFORM_HWI_LIMIT * sizeof(OsIrqCpupCB);
1553d8536b4Sopenharmony_ci#endif
1563d8536b4Sopenharmony_ci
1573d8536b4Sopenharmony_ci    cpupMem = LOS_MemAlloc(m_aucSysMem0, size);
1583d8536b4Sopenharmony_ci    if (cpupMem == NULL) {
1593d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_NO_MEMORY;
1603d8536b4Sopenharmony_ci    }
1613d8536b4Sopenharmony_ci    (VOID)memset_s(cpupMem, size, 0, size);
1623d8536b4Sopenharmony_ci
1633d8536b4Sopenharmony_ci    g_cpup = (OsCpupCB *)cpupMem;
1643d8536b4Sopenharmony_ci#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)
1653d8536b4Sopenharmony_ci    g_irqCpup = (OsIrqCpupCB *)(cpupMem + g_taskMaxNum * sizeof(OsCpupCB));
1663d8536b4Sopenharmony_ci#endif
1673d8536b4Sopenharmony_ci
1683d8536b4Sopenharmony_ci    g_cpupInitFlg = 1;
1693d8536b4Sopenharmony_ci
1703d8536b4Sopenharmony_ci    return LOS_OK;
1713d8536b4Sopenharmony_ci}
1723d8536b4Sopenharmony_ci
1733d8536b4Sopenharmony_ci/* The calculation time unit is changed to us to decouple the influence of
1743d8536b4Sopenharmony_ci * system frequency modulation on CPUP
1753d8536b4Sopenharmony_ci */
1763d8536b4Sopenharmony_ciSTATIC UINT64 CpupTimeUsGet(VOID)
1773d8536b4Sopenharmony_ci{
1783d8536b4Sopenharmony_ci    UINT64 time = LOS_SysCycleGet();
1793d8536b4Sopenharmony_ci    return OS_SYS_CYCLE_TO_US(time);
1803d8536b4Sopenharmony_ci}
1813d8536b4Sopenharmony_ci
1823d8536b4Sopenharmony_ci/*****************************************************************************
1833d8536b4Sopenharmony_ciFunction   : OsTskCycleStart
1843d8536b4Sopenharmony_ciDescription: start task to get cycles count in current task beginning
1853d8536b4Sopenharmony_ciInput      : None
1863d8536b4Sopenharmony_ciReturn     : None
1873d8536b4Sopenharmony_ci*****************************************************************************/
1883d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR VOID OsTskCycleStart(VOID)
1893d8536b4Sopenharmony_ci{
1903d8536b4Sopenharmony_ci    UINT32 taskID;
1913d8536b4Sopenharmony_ci
1923d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
1933d8536b4Sopenharmony_ci        return;
1943d8536b4Sopenharmony_ci    }
1953d8536b4Sopenharmony_ci
1963d8536b4Sopenharmony_ci    taskID = g_losTask.newTask->taskID;
1973d8536b4Sopenharmony_ci    g_cpup[taskID].cpupID = taskID;
1983d8536b4Sopenharmony_ci    g_cpup[taskID].startTime = CpupTimeUsGet();
1993d8536b4Sopenharmony_ci
2003d8536b4Sopenharmony_ci    return;
2013d8536b4Sopenharmony_ci}
2023d8536b4Sopenharmony_ci
2033d8536b4Sopenharmony_ci/*****************************************************************************
2043d8536b4Sopenharmony_ciFunction   : OsTskCycleEnd
2053d8536b4Sopenharmony_ciDescription: quit task and get cycle count
2063d8536b4Sopenharmony_ciInput      : None
2073d8536b4Sopenharmony_ciReturn     : None
2083d8536b4Sopenharmony_ci*****************************************************************************/
2093d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR VOID OsTskCycleEnd(VOID)
2103d8536b4Sopenharmony_ci{
2113d8536b4Sopenharmony_ci    UINT32 taskID;
2123d8536b4Sopenharmony_ci    UINT64 cpuTime;
2133d8536b4Sopenharmony_ci
2143d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
2153d8536b4Sopenharmony_ci        return;
2163d8536b4Sopenharmony_ci    }
2173d8536b4Sopenharmony_ci
2183d8536b4Sopenharmony_ci    taskID = g_losTask.runTask->taskID;
2193d8536b4Sopenharmony_ci
2203d8536b4Sopenharmony_ci    if (g_cpup[taskID].startTime == 0) {
2213d8536b4Sopenharmony_ci        return;
2223d8536b4Sopenharmony_ci    }
2233d8536b4Sopenharmony_ci
2243d8536b4Sopenharmony_ci    cpuTime = CpupTimeUsGet();
2253d8536b4Sopenharmony_ci    if (cpuTime < g_cpup[taskID].startTime) {
2263d8536b4Sopenharmony_ci        cpuTime += OS_US_PER_TICK;
2273d8536b4Sopenharmony_ci    }
2283d8536b4Sopenharmony_ci
2293d8536b4Sopenharmony_ci    g_cpup[taskID].allTime += (cpuTime - g_cpup[taskID].startTime);
2303d8536b4Sopenharmony_ci    g_cpup[taskID].startTime = 0;
2313d8536b4Sopenharmony_ci
2323d8536b4Sopenharmony_ci    return;
2333d8536b4Sopenharmony_ci}
2343d8536b4Sopenharmony_ci
2353d8536b4Sopenharmony_ci/*****************************************************************************
2363d8536b4Sopenharmony_ciFunction   : OsTskCycleEndStart
2373d8536b4Sopenharmony_ciDescription: start task to get cycles count in current task ending
2383d8536b4Sopenharmony_ciInput      : None
2393d8536b4Sopenharmony_ciReturn     : None
2403d8536b4Sopenharmony_ci*****************************************************************************/
2413d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR VOID OsTskCycleEndStart(VOID)
2423d8536b4Sopenharmony_ci{
2433d8536b4Sopenharmony_ci    UINT32 taskID;
2443d8536b4Sopenharmony_ci    UINT64 cpuTime;
2453d8536b4Sopenharmony_ci    UINT16 loopNum;
2463d8536b4Sopenharmony_ci
2473d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
2483d8536b4Sopenharmony_ci        return;
2493d8536b4Sopenharmony_ci    }
2503d8536b4Sopenharmony_ci
2513d8536b4Sopenharmony_ci    taskID = g_losTask.runTask->taskID;
2523d8536b4Sopenharmony_ci    cpuTime = CpupTimeUsGet();
2533d8536b4Sopenharmony_ci
2543d8536b4Sopenharmony_ci    if (g_cpup[taskID].startTime != 0) {
2553d8536b4Sopenharmony_ci        if (cpuTime < g_cpup[taskID].startTime) {
2563d8536b4Sopenharmony_ci            cpuTime += OS_US_PER_TICK;
2573d8536b4Sopenharmony_ci        }
2583d8536b4Sopenharmony_ci
2593d8536b4Sopenharmony_ci        g_cpup[taskID].allTime += (cpuTime - g_cpup[taskID].startTime);
2603d8536b4Sopenharmony_ci        g_cpup[taskID].startTime = 0;
2613d8536b4Sopenharmony_ci    }
2623d8536b4Sopenharmony_ci
2633d8536b4Sopenharmony_ci    taskID = g_losTask.newTask->taskID;
2643d8536b4Sopenharmony_ci    g_cpup[taskID].cpupID = taskID;
2653d8536b4Sopenharmony_ci    g_cpup[taskID].startTime = cpuTime;
2663d8536b4Sopenharmony_ci
2673d8536b4Sopenharmony_ci    if ((cpuTime - g_lastRecordTime) > OS_CPUP_RECORD_PERIOD) {
2683d8536b4Sopenharmony_ci        g_lastRecordTime = cpuTime;
2693d8536b4Sopenharmony_ci
2703d8536b4Sopenharmony_ci        for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
2713d8536b4Sopenharmony_ci            g_cpup[loopNum].historyTime[g_hisPos] = g_cpup[loopNum].allTime;
2723d8536b4Sopenharmony_ci        }
2733d8536b4Sopenharmony_ci
2743d8536b4Sopenharmony_ci        if (g_hisPos == (OS_CPUP_HISTORY_RECORD_NUM - 1)) {
2753d8536b4Sopenharmony_ci            g_hisPos = 0;
2763d8536b4Sopenharmony_ci        } else {
2773d8536b4Sopenharmony_ci            g_hisPos++;
2783d8536b4Sopenharmony_ci        }
2793d8536b4Sopenharmony_ci    }
2803d8536b4Sopenharmony_ci
2813d8536b4Sopenharmony_ci    return;
2823d8536b4Sopenharmony_ci}
2833d8536b4Sopenharmony_ci
2843d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT16 OsGetPrePos(UINT16 curPos)
2853d8536b4Sopenharmony_ci{
2863d8536b4Sopenharmony_ci    return (curPos == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : (curPos - 1);
2873d8536b4Sopenharmony_ci}
2883d8536b4Sopenharmony_ci
2893d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR STATIC VOID OsGetPositions(UINT16 mode, UINT16* curPosAddr, UINT16* prePosAddr)
2903d8536b4Sopenharmony_ci{
2913d8536b4Sopenharmony_ci    UINT16 curPos;
2923d8536b4Sopenharmony_ci    UINT16 prePos = 0;
2933d8536b4Sopenharmony_ci
2943d8536b4Sopenharmony_ci    curPos = g_hisPos;
2953d8536b4Sopenharmony_ci
2963d8536b4Sopenharmony_ci    if (mode == CPUP_IN_1S) {
2973d8536b4Sopenharmony_ci        curPos = OsGetPrePos(curPos);
2983d8536b4Sopenharmony_ci        prePos = OsGetPrePos(curPos);
2993d8536b4Sopenharmony_ci    } else if (mode == CPUP_LESS_THAN_1S) {
3003d8536b4Sopenharmony_ci        curPos = OsGetPrePos(curPos);
3013d8536b4Sopenharmony_ci    }
3023d8536b4Sopenharmony_ci
3033d8536b4Sopenharmony_ci    *curPosAddr = curPos;
3043d8536b4Sopenharmony_ci    *prePosAddr = prePos;
3053d8536b4Sopenharmony_ci}
3063d8536b4Sopenharmony_ci
3073d8536b4Sopenharmony_ci/*****************************************************************************
3083d8536b4Sopenharmony_ciFunction   : LOS_SysCpuUsage
3093d8536b4Sopenharmony_ciDescription: get current CPU usage
3103d8536b4Sopenharmony_ciInput      : None
3113d8536b4Sopenharmony_ciReturn     : cpupRet:current CPU usage
3123d8536b4Sopenharmony_ci*****************************************************************************/
3133d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_SysCpuUsage(VOID)
3143d8536b4Sopenharmony_ci{
3153d8536b4Sopenharmony_ci    UINT64  cpuTimeAll = 0;
3163d8536b4Sopenharmony_ci    UINT32  cpupRet = 0;
3173d8536b4Sopenharmony_ci    UINT16  loopNum;
3183d8536b4Sopenharmony_ci    UINT32 intSave;
3193d8536b4Sopenharmony_ci
3203d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
3213d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_NO_INIT;
3223d8536b4Sopenharmony_ci    }
3233d8536b4Sopenharmony_ci
3243d8536b4Sopenharmony_ci    // get end time of current task
3253d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
3263d8536b4Sopenharmony_ci    OsTskCycleEnd();
3273d8536b4Sopenharmony_ci
3283d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
3293d8536b4Sopenharmony_ci        cpuTimeAll += g_cpup[loopNum].allTime;
3303d8536b4Sopenharmony_ci    }
3313d8536b4Sopenharmony_ci
3323d8536b4Sopenharmony_ci    if (cpuTimeAll) {
3333d8536b4Sopenharmony_ci        cpupRet = LOS_CPUP_PRECISION -  (UINT32)((LOS_CPUP_PRECISION *
3343d8536b4Sopenharmony_ci            g_cpup[g_idleTaskID].allTime) / cpuTimeAll);
3353d8536b4Sopenharmony_ci    }
3363d8536b4Sopenharmony_ci
3373d8536b4Sopenharmony_ci    OsTskCycleStart();
3383d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
3393d8536b4Sopenharmony_ci
3403d8536b4Sopenharmony_ci    return cpupRet;
3413d8536b4Sopenharmony_ci}
3423d8536b4Sopenharmony_ci
3433d8536b4Sopenharmony_ci/*****************************************************************************
3443d8536b4Sopenharmony_ciFunction   : LOS_HistorySysCpuUsage
3453d8536b4Sopenharmony_ciDescription: get CPU usage history
3463d8536b4Sopenharmony_ciInput      : mode: mode,0 = usage in 10s,1 = usage in last 1s, else = less than 1s
3473d8536b4Sopenharmony_ciReturn     : cpupRet:CPU usage history
3483d8536b4Sopenharmony_ci*****************************************************************************/
3493d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistorySysCpuUsage(UINT16 mode)
3503d8536b4Sopenharmony_ci{
3513d8536b4Sopenharmony_ci    UINT64  cpuTimeAll = 0;
3523d8536b4Sopenharmony_ci    UINT64  idleCycleAll = 0;
3533d8536b4Sopenharmony_ci    UINT32  cpupRet = 0;
3543d8536b4Sopenharmony_ci    UINT16  loopNum;
3553d8536b4Sopenharmony_ci    UINT16  curPos;
3563d8536b4Sopenharmony_ci    UINT16  prePos = 0;
3573d8536b4Sopenharmony_ci    UINT32 intSave;
3583d8536b4Sopenharmony_ci
3593d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
3603d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_NO_INIT;
3613d8536b4Sopenharmony_ci    }
3623d8536b4Sopenharmony_ci
3633d8536b4Sopenharmony_ci    // get end time of current task
3643d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
3653d8536b4Sopenharmony_ci    OsTskCycleEnd();
3663d8536b4Sopenharmony_ci
3673d8536b4Sopenharmony_ci    OsGetPositions(mode, &curPos, &prePos);
3683d8536b4Sopenharmony_ci
3693d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
3703d8536b4Sopenharmony_ci        if (mode == CPUP_IN_1S) {
3713d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos];
3723d8536b4Sopenharmony_ci        } else {
3733d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos];
3743d8536b4Sopenharmony_ci        }
3753d8536b4Sopenharmony_ci    }
3763d8536b4Sopenharmony_ci
3773d8536b4Sopenharmony_ci    if (mode == CPUP_IN_1S) {
3783d8536b4Sopenharmony_ci        idleCycleAll += g_cpup[g_idleTaskID].historyTime[curPos] -
3793d8536b4Sopenharmony_ci                           g_cpup[g_idleTaskID].historyTime[prePos];
3803d8536b4Sopenharmony_ci    } else {
3813d8536b4Sopenharmony_ci        idleCycleAll += g_cpup[g_idleTaskID].allTime - g_cpup[g_idleTaskID].historyTime[curPos];
3823d8536b4Sopenharmony_ci    }
3833d8536b4Sopenharmony_ci
3843d8536b4Sopenharmony_ci    if (cpuTimeAll) {
3853d8536b4Sopenharmony_ci        cpupRet = (LOS_CPUP_PRECISION -  (UINT32)((LOS_CPUP_PRECISION * idleCycleAll) / cpuTimeAll));
3863d8536b4Sopenharmony_ci    }
3873d8536b4Sopenharmony_ci
3883d8536b4Sopenharmony_ci    OsTskCycleStart();
3893d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
3903d8536b4Sopenharmony_ci
3913d8536b4Sopenharmony_ci    return cpupRet;
3923d8536b4Sopenharmony_ci}
3933d8536b4Sopenharmony_ci
3943d8536b4Sopenharmony_ci/*****************************************************************************
3953d8536b4Sopenharmony_ciFunction   : LOS_TaskCpuUsage
3963d8536b4Sopenharmony_ciDescription: get CPU usage of certain task
3973d8536b4Sopenharmony_ciInput      : taskID : task ID
3983d8536b4Sopenharmony_ciReturn     : cpupRet:CPU usage of certain task
3993d8536b4Sopenharmony_ci*****************************************************************************/
4003d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuUsage(UINT32 taskID)
4013d8536b4Sopenharmony_ci{
4023d8536b4Sopenharmony_ci    UINT64  cpuTimeAll = 0;
4033d8536b4Sopenharmony_ci    UINT16  loopNum;
4043d8536b4Sopenharmony_ci    UINT32 intSave;
4053d8536b4Sopenharmony_ci    UINT32  cpupRet = 0;
4063d8536b4Sopenharmony_ci
4073d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
4083d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_NO_INIT;
4093d8536b4Sopenharmony_ci    }
4103d8536b4Sopenharmony_ci    if (OS_TSK_GET_INDEX(taskID) >= g_taskMaxNum) {
4113d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_TSK_ID_INVALID;
4123d8536b4Sopenharmony_ci    }
4133d8536b4Sopenharmony_ci    if (g_cpup[taskID].cpupID != taskID) {
4143d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_THREAD_NO_CREATED;
4153d8536b4Sopenharmony_ci    }
4163d8536b4Sopenharmony_ci    if ((g_cpup[taskID].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskID].status == 0)) {
4173d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_THREAD_NO_CREATED;
4183d8536b4Sopenharmony_ci    }
4193d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
4203d8536b4Sopenharmony_ci    OsTskCycleEnd();
4213d8536b4Sopenharmony_ci
4223d8536b4Sopenharmony_ci    /* get total Cycle */
4233d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
4243d8536b4Sopenharmony_ci        if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loopNum].status == 0)) {
4253d8536b4Sopenharmony_ci            continue;
4263d8536b4Sopenharmony_ci        }
4273d8536b4Sopenharmony_ci        cpuTimeAll += g_cpup[loopNum].allTime;
4283d8536b4Sopenharmony_ci    }
4293d8536b4Sopenharmony_ci
4303d8536b4Sopenharmony_ci    if (cpuTimeAll) {
4313d8536b4Sopenharmony_ci        cpupRet = (UINT32)((LOS_CPUP_PRECISION * g_cpup[taskID].allTime) / cpuTimeAll);
4323d8536b4Sopenharmony_ci    }
4333d8536b4Sopenharmony_ci
4343d8536b4Sopenharmony_ci    OsTskCycleStart();
4353d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
4363d8536b4Sopenharmony_ci
4373d8536b4Sopenharmony_ci    return cpupRet;
4383d8536b4Sopenharmony_ci}
4393d8536b4Sopenharmony_ci
4403d8536b4Sopenharmony_ci/*****************************************************************************
4413d8536b4Sopenharmony_ciFunction   : LOS_HistoryTaskCpuUsage
4423d8536b4Sopenharmony_ciDescription: get CPU usage history of certain task
4433d8536b4Sopenharmony_ciInput      : taskID : task ID
4443d8536b4Sopenharmony_ci           : mode: mode,0 = usage in 10s,1 = usage in last 1s, else = less than 1s
4453d8536b4Sopenharmony_ciReturn     : cpupRet:CPU usage history of task
4463d8536b4Sopenharmony_ci*****************************************************************************/
4473d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryTaskCpuUsage(UINT32 taskID, UINT16 mode)
4483d8536b4Sopenharmony_ci{
4493d8536b4Sopenharmony_ci    UINT64  cpuTimeAll = 0;
4503d8536b4Sopenharmony_ci    UINT64  cpuTimeCurTsk = 0;
4513d8536b4Sopenharmony_ci    UINT16  loopNum, curPos;
4523d8536b4Sopenharmony_ci    UINT16  prePos = 0;
4533d8536b4Sopenharmony_ci    UINT32 intSave;
4543d8536b4Sopenharmony_ci    UINT32  cpupRet = 0;
4553d8536b4Sopenharmony_ci
4563d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
4573d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_NO_INIT;
4583d8536b4Sopenharmony_ci    }
4593d8536b4Sopenharmony_ci    if (OS_TSK_GET_INDEX(taskID) >= g_taskMaxNum) {
4603d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_TSK_ID_INVALID;
4613d8536b4Sopenharmony_ci    }
4623d8536b4Sopenharmony_ci    if (g_cpup[taskID].cpupID != taskID) {
4633d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_THREAD_NO_CREATED;
4643d8536b4Sopenharmony_ci    }
4653d8536b4Sopenharmony_ci    if ((g_cpup[taskID].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskID].status == 0)) {
4663d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_THREAD_NO_CREATED;
4673d8536b4Sopenharmony_ci    }
4683d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
4693d8536b4Sopenharmony_ci    OsTskCycleEnd();
4703d8536b4Sopenharmony_ci
4713d8536b4Sopenharmony_ci    OsGetPositions(mode, &curPos, &prePos);
4723d8536b4Sopenharmony_ci
4733d8536b4Sopenharmony_ci    /* get total Cycle in history */
4743d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
4753d8536b4Sopenharmony_ci        if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loopNum].status == 0)) {
4763d8536b4Sopenharmony_ci            continue;
4773d8536b4Sopenharmony_ci        }
4783d8536b4Sopenharmony_ci
4793d8536b4Sopenharmony_ci        if (mode == CPUP_IN_1S) {
4803d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos];
4813d8536b4Sopenharmony_ci        } else {
4823d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos];
4833d8536b4Sopenharmony_ci        }
4843d8536b4Sopenharmony_ci    }
4853d8536b4Sopenharmony_ci
4863d8536b4Sopenharmony_ci    if (mode == CPUP_IN_1S) {
4873d8536b4Sopenharmony_ci        cpuTimeCurTsk += g_cpup[taskID].historyTime[curPos] - g_cpup[taskID].historyTime[prePos];
4883d8536b4Sopenharmony_ci    } else {
4893d8536b4Sopenharmony_ci        cpuTimeCurTsk += g_cpup[taskID].allTime - g_cpup[taskID].historyTime[curPos];
4903d8536b4Sopenharmony_ci    }
4913d8536b4Sopenharmony_ci    if (cpuTimeAll) {
4923d8536b4Sopenharmony_ci        cpupRet = (UINT32)((LOS_CPUP_PRECISION * cpuTimeCurTsk) / cpuTimeAll);
4933d8536b4Sopenharmony_ci    }
4943d8536b4Sopenharmony_ci
4953d8536b4Sopenharmony_ci    OsTskCycleStart();
4963d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
4973d8536b4Sopenharmony_ci
4983d8536b4Sopenharmony_ci    return cpupRet;
4993d8536b4Sopenharmony_ci}
5003d8536b4Sopenharmony_ci
5013d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllTaskCpuUsage(CPUP_INFO_S *cpupInfo, UINT16 mode)
5023d8536b4Sopenharmony_ci{
5033d8536b4Sopenharmony_ci    UINT16  loopNum;
5043d8536b4Sopenharmony_ci    UINT16  curPos;
5053d8536b4Sopenharmony_ci    UINT16  prePos = 0;
5063d8536b4Sopenharmony_ci    UINT32 intSave;
5073d8536b4Sopenharmony_ci    UINT64  cpuTimeAll = 0;
5083d8536b4Sopenharmony_ci    UINT64  cpuTimeCurTsk = 0;
5093d8536b4Sopenharmony_ci
5103d8536b4Sopenharmony_ci    if (g_cpupInitFlg == 0) {
5113d8536b4Sopenharmony_ci        return  LOS_ERRNO_CPUP_NO_INIT;
5123d8536b4Sopenharmony_ci    }
5133d8536b4Sopenharmony_ci
5143d8536b4Sopenharmony_ci    if (cpupInfo == NULL) {
5153d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_TASK_PTR_NULL;
5163d8536b4Sopenharmony_ci    }
5173d8536b4Sopenharmony_ci
5183d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
5193d8536b4Sopenharmony_ci    OsTskCycleEnd();
5203d8536b4Sopenharmony_ci
5213d8536b4Sopenharmony_ci    OsGetPositions(mode, &curPos, &prePos);
5223d8536b4Sopenharmony_ci
5233d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
5243d8536b4Sopenharmony_ci        if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) ||
5253d8536b4Sopenharmony_ci            (g_cpup[loopNum].status == 0)) {
5263d8536b4Sopenharmony_ci            continue;
5273d8536b4Sopenharmony_ci        }
5283d8536b4Sopenharmony_ci
5293d8536b4Sopenharmony_ci        if (mode == CPUP_IN_1S) {
5303d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos];
5313d8536b4Sopenharmony_ci        } else {
5323d8536b4Sopenharmony_ci            cpuTimeAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos];
5333d8536b4Sopenharmony_ci        }
5343d8536b4Sopenharmony_ci    }
5353d8536b4Sopenharmony_ci
5363d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) {
5373d8536b4Sopenharmony_ci        if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) ||
5383d8536b4Sopenharmony_ci            (g_cpup[loopNum].status == 0)) {
5393d8536b4Sopenharmony_ci            continue;
5403d8536b4Sopenharmony_ci        }
5413d8536b4Sopenharmony_ci
5423d8536b4Sopenharmony_ci        if (mode == CPUP_IN_1S) {
5433d8536b4Sopenharmony_ci            cpuTimeCurTsk += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos];
5443d8536b4Sopenharmony_ci        } else {
5453d8536b4Sopenharmony_ci            cpuTimeCurTsk += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos];
5463d8536b4Sopenharmony_ci        }
5473d8536b4Sopenharmony_ci        cpupInfo[loopNum].usStatus = g_cpup[loopNum].status;
5483d8536b4Sopenharmony_ci        if (cpuTimeAll) {
5493d8536b4Sopenharmony_ci            cpupInfo[loopNum].uwUsage = (UINT32)((LOS_CPUP_PRECISION * cpuTimeCurTsk) / cpuTimeAll);
5503d8536b4Sopenharmony_ci        }
5513d8536b4Sopenharmony_ci
5523d8536b4Sopenharmony_ci        cpuTimeCurTsk = 0;
5533d8536b4Sopenharmony_ci    }
5543d8536b4Sopenharmony_ci
5553d8536b4Sopenharmony_ci    OsTskCycleStart();
5563d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
5573d8536b4Sopenharmony_ci
5583d8536b4Sopenharmony_ci    return LOS_OK;
5593d8536b4Sopenharmony_ci}
5603d8536b4Sopenharmony_ci
5613d8536b4Sopenharmony_ci/*****************************************************************************
5623d8536b4Sopenharmony_ciFunction   : LOS_CpupUsageMonitor
5633d8536b4Sopenharmony_ciDescription: Get CPU usage history of certain task.
5643d8536b4Sopenharmony_ciInput      : type: cpup type, SYS_CPU_USAGE and TASK_CPU_USAGE
5653d8536b4Sopenharmony_ci           : taskID: task ID, Only in SYS_CPU_USAGE type, taskID is invalid
5663d8536b4Sopenharmony_ci           : mode: mode, CPUP_IN_10S = usage in 10s, CPUP_IN_1S = usage in last 1s, CPUP_LESS_THAN_1S = less than 1s
5673d8536b4Sopenharmony_ciReturn     : LOS_OK on success, or OS_ERROR on failure
5683d8536b4Sopenharmony_ci*****************************************************************************/
5693d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 taskID)
5703d8536b4Sopenharmony_ci{
5713d8536b4Sopenharmony_ci    UINT32 ret;
5723d8536b4Sopenharmony_ci    LosTaskCB *taskCB = NULL;
5733d8536b4Sopenharmony_ci
5743d8536b4Sopenharmony_ci    switch (type) {
5753d8536b4Sopenharmony_ci        case SYS_CPU_USAGE:
5763d8536b4Sopenharmony_ci            if (mode == CPUP_IN_10S) {
5773d8536b4Sopenharmony_ci                PRINTK("\nSysCpuUsage in 10s: ");
5783d8536b4Sopenharmony_ci            } else if (mode == CPUP_IN_1S) {
5793d8536b4Sopenharmony_ci                PRINTK("\nSysCpuUsage in 1s: ");
5803d8536b4Sopenharmony_ci            } else {
5813d8536b4Sopenharmony_ci                PRINTK("\nSysCpuUsage in <1s: ");
5823d8536b4Sopenharmony_ci            }
5833d8536b4Sopenharmony_ci            ret = LOS_HistorySysCpuUsage(mode);
5843d8536b4Sopenharmony_ci            PRINTK("%d.%d", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT);
5853d8536b4Sopenharmony_ci            break;
5863d8536b4Sopenharmony_ci
5873d8536b4Sopenharmony_ci        case TASK_CPU_USAGE:
5883d8536b4Sopenharmony_ci            if (taskID > LOSCFG_BASE_CORE_TSK_LIMIT) {
5893d8536b4Sopenharmony_ci                PRINT_ERR("\nThe taskid is invalid.\n");
5903d8536b4Sopenharmony_ci                return OS_ERROR;
5913d8536b4Sopenharmony_ci            }
5923d8536b4Sopenharmony_ci            taskCB = OS_TCB_FROM_TID(taskID);
5933d8536b4Sopenharmony_ci            if ((taskCB->taskStatus & OS_TASK_STATUS_UNUSED)) {
5943d8536b4Sopenharmony_ci                PRINT_ERR("\nThe taskid is invalid.\n");
5953d8536b4Sopenharmony_ci                return OS_ERROR;
5963d8536b4Sopenharmony_ci            }
5973d8536b4Sopenharmony_ci            if (mode == CPUP_IN_10S) {
5983d8536b4Sopenharmony_ci                PRINTK("\nCPUusage of taskID %d in 10s: ", taskID);
5993d8536b4Sopenharmony_ci            } else if (mode == CPUP_IN_1S) {
6003d8536b4Sopenharmony_ci                PRINTK("\nCPUusage of taskID %d in 1s: ", taskID);
6013d8536b4Sopenharmony_ci            } else {
6023d8536b4Sopenharmony_ci                PRINTK("\nCPUusage of taskID %d in <1s: ", taskID);
6033d8536b4Sopenharmony_ci            }
6043d8536b4Sopenharmony_ci            ret = LOS_HistoryTaskCpuUsage(taskID, mode);
6053d8536b4Sopenharmony_ci            PRINTK("%u.%u", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT);
6063d8536b4Sopenharmony_ci            break;
6073d8536b4Sopenharmony_ci
6083d8536b4Sopenharmony_ci        default:
6093d8536b4Sopenharmony_ci            PRINT_ERR("\nThe type is invalid.\n");
6103d8536b4Sopenharmony_ci            return OS_ERROR;
6113d8536b4Sopenharmony_ci    }
6123d8536b4Sopenharmony_ci
6133d8536b4Sopenharmony_ci    return LOS_OK;
6143d8536b4Sopenharmony_ci}
6153d8536b4Sopenharmony_ci
6163d8536b4Sopenharmony_ci#if (LOSCFG_CPUP_INCLUDE_IRQ == 1)
6173d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(UINT32 intNum)
6183d8536b4Sopenharmony_ci{
6193d8536b4Sopenharmony_ci    if ((g_irqCpupInitFlg == 0) || (intNum < OS_SYS_VECTOR_CNT)) {
6203d8536b4Sopenharmony_ci        return;
6213d8536b4Sopenharmony_ci    }
6223d8536b4Sopenharmony_ci    UINT32 cpupIntNum = intNum - OS_SYS_VECTOR_CNT;
6233d8536b4Sopenharmony_ci    g_irqCpup[cpupIntNum].startTime = CpupTimeUsGet();
6243d8536b4Sopenharmony_ci    return;
6253d8536b4Sopenharmony_ci}
6263d8536b4Sopenharmony_ci
6273d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT32 intNum)
6283d8536b4Sopenharmony_ci{
6293d8536b4Sopenharmony_ci    UINT64 cpuTime;
6303d8536b4Sopenharmony_ci    UINT64 usedTime;
6313d8536b4Sopenharmony_ci
6323d8536b4Sopenharmony_ci    if ((g_irqCpupInitFlg == 0) || (intNum < OS_SYS_VECTOR_CNT)) {
6333d8536b4Sopenharmony_ci        return;
6343d8536b4Sopenharmony_ci    }
6353d8536b4Sopenharmony_ci
6363d8536b4Sopenharmony_ci    UINT32 cpupIntNum = intNum - OS_SYS_VECTOR_CNT;
6373d8536b4Sopenharmony_ci    if (g_irqCpup[cpupIntNum].startTime == 0) {
6383d8536b4Sopenharmony_ci        return;
6393d8536b4Sopenharmony_ci    }
6403d8536b4Sopenharmony_ci
6413d8536b4Sopenharmony_ci    cpuTime = CpupTimeUsGet();
6423d8536b4Sopenharmony_ci    if (cpuTime < g_irqCpup[cpupIntNum].startTime) {
6433d8536b4Sopenharmony_ci        cpuTime += OS_US_PER_TICK;
6443d8536b4Sopenharmony_ci    }
6453d8536b4Sopenharmony_ci
6463d8536b4Sopenharmony_ci    g_irqCpup[cpupIntNum].cpupID = intNum;
6473d8536b4Sopenharmony_ci    g_irqCpup[cpupIntNum].status = OS_CPUP_USED;
6483d8536b4Sopenharmony_ci    usedTime = cpuTime - g_irqCpup[cpupIntNum].startTime;
6493d8536b4Sopenharmony_ci
6503d8536b4Sopenharmony_ci    if (g_irqCpup[cpupIntNum].count <= 1000) { /* 1000, Take 1000 samples */
6513d8536b4Sopenharmony_ci        g_irqCpup[cpupIntNum].allTime += usedTime;
6523d8536b4Sopenharmony_ci        g_irqCpup[cpupIntNum].count++;
6533d8536b4Sopenharmony_ci    } else {
6543d8536b4Sopenharmony_ci        g_irqCpup[cpupIntNum].allTime = 0;
6553d8536b4Sopenharmony_ci        g_irqCpup[cpupIntNum].count = 0;
6563d8536b4Sopenharmony_ci    }
6573d8536b4Sopenharmony_ci    g_irqCpup[cpupIntNum].startTime = 0;
6583d8536b4Sopenharmony_ci    if (usedTime > g_irqCpup[cpupIntNum].timeMax) {
6593d8536b4Sopenharmony_ci        g_irqCpup[cpupIntNum].timeMax = usedTime;
6603d8536b4Sopenharmony_ci    }
6613d8536b4Sopenharmony_ci    return;
6623d8536b4Sopenharmony_ci}
6633d8536b4Sopenharmony_ci
6643d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR OsIrqCpupCB *OsGetIrqCpupArrayBase(VOID)
6653d8536b4Sopenharmony_ci{
6663d8536b4Sopenharmony_ci    return g_irqCpup;
6673d8536b4Sopenharmony_ci}
6683d8536b4Sopenharmony_ci
6693d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR STATIC VOID OsGetIrqPositions(UINT16 mode, UINT16* curPosAddr, UINT16* prePosAddr)
6703d8536b4Sopenharmony_ci{
6713d8536b4Sopenharmony_ci    UINT16 curPos;
6723d8536b4Sopenharmony_ci    UINT16 prePos = 0;
6733d8536b4Sopenharmony_ci
6743d8536b4Sopenharmony_ci    curPos = g_irqHisPos;
6753d8536b4Sopenharmony_ci
6763d8536b4Sopenharmony_ci    if (mode == CPUP_IN_1S) {
6773d8536b4Sopenharmony_ci        curPos = OsGetPrePos(curPos);
6783d8536b4Sopenharmony_ci        prePos = OsGetPrePos(curPos);
6793d8536b4Sopenharmony_ci    } else if (mode == CPUP_LESS_THAN_1S) {
6803d8536b4Sopenharmony_ci        curPos = OsGetPrePos(curPos);
6813d8536b4Sopenharmony_ci    }
6823d8536b4Sopenharmony_ci
6833d8536b4Sopenharmony_ci    *curPosAddr = curPos;
6843d8536b4Sopenharmony_ci    *prePosAddr = prePos;
6853d8536b4Sopenharmony_ci}
6863d8536b4Sopenharmony_ci
6873d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR STATIC UINT64 OsGetIrqAllTime(VOID)
6883d8536b4Sopenharmony_ci{
6893d8536b4Sopenharmony_ci    INT32 i;
6903d8536b4Sopenharmony_ci    UINT64 cpuTimeAll = 0;
6913d8536b4Sopenharmony_ci    for (i = 0; i < OS_CPUP_HISTORY_RECORD_NUM; i++) {
6923d8536b4Sopenharmony_ci        cpuTimeAll += g_cpuHistoryTime[i];
6933d8536b4Sopenharmony_ci    }
6943d8536b4Sopenharmony_ci
6953d8536b4Sopenharmony_ci    return cpuTimeAll;
6963d8536b4Sopenharmony_ci}
6973d8536b4Sopenharmony_ci
6983d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR STATIC UINT64 OsGetIrqAllHisTime(UINT32 num)
6993d8536b4Sopenharmony_ci{
7003d8536b4Sopenharmony_ci    INT32 i;
7013d8536b4Sopenharmony_ci    UINT64 historyTime = 0;
7023d8536b4Sopenharmony_ci    for (i = 0; i < OS_CPUP_HISTORY_RECORD_NUM; i++) {
7033d8536b4Sopenharmony_ci        historyTime += g_irqCpup[num].historyTime[i];
7043d8536b4Sopenharmony_ci    }
7053d8536b4Sopenharmony_ci
7063d8536b4Sopenharmony_ci    return historyTime;
7073d8536b4Sopenharmony_ci}
7083d8536b4Sopenharmony_ci
7093d8536b4Sopenharmony_ciLITE_OS_SEC_TEXT_MINOR UINT32 LOS_GetAllIrqCpuUsage(UINT16 mode, CPUP_INFO_S *cpupInfo)
7103d8536b4Sopenharmony_ci{
7113d8536b4Sopenharmony_ci    UINT16 loopNum;
7123d8536b4Sopenharmony_ci    UINT16 curPos;
7133d8536b4Sopenharmony_ci    UINT16 prePos = 0;
7143d8536b4Sopenharmony_ci    UINT32 intSave;
7153d8536b4Sopenharmony_ci    UINT64 cpuTimeAll;
7163d8536b4Sopenharmony_ci    UINT64 cpuTimeCurIrq;
7173d8536b4Sopenharmony_ci
7183d8536b4Sopenharmony_ci    if (g_irqCpupInitFlg == 0) {
7193d8536b4Sopenharmony_ci        return  LOS_ERRNO_CPUP_NO_INIT;
7203d8536b4Sopenharmony_ci    }
7213d8536b4Sopenharmony_ci
7223d8536b4Sopenharmony_ci    if (cpupInfo == NULL) {
7233d8536b4Sopenharmony_ci        return LOS_ERRNO_CPUP_TASK_PTR_NULL;
7243d8536b4Sopenharmony_ci    }
7253d8536b4Sopenharmony_ci
7263d8536b4Sopenharmony_ci    intSave = LOS_IntLock();
7273d8536b4Sopenharmony_ci
7283d8536b4Sopenharmony_ci    OsGetIrqPositions(mode, &curPos, &prePos);
7293d8536b4Sopenharmony_ci    if (mode == CPUP_IN_10S) {
7303d8536b4Sopenharmony_ci        cpuTimeAll = OsGetIrqAllTime();
7313d8536b4Sopenharmony_ci    } else {
7323d8536b4Sopenharmony_ci        cpuTimeAll = g_cpuHistoryTime[curPos] - g_cpuHistoryTime[prePos];
7333d8536b4Sopenharmony_ci    }
7343d8536b4Sopenharmony_ci
7353d8536b4Sopenharmony_ci    for (loopNum = 0; loopNum < LOSCFG_PLATFORM_HWI_LIMIT; loopNum++) {
7363d8536b4Sopenharmony_ci        if (g_irqCpup[loopNum].status != OS_CPUP_USED) {
7373d8536b4Sopenharmony_ci            continue;
7383d8536b4Sopenharmony_ci        }
7393d8536b4Sopenharmony_ci
7403d8536b4Sopenharmony_ci        cpupInfo[loopNum].usStatus = g_irqCpup[loopNum].status;
7413d8536b4Sopenharmony_ci
7423d8536b4Sopenharmony_ci        if (mode == CPUP_IN_10S) {
7433d8536b4Sopenharmony_ci            cpuTimeCurIrq = OsGetIrqAllHisTime(loopNum);
7443d8536b4Sopenharmony_ci        } else {
7453d8536b4Sopenharmony_ci            cpuTimeCurIrq = g_irqCpup[loopNum].historyTime[curPos] - g_irqCpup[loopNum].historyTime[prePos];
7463d8536b4Sopenharmony_ci        }
7473d8536b4Sopenharmony_ci
7483d8536b4Sopenharmony_ci        if (cpuTimeAll != 0) {
7493d8536b4Sopenharmony_ci            cpupInfo[loopNum].uwUsage = (UINT32)((LOS_CPUP_PRECISION * cpuTimeCurIrq) / cpuTimeAll);
7503d8536b4Sopenharmony_ci        }
7513d8536b4Sopenharmony_ci    }
7523d8536b4Sopenharmony_ci
7533d8536b4Sopenharmony_ci    LOS_IntRestore(intSave);
7543d8536b4Sopenharmony_ci    return LOS_OK;
7553d8536b4Sopenharmony_ci}
7563d8536b4Sopenharmony_ci#endif
7573d8536b4Sopenharmony_ci
7583d8536b4Sopenharmony_ci#endif /* LOSCFG_BASE_CORE_CPUP */
759