• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
3  *
4  * UniProton is licensed under Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *          http://license.coscl.org.cn/MulanPSL2
8  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11  * See the Mulan PSL v2 for more details.
12  * Create: 2009-12-22
13  * Description: 线程级CPU占用率模块初始化文件
14  */
15 #include "prt_cpup_thread_internal.h"
16 
OsCpupReg(struct CpupModInfo * modInfo)17 OS_SEC_L4_TEXT U32 OsCpupReg(struct CpupModInfo *modInfo)
18 {
19     if (modInfo->cpupWarnFlag == TRUE) {
20         if (modInfo->sampleTime == 0) {
21             return OS_ERRNO_CPUP_SAMPLE_TIME_ZERO;
22         }
23     }
24 
25     OsMhookReserve((U32)OS_HOOK_FIRST_TIME_SWH, 1);
26     OsMhookReserve((U32)OS_HOOK_TSK_SWITCH, 1);
27     OsMhookReserve((U32)OS_HOOK_HWI_ENTRY, 1);
28     OsMhookReserve((U32)OS_HOOK_HWI_EXIT, 1);
29     OsMhookReserve((U32)OS_HOOK_TICK_ENTRY, 1);
30     OsMhookReserve((U32)OS_HOOK_TICK_EXIT, 1);
31 
32     g_ticksPerSample = modInfo->sampleTime;
33 
34     return OS_OK;
35 }
36 /*
37  * 描述:tick统计所需要的函数变量初始化。
38  */
OsCpupGlobalInit(void)39 OS_SEC_L4_TEXT void OsCpupGlobalInit(void)
40 {
41     if (g_ticksPerSample != 0) {
42         g_tickTaskEntry = (TickEntryFunc)OsCpupThreadTickTask;
43     }
44 
45     g_cpupNow = OsCpupThreadNow;
46 }
47 
OsCpupThreadHookAdd(void)48 OS_SEC_L4_TEXT U32 OsCpupThreadHookAdd(void)
49 {
50     U32 ret;
51 
52     /* CPUP统计在第一次任务切换的时候 */
53     ret = OsMhookAdd((U32)OS_HOOK_FIRST_TIME_SWH, (OsVoidFunc)OsCpupFirstSwitch);
54     if (ret != OS_OK) {
55         return ret;
56     }
57 
58     /* CPUP统计在任务切换的时候 */
59     ret = OsMhookAdd((U32)OS_HOOK_TSK_SWITCH, (OsVoidFunc)OsCpupTskSwitch);
60     if (ret != OS_OK) {
61         return ret;
62     }
63 
64     /* CPUP统计在进入硬中断的时候 */
65     ret = OsMhookAdd((U32)OS_HOOK_HWI_ENTRY, (OsVoidFunc)OsNowTskCycleEnd);
66     if (ret != OS_OK) {
67         return ret;
68     }
69 
70     /* CPUP统计在退出硬中断的时候 */
71     ret = OsMhookAdd((U32)OS_HOOK_HWI_EXIT, (OsVoidFunc)OsNowTskCycleStart);
72     if (ret != OS_OK) {
73         return ret;
74     }
75 
76     /* CPUP统计在进入Tick的时候 */
77     ret = OsMhookAdd((U32)OS_HOOK_TICK_ENTRY, (OsVoidFunc)OsNowTskCycleEnd);
78     if (ret != OS_OK) {
79         return ret;
80     }
81 
82     /* CPUP统计在退出Tick的时候 */
83     ret = OsMhookAdd((U32)OS_HOOK_TICK_EXIT, (OsVoidFunc)OsNowTskCycleStart);
84     if (ret != OS_OK) {
85         return ret;
86     }
87 
88     return OS_OK;
89 }
90 
91 /*
92  * 描述:线程级CPUP初始化接口,返回OS_OK或错误码
93  */
OsCpupInit(void)94 OS_SEC_L4_TEXT U32 OsCpupInit(void)
95 {
96     U32 ret;
97     U32 size;
98 
99     /* 多申请一个任务线程CPUP信息结构体大小,预留给第一次任务切换时切出的无效任务使用,防止溢出 */
100     size = (OS_MAX_TCB_NUM) * sizeof(struct TagCpupThread);
101     g_cpup = (struct TagCpupThread *)OsMemAllocAlign((U32)OS_MID_CPUP, OS_MEM_DEFAULT_FSC_PT,
102                                                      size, MEM_ADDR_ALIGN_032);
103     if (g_cpup == NULL) {
104         return OS_ERRNO_CPUP_NO_MEMORY;
105     }
106 
107     if (memset_s(g_cpup, size, 0, size) != EOK) {
108         OS_GOTO_SYS_ERROR1();
109     }
110 
111     g_baseValue = (g_systemClock / g_tickModInfo.tickPerSecond) * (U64)g_ticksPerSample;
112 
113     OsCpupGlobalInit();
114 
115     ret = OsCpupThreadHookAdd();
116     return ret;
117 }
118