• 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 #ifndef PRT_CPUP_H
16 #define PRT_CPUP_H
17 
18 #include "prt_buildef.h"
19 #include "prt_module.h"
20 #include "prt_errno.h"
21 
22 #ifdef __cplusplus
23 #if __cplusplus
24 extern "C" {
25 #endif /* __cpluscplus */
26 #endif /* __cpluscplus */
27 
28 /*
29  * CPUP错误码:参数(CPUP告警阈值)设定不在规定范围(0,10000]。
30  *
31  * 值: 0x02000601
32  *
33  * 解决方案: CPUP告警阈值设定在规定范围(0,10000]内。
34  */
35 #define OS_ERRNO_CPUP_INTERVAL_NOT_SUITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x01)
36 
37 /*
38  * CPUP错误码:指针参数为NULL。
39  *
40  * 值: 0x02000602
41  *
42  * 解决方案: 传入非0的有效地址。
43  */
44 #define OS_ERRNO_CPUP_PTR_NULL OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x02)
45 
46 /*
47  * CPUP错误码:恢复阈值设定不小于告警阈值。
48  *
49  * 值: 0x02000603
50  *
51  * 解决方案: 恢复阈值小于告警阈值。
52  */
53 #define OS_ERRNO_CPUP_RESUME_NOT_SUITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x03)
54 
55 /*
56  * CPUP错误码:CPUP初始化申请内存失败。
57  *
58  * 值: 0x02000604
59  *
60  * 解决方案: 确认缺省静态内存是否足够,以及采样个数(参见配置宏OS_CPUP_SAMPLE_RECORD_NUM)是否过大。
61  */
62 #define OS_ERRNO_CPUP_NO_MEMORY OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x04)
63 
64 /*
65  * CPUP错误码:在osStart之前调用CPUP模块相关功能接口。
66  *
67  * 值: 0x02000605
68  *
69  * 解决方案: 调用CPUP模块功能接口时,请查看是否在osStart之后。
70  */
71 #define OS_ERRNO_CPUP_OS_NOT_STARTED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x05)
72 
73 /*
74  * CPUP错误码:CPUP采样时间间隔为0。
75  *
76  * 值: 0x02000606
77  *
78  * 解决方案: 系统级CPUP设置采样时间间隔必须大于0,当CPUP告警功能打开时,线程级CPUP采样时间间隔也必须大于0。
79  */
80 #define OS_ERRNO_CPUP_SAMPLE_TIME_ZERO OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x06)
81 
82 /*
83  * CPUP错误码:CPUP功能开关未打开或者未初始化时,获取CPUP、设置告警阈值或者补偿IDLE钩子执行时间。
84  *
85  * 值: 0x02000607
86  *
87  * 解决方案: 需保证在打开功能开关,在osStart之后才能获取CPUP、设置告警阈值或者补偿IDLE钩子执行时间。
88  */
89 #define OS_ERRNO_CPUP_NOT_INITED OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x07)
90 
91 /*
92  * CPUP错误码:使用获取线程级所有线程的CPUP接口时,输入的线程数为0。
93  *
94  * 值: 0x02000608
95  *
96  * 解决方案: 使用获取线程级所有线程的CPUP接口时,输入的线程数必须大于0
97  */
98 #define OS_ERRNO_CPUP_THREAD_INNUM_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x08)
99 
100 /*
101  * CPUP错误码:CPUP告警恢复及CPUP告警阈值配置错误。
102  *
103  * 值: 0x02000609
104  *
105  * 解决方案: CPUP告警阈值设定应该小于CPUP告警恢复阈值。
106  */
107 #define OS_ERRNO_CPUP_RESUME_VALUE_ERROR OS_ERRNO_BUILD_ERROR(OS_MID_CPUP, 0x09)
108 
109 /*
110  * CPU占用率告警标志。
111  */
112 #define CPUP_INFO_TYPE_OVERLOAD 0x01
113 
114 /*
115  * CPU占用率恢复告警标志。
116  */
117 #define CPUP_INFO_TYPE_RECONVERT 0x02
118 
119 /*
120  * 设置cpu占用率的注册信息结构体。
121  */
122 struct CpupModInfo {
123     /* CPUP告警标志 */
124     bool cpupWarnFlag;
125     /* 采样间隔,单位tick */
126     U32 sampleTime;
127     /* CPU占用率告警阈值 */
128     U32 warn;
129     /* CPU占用率告警恢复阈值 */
130     U32 resume;
131 };
132 
133 /*
134  * CPUP告警信息。
135  */
136 struct CpupWarnInfo {
137     /* CPU占用率告警信息类型 */
138     U16 type;
139     /* 保留 */
140     U16 reserve;
141 };
142 
143 /*
144  * @brief CPUP告警回调函数类型定义。
145  *
146  * @par 描述
147  * 通过该回调函数的类型定义回调函数钩子。
148  * @attention 无
149  *
150  * @param  #struct CpupWarnInfo*   [IN] 类型#struct CpupWarnInfo*,CPUP告警信息。
151  *
152  * @retval 无。
153  * @par 依赖
154  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
155  * @see 无。
156  */
157 typedef void (*CpupHookFunc)(struct CpupWarnInfo *);
158 
159 /*
160  * 线程级CPU占用率结构体。
161  */
162 struct CpupThread {
163     /* 线程ID */
164     U32 id;
165     /* 占用率,取值[0,10000] */
166     U16 usage;
167     /* 保留 */
168     U16 resv;
169 };
170 
171 /*
172  * @brief 获取当前cpu占用率。
173  *
174  * @par 描述
175  * 通过本接口获取当前cpu占用率。
176  * @attention
177  * <ul>
178  * <li>该接口必须在CPUP模块裁剪开关打开,并在osStart之后才能调用此接口,否则返回0xffffffff。</li>
179  * <li>精度为万分之一。</li>
180  * <li>为了减小CPUP统计对线程调度的性能影响,OS采用了基于IDLE计数的统计算法,
181  * 统计结果会有一定误差,误差不超过百分之五。</li>
182  * </ul>
183  *
184  * @param 无。
185  *
186  * @retval #0xffffffff      获取失败,CPUP裁剪开关未打开,或未初始化,或者在osStart之前调用。
187  * @retval #[0,10000]       返回当前cpu占用率。
188  * @par 依赖
189  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
190  * @see PRT_CpupAvg | PRT_CpupThread
191  */
192 extern U32 PRT_CpupNow(void);
193 
194 /*
195  * @brief 获取指定个数的线程的CPU占用率。
196  *
197  * @par 描述
198  * 根据用户输入的线程个数,获取指定个数的线程CPU占用率。
199  * @attention
200  * <ul>
201  * <li>当且仅当CPUP模式配置为线程级时,该接口有效。</li>
202  * <li>当配置项中的采样周期值等于0时,线程级CPUP采样周期为两次调用该接口或者PRT_CpupNow之间
203  * 的间隔。否则,线程级CPUP采样周期为配置项中的OS_CPUP_SAMPLE_INTERVAL大小。</li>
204  * <li>输出的实际线程个数不大于系统中实际的线程个数(任务个数和一个中断线程)。</li>
205  * <li>若输入的线程个数为1,则仅输出中断线程(除任务线程以外的线程统称)的CPUP信息。</li>
206  * <li>若在一个采样周期内有任务被删除,则统计的任务线程和中断线程CPUP总和小于10000。</li>
207  * </ul>
208  *
209  * @param inNum  [IN]  类型#U32,输入的线程个数。
210  * @param cpup   [OUT] 类型#struct CpupThread *,缓冲区,输出参数,用于填写输出个数线程的CPUP信息。
211  * @param outNum [OUT] 类型#U32 *,保存输出的实际线程个数指针。
212  *
213  * @retval #OS_OK  0x00000000,获取成功。
214  * @retval #其它值,获取失败。
215  * @par 依赖
216  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
217  * @see PRT_CpupNow
218  */
219 extern U32 PRT_CpupThread(U32 inNum, struct CpupThread *cpup, U32 *outNum);
220 
221 #if defined(OS_OPTION_CPUP_WARN)
222 /*
223  * @brief 设置CPU占用率告警阈值。
224  *
225  * @par 描述
226  * 根据用户配置的CPU占用率告警阈值warn和告警恢复阈值resume,设置告警和恢复阈值。
227  * @attention
228  * <ul>
229  * <li>OsStart之前不能调用此接口。</li>
230  * </ul>
231  *
232  * @param warn   [IN]  类型#U32,CPUP告警阈值。
233  * @param resume [IN]  类型#U32,CPUP恢复阈值。
234  *
235  * @retval #OS_OK  0x00000000,阈值设定成功。
236  * @retval #其它值,阈值设定失败。
237  * @par 依赖
238  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
239  * @see PRT_CpupGetWarnValue
240  */
241 extern U32 PRT_CpupSetWarnValue(U32 warn, U32 resume);
242 
243 /*
244  * @brief 查询CPUP告警阈值和告警恢复阈值
245  *
246  * @par 描述
247  * 根据用户配置的告警阈值指针warn和告警恢复阈值指针resume,查询告警阈值和告警恢复阈值
248  * @attention
249  * <ul>
250  * <li>OsStart之前不能调用此接口。</li>
251  * </ul>
252  *
253  * @param warn   [OUT] 类型#U32 *,CPUP告警阈值。
254  * @param resume [OUT] 类型#U32 *,CPUP恢复阈值。
255  *
256  * @retval #OS_OK  0x00000000,获取成功。
257  * @retval #其它值,获取失败。
258  * @par 依赖
259  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
260  * @see PRT_CpupSetWarnValue
261  */
262 extern U32 PRT_CpupGetWarnValue(U32 *warn, U32 *resume);
263 
264 /*
265  * @brief 注册CPUP告警回调函数
266  *
267  * @par 描述
268  * 根据用户配置的回调函数hook,注册CPUP告警回调函数
269  * @attention
270  * <ul>
271  * <li>不允许重复或覆盖注册钩子。</li>
272  * <li>hook为NULL时,表示删除该钩子。</li>
273  * </ul>
274  *
275  * @param hook [IN]  类型#CpupHookFunc,CPU告警回调函数。
276  *
277  * @retval #OS_OK  0x00000000,注册成功。
278  * @retval #其它值,注册失败。
279  * @par 依赖
280  * <ul><li>prt_cpup.h:该接口声明所在的头文件。</li></ul>
281  * @see 无。
282  */
283 extern U32 PRT_CpupRegWarnHook(CpupHookFunc hook);
284 #endif
285 
286 #ifdef __cplusplus
287 #if __cplusplus
288 }
289 #endif /* __cpluscplus */
290 #endif /* __cpluscplus */
291 
292 #endif /* PRT_CPUP_H */
293