You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
LiteOS-Reading/文豪/cpup/los_cpup.c

594 lines
20 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/* ----------------------------------------------------------------------------
* Copyright (c) Huawei Technologies Co., Ltd. 2013-2020. All rights reserved.
* Description : LiteOS Cpu Usage Calculation Module Implementation
* Author: Huawei LiteOS Team
* Create: 2013-01-01
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* --------------------------------------------------------------------------- */
#include "los_cpup_pri.h"
#include "los_task_pri.h"
#include "los_base.h"
#include "los_swtmr.h"
#ifdef __cplusplus
#if __cplusplus
extern "C" {
#endif /* __cplusplus */
#endif /* __cplusplus */
#ifdef LOSCFG_KERNEL_CPUP
LITE_OS_SEC_BSS STATIC UINT16 g_cpupSwtmrId; //<2F><><EFBFBD>ڼ<EFBFBD>¼CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ID//
LITE_OS_SEC_BSS STATIC UINT16 g_cpupInitFlg = 0; //<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD>ʼ<EFBFBD><CABC>//
LITE_OS_SEC_BSS OsCpupCB *g_cpup = NULL; //<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Ϣ//
LITE_OS_SEC_BSS STATIC UINT16 g_cpupMaxNum; //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
LITE_OS_SEC_BSS STATIC UINT16 g_cpupTaskMaxNum; //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
LITE_OS_SEC_BSS STATIC UINT16 g_hisPos = 0; /* current Sampling point of historyTime */
LITE_OS_SEC_DATA_INIT STATIC UINT32 runningTasks[LOSCFG_KERNEL_CORE_NUM] = {
[0 ... (LOSCFG_KERNEL_CORE_NUM - 1)] = (UINT32)-1
}; //<2F><><EFBFBD>ڼ<EFBFBD>¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID//
LITE_OS_SEC_BSS STATIC UINT64 cpuHistoryTime[OS_CPUP_HISTORY_RECORD_NUM + 1];
//<2F><><EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD>CPU<50><55>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD>¼//
LITE_OS_SEC_BSS STATIC UINT64 g_startCycles = 0; //<2F><><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>صĹ<D8B5><C4B9><EFBFBD>//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
LITE_OS_SEC_BSS UINT64 g_timeInIrqPerTskSwitch[LOSCFG_KERNEL_CORE_NUM]; //<2F><><EFBFBD>ڼ<EFBFBD>¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ڼ䷢<DABC><E4B7A2><EFBFBD><EFBFBD><EFBFBD>жϵ<D0B6>ʱ<EFBFBD><CAB1>//
LITE_OS_SEC_BSS STATIC UINT64 g_intTimeStart[LOSCFG_KERNEL_CORE_NUM]; //<2F><><EFBFBD>ڼ<EFBFBD>¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϿ<D0B6>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>//
#endif
#define HIGH_BITS 32
#define CPUP_PRE_POS(pos) (((pos) == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : ((pos) - 1))
#define CPUP_POST_POS(pos) (((pos) == (OS_CPUP_HISTORY_RECORD_NUM - 1)) ? 0 : ((pos) + 1))
LITE_OS_SEC_TEXT_INIT OsCpupCB *OsCpupCBGet(UINT32 index)
{
return &g_cpup[index];
}
/*<2A><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>*/
LITE_OS_SEC_TEXT_INIT VOID OsCpupGuard(VOID)
{
UINT16 prevPos = g_hisPos;
UINT16 loop;
UINT16 runTaskId;
UINT64 curCycle;
UINT32 intSave;
if (g_cpupInitFlg == 0) { //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>//
return;
}
//<2F><><EFBFBD>ѳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
intSave = LOS_IntLock();
curCycle = OsCpupGetCycle();
g_hisPos = CPUP_POST_POS(g_hisPos); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>//
cpuHistoryTime[prevPos] = curCycle; //<2F><>¼<EFBFBD><C2BC><EFBFBD>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
/*<2A><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>*/
for (loop = 0; loop < g_cpupMaxNum; loop++) {
g_cpup[loop].historyTime[prevPos] = g_cpup[loop].allTime;
}
for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) {
runTaskId = runningTasks[loop]; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>ID//
/* reacquire the cycle to prevent flip */
curCycle = OsCpupGetCycle();
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ǰʱ<C7B0><CAB1><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>*/
g_cpup[runTaskId].historyTime[prevPos] += curCycle - g_cpup[runTaskId].startTime;
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //<2F>ж<EFBFBD><D0B6>жϹ<D0B6><CFB9><EFBFBD><EFBFBD>Ƿ񱻰<C7B7><F1B1BBB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
/*<2A>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>м<EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB>ڼ䷢<DABC><E4B7A2><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>*/
g_cpup[runTaskId].historyTime[prevPos] -= g_timeInIrqPerTskSwitch[loop];
#endif
}
LOS_IntRestore(intSave); //<2F>ָ<EFBFBD><D6B8>ж<EFBFBD>״̬//
}
/*<2A><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ա㶨<D4B1>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ӷ<EFBFBD>ʵ<EFBFBD><CAB5>CPUʹ<55><CAB9><EFBFBD>ʵ<EFBFBD>ͳ<EFBFBD><CDB3>*/
LITE_OS_SEC_TEXT_INIT VOID OsCpupGuardCreator(VOID)
{
/*<2A><><EFBFBD><EFBFBD><E6BAAF><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>ֱ<EFBFBD>Ϊ*/
//<2F><EFBFBD><E8B6A8>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ӵĻ<D3B5><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ӵδ<D3B5><CEB4><EFBFBD>//
//<2F><><EFBFBD><EFBFBD>ģʽΪ<CABD><CEAA><EFBFBD><EFBFBD>ģʽ//
//<2F>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>//
//<2F><>ʱ<EFBFBD><CAB1>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>g_cpupSwtmrId<49><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾ<EFBFBD><CABE>Я<EFBFBD><D0AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
(VOID)LOS_SwtmrCreate(LOSCFG_BASE_CORE_TICK_PER_SECOND, LOS_SWTMR_MODE_PERIOD,
(SWTMR_PROC_FUNC)OsCpupGuard, &g_cpupSwtmrId, 0);
(VOID)LOS_SwtmrStart(g_cpupSwtmrId); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>//
}
/*<2A><>ʼ<EFBFBD><CABC>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><EFBFBD><E9A3AC><EFBFBD>а<EFBFBD><D0B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>ΪOsCpupGuardCreator<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><EFBFBD><EFBFBD>OsCpupGuard()<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>*/
LITE_OS_SEC_TEXT_INIT VOID OsCpupGuardInit(VOID)
{
TSK_INIT_PARAM_S taskInitParam;
UINT32 tempId;
//<2F><>ʼ<EFBFBD><CABC>taskInitParam<61><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
(VOID)memset_s((void *)(&taskInitParam), sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)OsCpupGuardCreator; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><DABA><EFBFBD>ΪOsCpupGuardCreator<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>//
taskInitParam.uwStackSize = LOS_TASK_MIN_STACK_SIZE; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>Ĵ<EFBFBD>СΪ<D0A1><CEAA>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB>С//
taskInitParam.pcName = "CpupGuardCreator"; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ"CpupGuardCreator"//
taskInitParam.usTaskPrio = OS_TASK_PRIORITY_HIGHEST; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>//
taskInitParam.uwResved = LOS_TASK_STATUS_DETACHED; //ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ΪLOS_TASK_STATUS_DETACHED//
#ifdef LOSCFG_KERNEL_SMP //<2F>жϲ<D0B6><CFB2><EFBFBD>ϵͳ<CFB5>Ƿ<EFBFBD>֧<EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>//
taskInitParam.usCpuAffiMask = CPUID_TO_AFFI_MASK(ArchCurrCpuid()); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50>׺<EFBFBD><D7BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
#endif
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>õIJ<C3B5><C4B2><EFBFBD>taskInitParam<61><6D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>tempId<49><64>*/
(VOID)LOS_TaskCreate(&tempId, &taskInitParam);
}
/*
* Description: initialization of CPUP
* Return : LOS_OK or Error Information
*/
LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit(VOID)
{
UINT32 size;
g_cpupTaskMaxNum = g_taskMaxNum;
g_cpupMaxNum = g_cpupTaskMaxNum;
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˰<EFBFBD><CBB0><EFBFBD><EFBFBD>жϵ<D0B6>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƣ<EFBFBD>LOSCFG_CPUP_INCLUDE_IRQ<52><51><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>g_cpupMaxNum<EFBFBD><EFBFBD><EFBFBD><EFBFBD>LOSCFG_PLATFORM_HWI_LIMIT*/
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
g_cpupMaxNum += LOSCFG_PLATFORM_HWI_LIMIT;
#endif
/* every task has only one record, and it won't operated at the same time */
size = g_cpupMaxNum * sizeof(OsCpupCB); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD><D5BC><EFBFBD>С//
g_cpup = (OsCpupCB *)LOS_MemAlloc(m_aucSysMem0, size); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڴ棬<DAB4><E6A3AC><EFBFBD>ڴ洢OsCpupCB<43><EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
if (g_cpup == NULL) { //<2F>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>//
return LOS_ERRNO_CPUP_NO_MEMORY;
}
OsCpupGuardInit(); //<2F><>ʼ<EFBFBD><CABC>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><C4A3>//
(VOID)memset_s(g_cpup, size, 0, size); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>//
g_cpupInitFlg = 1; //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><C4A3><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
return LOS_OK; //<2F><>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>//
}
LITE_OS_SEC_TEXT_INIT VOID LOS_CpupReset(VOID) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><C4A3>//
{
UINT32 cpupIndex;
UINT32 maxNum = g_cpupMaxNum;
UINT64 curCycle;
UINT16 loop;
UINT32 intSave;
/*<2A><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>g_cpup<75>Ƿ<EFBFBD>ΪNULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7>أ<EFBFBD><D8A3><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>κβ<CEBA><CEB2><EFBFBD>*/
if (g_cpup == NULL) {
return;
}
g_cpupInitFlg = 0; //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><C4A3>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>//
intSave = LOS_IntLock(); //<2F><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD>ж<EFBFBD>//
(VOID)LOS_SwtmrStop(g_cpupSwtmrId); //ֹͣCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><CAB1>//
curCycle = OsCpupGetCycle(); //<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
/*<2A><>cpuHistoryTime<6D><65><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><D8B6><EFBFBD><EFBFBD><EFBFBD>ΪcurCycle<6C><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD>¼*/
for (loop = 0; loop < (OS_CPUP_HISTORY_RECORD_NUM + 1); loop++) {
cpuHistoryTime[loop] = curCycle;
}
/*<2A><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƽ<C6BD>
<20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E4B6BC><EFBFBD><EFBFBD>ΪcurCycle<6C><65>
ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><E1B9B9><EFBFBD>е<EFBFBD><D0B5><EFBFBD>ʷʱ<CAB7><CAB1><EFBFBD><EFBFBD>¼*/
for (cpupIndex = 0; cpupIndex < maxNum; cpupIndex++) {
g_cpup[cpupIndex].startTime = curCycle;
g_cpup[cpupIndex].allTime = curCycle;
for (loop = 0; loop < (OS_CPUP_HISTORY_RECORD_NUM + 1); loop++) {
g_cpup[cpupIndex].historyTime[loop] = curCycle;
}
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˰<EFBFBD><CBB0><EFBFBD><EFBFBD>жϵ<D0B6>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƣ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>g_timeInIrqPerTskSwitch<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD>ض<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD>*/
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
for (loop = 0; loop < LOSCFG_KERNEL_CORE_NUM; loop++) {
g_timeInIrqPerTskSwitch[loop] = 0;
}
#endif
(VOID)LOS_SwtmrStart(g_cpupSwtmrId); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>ƶ<EFBFBD>ʱ<EFBFBD><CAB1>//
LOS_IntRestore(intSave); //<2F>ָ<EFBFBD><D6B8>ж<EFBFBD>״̬//
g_cpupInitFlg = 1; //<2F><>ʾCPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD><CDB3>ģ<EFBFBD><C4A3><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
return;
}
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼֵ<CABC><D6B5><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼ʱ<C2BC><CAB1>ʱ
<EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>Ӷ<EFBFBD><EFBFBD>õ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
LITE_OS_SEC_TEXT_MINOR VOID OsCpupSetCycle(UINT64 startCycles)
{
g_startCycles = startCycles;
return;
}
/*
* Description: get current cycles count
* Return : current cycles count
*/
LITE_OS_SEC_TEXT_MINOR UINT64 OsCpupGetCycle(VOID)
{
UINT32 high;
UINT32 low;
UINT64 cycles;
LOS_GetCpuCycle(&high, &low);
cycles = ((UINT64)high << HIGH_BITS) + low; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD>͵<EFBFBD>λ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>ֵ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD>һ<EFBFBD><D2BB>64λ<34><CEBB><EFBFBD><EFBFBD>ֵ//
if (g_startCycles == 0) {
g_startCycles = cycles;
}
/*
* The cycles should keep growing, if the checking failed,
* it mean LOS_GetCpuCycle has the problem which should be fixed.
*/
LOS_ASSERT(cycles >= g_startCycles);
return (cycles - g_startCycles);
}
/*
* Description: start task to get cycles count in current task beginning
*/
LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleStart(VOID) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1>ȡCPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>//
{
UINT32 taskId;
LosTaskCB *runTask = NULL;
if (g_cpupInitFlg == 0) { //<2F><><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>//
return;
}
runTask = OsCurrTaskGet(); //<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>//
taskId = runTask->taskId; //<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID//
g_cpup[taskId].id = taskId;
g_cpup[taskId].startTime = OsCpupGetCycle();
return;
}
/*
* Description: quit task and get cycle count
*/
LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleEnd(VOID)
{
UINT32 taskId;
UINT64 cpuCycle;
LosTaskCB *runTask = NULL;
if (g_cpupInitFlg == 0) {
return;
}
runTask = OsCurrTaskGet();
taskId = runTask->taskId;
if (g_cpup[taskId].startTime == 0) { //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD>ʼʱ<CABC>䣬//
return; //<2F><>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ʾδ<CABE><CEB4>¼<EFBFBD><C2BC>ʼʱ<CABC>䣬ֱ<E4A3AC>ӷ<EFBFBD><D3B7><EFBFBD>//
}
cpuCycle = OsCpupGetCycle();
g_cpup[taskId].allTime += cpuCycle - g_cpup[taskId].startTime; //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˰<EFBFBD><CBB0><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͳ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
UINT32 cpuId = ArchCurrCpuid();
g_cpup[taskId].allTime -= g_timeInIrqPerTskSwitch[cpuId]; //<2F><>ȥ<EFBFBD><C8A5>ǰCPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>õ<EFBFBD>ʱ<EFBFBD><CAB1>
g_timeInIrqPerTskSwitch[cpuId] = 0;
#endif
g_cpup[taskId].startTime = 0; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ͳ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>//
return;
}
/*
* Description: start task to get cycles count in current task ending
*/
LITE_OS_SEC_TEXT_MINOR VOID OsTaskCycleEndStart(const LosTaskCB *newTask)
{
UINT64 cpuCycle;
LosTaskCB *runTask = NULL;
OsCpupCB *cpup = NULL;
UINT32 cpuId = ArchCurrCpuid();
if ((g_cpupInitFlg == 0) || (newTask == NULL)) {
return;
}
runTask = OsCurrTaskGet();
cpuCycle = OsCpupGetCycle();
cpup = &g_cpup[runTask->taskId];
if (cpup->startTime != 0) {
cpup->allTime += cpuCycle - cpup->startTime; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<D6AE>Ѿ<EFBFBD><D1BE><EFBFBD>ʼ<EFBFBD><CABC>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD>//
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
cpup->allTime -= g_timeInIrqPerTskSwitch[cpuId];
g_timeInIrqPerTskSwitch[cpuId] = 0;
#endif
}
cpup = &g_cpup[newTask->taskId];
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49>͵<EFBFBD>ǰCPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><E6A3AC>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>ʼ*/
cpup->id = newTask->taskId;
cpup->startTime = cpuCycle;
runningTasks[cpuId] = newTask->taskId; //<2F><><EFBFBD>µ<EFBFBD>ǰCPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>ID//
return;
}
/*<2A><><EFBFBD>ڻ<EFBFBD>ȡCPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><CEBB>*/
LITE_OS_SEC_TEXT_MINOR STATIC VOID OsCpupGetPos(UINT32 mode, UINT16 *curPosPointer, UINT16 *prePosPointer)
{
UINT16 curPos;
UINT16 tmpPos;
UINT16 prePos;
tmpPos = g_hisPos; //<2F><>ȡ<EFBFBD><C8A1>ǰλ<C7B0><CEBB>//
curPos = CPUP_PRE_POS(tmpPos); //<2F><>ȡǰһ<C7B0><D2BB>λ<EFBFBD><CEBB>//
/*
* The current position has nothing to do with the CPUP modes,
* however, the previous position differs.
*/
switch (mode) {
/*<2A><>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
<20><>ʱ<EFBFBD><CAB1>ǰһ<C7B0><D2BB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ǰλ<C7B0>õ<EFBFBD>ǰһ<C7B0><D2BB>λ<EFBFBD><CEBB>*/
case CPUP_LAST_ONE_SECONDS:
prePos = CPUP_PRE_POS(curPos);
break;
/*<2A><>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʮ<EFBFBD><CAAE><EFBFBD>ڵ<EFBFBD>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
<20><>ʱ<EFBFBD><CAB1>ǰһ<C7B0><D2BB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>ǰλ<C7B0><CEBB>*/
case CPUP_LAST_TEN_SECONDS:
prePos = tmpPos;
break;
/*<2A><>ʾ<EFBFBD><CABE>Ҫ<EFBFBD><D2AA>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ڵ<EFBFBD>CPU<50><55><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
<20><>ʱ<EFBFBD><CAB1>ǰһ<C7B0><D2BB>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>λ<EFBFBD><CEBB>*/
case CPUP_ALL_TIME:
/* fall-through */
default:
prePos = OS_CPUP_HISTORY_RECORD_NUM;
break;
}
*curPosPointer = curPos; //<2F><><EFBFBD>浱ǰλ<C7B0><CEBB>//
*prePosPointer = prePos; //<2F><><EFBFBD><EFBFBD>ǰһ<C7B0><D2BB>λ<EFBFBD><CEBB>//
return;
}
/*<2A><><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD>ĺϷ<C4BA><CFB7><EFBFBD>*/
LITE_OS_SEC_TEXT_MINOR STATIC INLINE UINT32 OsCpuUsageParaCheck(UINT32 taskId)
{
if (g_cpupInitFlg == 0) {
return LOS_ERRNO_CPUP_NO_INIT;
}
if (OS_TSK_GET_INDEX(taskId) >= g_taskMaxNum) { //<2F><><EFBFBD><EFBFBD>ID<49><44><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
return LOS_ERRNO_CPUP_TSK_ID_INVALID; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ID<49><44>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>//
}
/* weather the task is created */
if (g_cpup[taskId].id != taskId) {
return LOS_ERRNO_CPUP_THREAD_NO_CREATED; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>//
}
if ((g_cpup[taskId].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskId].status == 0)) {
return LOS_ERRNO_CPUP_THREAD_NO_CREATED; //<2F><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>//
}
return LOS_OK; //<2F><>ʾͨ<CABE><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistorySysCpuUsage(UINT32 mode) //<2F><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD><C8A1>ʷϵͳCPUʹ<55><CAB9><EFBFBD><EFBFBD>//
{
UINT64 cpuCycleAll;
UINT64 idleCycleAll = 0;
UINT32 cpup = 0;
UINT16 pos;
UINT16 prePos;
UINT32 intSave;
UINT32 idleTaskId;
#ifdef LOSCFG_KERNEL_SMP
UINT32 cpuId = 0;
#endif
if (g_cpupInitFlg == 0) {
return LOS_ERRNO_CPUP_NO_INIT;
}
/* get end time of current task */
intSave = LOS_IntLock(); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>״̬//
OsTaskCycleEnd(); //<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>ʱ<EFBFBD><CAB1>//
OsCpupGetPos(mode, &pos, &prePos); //<2F><>ȡ<EFBFBD><C8A1>ʷCPUʹ<55><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ//
cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //<2F><><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
#ifdef LOSCFG_KERNEL_SMP //<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ΪSMPϵͳ//
/* For SMP system, each idle task needs to be accounted */
while (cpuId < LOSCFG_KERNEL_CORE_NUM) {
idleTaskId = g_percpu[cpuId].idleTaskId;
//<2F>ۼӸ<DBBC><D3B8><EFBFBD><EFBFBD>ĵĿ<C4B5><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>idleCycleAll<6C><6C>//
idleCycleAll += g_cpup[idleTaskId].historyTime[pos] - g_cpup[idleTaskId].historyTime[prePos];
cpuId++;
}
cpuCycleAll *= LOSCFG_KERNEL_CORE_NUM;
#else
idleTaskId = OsGetIdleTaskId(); //ֱ<>ӻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
idleCycleAll = g_cpup[idleTaskId].historyTime[pos] - g_cpup[idleTaskId].historyTime[prePos];
#endif
if (cpuCycleAll) {
cpup = (LOS_CPUP_PRECISION - (UINT32)((LOS_CPUP_PRECISION * idleCycleAll) / cpuCycleAll));
} //<2F>ó<EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>//
OsTaskCycleStart(); //<2F><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ͳ<EFBFBD><CDB3>//
LOS_IntRestore(intSave); //<2F>ָ<EFBFBD><D6B8>ж<EFBFBD>״̬//
return cpup;
}
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryTaskCpuUsage(UINT32 taskId, UINT32 mode)
{
UINT64 cpuCycleAll;
UINT64 cpuCycleCurTask;
UINT16 pos;
UINT16 prePos;
UINT32 intSave;
UINT32 cpup = 0;
UINT32 ret;
if (g_cpupInitFlg == 0) {
return LOS_ERRNO_CPUP_NO_INIT;
}
//<2F>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<49><44><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LOS_OK<4F><4B><EFBFBD>򷵻<EFBFBD><F2B7B5BB><EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>//
ret = OsCpuUsageParaCheck(taskId);
if (ret != LOS_OK) {
return ret;
}
OsCpupCB *taskCpup = &g_cpup[taskId];
intSave = LOS_IntLock();
OsTaskCycleEnd();
OsCpupGetPos(mode, &pos, &prePos); //<2F><>ȡ<EFBFBD><C8A1>ʷCPUʹ<55><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ//
cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //<2F><><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
cpuCycleCurTask = taskCpup->historyTime[pos] - taskCpup->historyTime[prePos]; //<2F><><EFBFBD>㵱ǰ<E3B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
if (cpuCycleAll) {
cpup = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTask) / cpuCycleAll);
} //<2F><><EFBFBD><EFBFBD><EFBFBD>ó<EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD>//
OsTaskCycleStart();
LOS_IntRestore(intSave);
return cpup;
}
//<2F><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʷCPUʹ<55><CAB9><EFBFBD><EFBFBD>//
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllCpuUsage(UINT16 maxNum, CPUP_INFO_S *cpupInfo, UINT32 mode, UINT16 flag)
{
UINT16 loop;
UINT16 pos;
UINT16 prePos;
UINT32 intSave;
UINT64 cpuCycleAll;
UINT64 cpuCycleCurTask;
UINT16 numTmpMax = maxNum;
UINT16 numTmpMin = 0;
UINT16 numMax = g_cpupTaskMaxNum;
if (g_cpupInitFlg == 0) {
return LOS_ERRNO_CPUP_NO_INIT;
}
if (cpupInfo == NULL) { //<2F><><EFBFBD><EFBFBD><E9B4AB><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>cpupInfo<66>Ƿ<EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>//
return LOS_ERRNO_CPUP_TASK_PTR_NULL;
}
if (maxNum == 0) { //<2F><><EFBFBD><EFBFBD><E9B4AB><EFBFBD><EFBFBD>maxNum<75>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>//
return LOS_ERRNO_CPUP_MAXNUM_INVALID;
}
#ifdef LOSCFG_CPUP_INCLUDE_IRQ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAB1BB><EFBFBD><EFBFBD>//
if (flag == 0) {
numTmpMax += g_cpupTaskMaxNum;
numTmpMin += g_cpupTaskMaxNum;
numMax = g_cpupMaxNum;
}
#endif
if (numTmpMax > numMax) {
numTmpMax = numMax;
}
intSave = LOS_IntLock();
OsTaskCycleEnd();
OsCpupGetPos(mode, &pos, &prePos); //<2F><>ȡ<EFBFBD><C8A1>ʷCPUʹ<55><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ϣ//
cpuCycleAll = cpuHistoryTime[pos] - cpuHistoryTime[prePos]; //<2F><><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
/*ͨ<><CDA8>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPUʹ<55><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>㵱ǰ<E3B5B1><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
for (loop = numTmpMin; loop < numTmpMax; loop++) {
if ((g_cpup[loop].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loop].status == 0)) {
continue;
}
cpuCycleCurTask = g_cpup[loop].historyTime[pos] - g_cpup[loop].historyTime[prePos];
cpupInfo[loop - numTmpMin].usStatus = g_cpup[loop].status;
if (cpuCycleAll) {
cpupInfo[loop - numTmpMin].uwUsage = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTask) / cpuCycleAll);
}
}
OsTaskCycleStart();
LOS_IntRestore(intSave);
return LOS_OK;
}
#ifdef LOSCFG_CPUP_INCLUDE_IRQ
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϿ<D0B6>ʼʱ<CABC><CAB1>¼<EFBFBD><C2BC>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<D0B6><CFB4><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͳ<EFBFBD>ƺͷ<C6BA><CDB7><EFBFBD>*/
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqStart(VOID)
{
g_intTimeStart[ArchCurrCpuid()] = OsCpupGetCycle();
return;
}
/*<2A><><EFBFBD>жϽ<D0B6><CFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ͳ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>жϺš<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><EFBFBD>ۼ<EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>*/
LITE_OS_SEC_TEXT_MINOR VOID OsCpupIrqEnd(UINT32 intNum)
{
UINT64 intTimeEnd = OsCpupGetCycle(); //<2F><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
UINT32 cpuId = ArchCurrCpuid(); //<2F><>ȡ<EFBFBD><C8A1>ǰCPU<50><55>ID//
if (g_cpupInitFlg == 0) {
return;
}
g_cpup[g_taskMaxNum + intNum].id = intNum;
g_cpup[g_taskMaxNum + intNum].status = OS_TASK_STATUS_RUNNING; //<2F><><EFBFBD>ж<EFBFBD>״̬<D7B4><CCAC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>//
g_timeInIrqPerTskSwitch[cpuId] += (intTimeEnd - g_intTimeStart[cpuId]); //<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ʱ<EFBFBD><CAB1>//
g_cpup[g_taskMaxNum + intNum].allTime += (intTimeEnd - g_intTimeStart[cpuId]);
return;
}
#endif
#endif /* LOSCFG_KERNEL_CPUP */
#ifdef __cplusplus
#if __cplusplus
}
#endif /* __cplusplus */
#endif /* __cplusplus */