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