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