102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
/*
|
|
* Copyright (c) CompanyNameMagicTag 2012-2019. All rights reserved.
|
|
* Description: 1.Modify the cpu occupancy statistics code. cpup_core.c code
|
|
* Author: CompanyName
|
|
* Create: 2012-02-21
|
|
*/
|
|
#include "cpup_core.h"
|
|
#include <soc_types.h>
|
|
#include <soc_mdm_types.h>
|
|
#include <soc_mdm_isr.h>
|
|
#include <soc_stdlib.h>
|
|
#include <los_hwi.h>
|
|
#include <los_task.ph>
|
|
#include <los_cpup.ph>
|
|
#include <soc_mdm_cpup.h>
|
|
|
|
EXT_EXTERN td_void osTskCycleStart(td_void);
|
|
EXT_EXTERN td_void osTskCycleEnd(td_void);
|
|
EXT_EXTERN td_u64 osGetCpuCycle(td_void);
|
|
|
|
EXT_EXTERN td_u16 g_usCpupInitFlg;
|
|
|
|
__isr td_u32 uapi_cpup_get_usage(td_u32 array_count, ext_cpup_item *cpup_items)
|
|
{
|
|
td_u32 int_value;
|
|
td_u64 total_time = 0;
|
|
td_u32 i, j;
|
|
|
|
if (g_usCpupInitFlg == 0) {
|
|
return EXT_ERR_CPUP_NOT_INIT;
|
|
}
|
|
|
|
if (array_count == 0 || cpup_items == TD_NULL) {
|
|
return EXT_ERR_CPUP_INVALID_PARAM;
|
|
}
|
|
|
|
memset_s(cpup_items, (td_u32)(array_count * sizeof(ext_cpup_item)), 0,
|
|
(td_u32)(array_count * sizeof(ext_cpup_item)));
|
|
|
|
int_value = uapi_int_lock();
|
|
osTskCycleEnd();
|
|
|
|
for (i = 0, j = 0; i < (g_uwTskMaxNum + OS_HWI_MAX_NUM + 1); i++) {
|
|
if (g_pstCpup[i].ullAllTime == 0) {
|
|
/* Already release task lose time, calculating total time may be not accurate */
|
|
continue;
|
|
}
|
|
|
|
total_time += g_pstCpup[i].ullAllTime;
|
|
|
|
if (j < array_count) {
|
|
ext_cpup_item *item = &cpup_items[j];
|
|
if (i < g_uwTskMaxNum) {
|
|
item->task = TD_TRUE;
|
|
item->id = (td_u8)i;
|
|
} else if (i == g_uwTskMaxNum) {
|
|
item->task = TD_FALSE;
|
|
item->id = 0xFF;
|
|
} else {
|
|
item->task = TD_FALSE;
|
|
item->id = (td_u8)(i - g_uwTskMaxNum - 1);
|
|
}
|
|
item->valid = TD_TRUE;
|
|
item->cpu_time = g_pstCpup[i].ullAllTime;
|
|
}
|
|
j++;
|
|
}
|
|
|
|
for (j = 0; j < array_count; j++) {
|
|
ext_cpup_item *item = &cpup_items[j];
|
|
if (item->valid && total_time != 0) {
|
|
item->permillage = (td_u32)((LOS_CPUP_PRECISION * item->cpu_time) / total_time);
|
|
}
|
|
}
|
|
|
|
osTskCycleStart();
|
|
uapi_int_restore(int_value);
|
|
|
|
return EXT_ERR_SUCCESS;
|
|
}
|
|
|
|
/* ****************************************************************************
|
|
Function : LOS_CpupReset
|
|
Description: reset data of CPU usage
|
|
Input : None
|
|
Return : None
|
|
**************************************************************************** */
|
|
__isr td_void uapi_cpup_reset_usage(td_void)
|
|
{
|
|
td_u32 max_num = g_uwTskMaxNum;
|
|
|
|
if (g_pstCpup == TD_NULL) {
|
|
return;
|
|
}
|
|
|
|
max_num += OS_HWI_MAX_NUM + 1;
|
|
for (td_u32 i = 0; i < max_num; i++) {
|
|
g_pstCpup[i].ullStartTime = osGetCpuCycle();
|
|
g_pstCpup[i].ullAllTime = 0;
|
|
}
|
|
}
|