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