博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.空闲任务与钩子函数
阅读量:4099 次
发布时间:2019-05-25

本文共 3064 字,大约阅读时间需要 10 分钟。

CPU使用率的计算,先去统计CPU的空闲率,100%-空闲率=CPU使用率。  

临界区的概念:临界区有进入和退出操作,在进入临界区和退出临界区这段时间内执行的代码是独享CPU使用权的!  

rt_enter_critical(); //进入临界区tick = rt_tick_get();while (rt_tick_get() - tick < 10){    total_count ++;    loop = 0;    while (loop < 100) loop ++; }rt_exit_critical();//退出临界区

计算原理:这段在临界区内执行的代码在10个系统滴答时间内让total_count自加,这里的loop是一个循环,loop加100次,total_count才加一次,作用是让CPU完全发挥作用,这里是计算了完全使用CPU时,total_count能自加多少个。

然后是系统不进入临界区来执行这段代码,因为这段代码放在空闲任务中,只有其他任务执行完之后才会运行空闲任务(count++),得到的是count。

count/total_count就是CPU的空闲率,用100%减去空闲率就是使用率。

/* * 程序清单:空闲任务钩子例程 * * 这个例程设置了一个空闲任务钩子用于计算CPU使用率,并创建一个线程循环打印CPU使用率 * 通过修改CPU使用率打印线程中的休眠tick时间可以看到不同的CPU使用率 */#include 
#include
#define THREAD_PRIORITY 25#define THREAD_STACK_SIZE 512#define THREAD_TIMESLICE 5/* 指向线程控制块的指针 */static rt_thread_t tid = RT_NULL;#define CPU_USAGE_CALC_TICK 10#define CPU_USAGE_LOOP 100static rt_uint8_t cpu_usage_major = 0, cpu_usage_minor = 0;/* 记录CPU使用率为0时的总count数 */static rt_uint32_t total_count = 0;/* 空闲任务钩子函数 */static void cpu_usage_idle_hook(){ rt_tick_t tick; rt_uint32_t count; volatile rt_uint32_t loop; if (total_count == 0) { /* 获取 total_count */ rt_enter_critical(); tick = rt_tick_get(); while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { total_count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } rt_exit_critical(); } count = 0; /* 计算CPU使用率 */ tick = rt_tick_get(); while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } /* 计算整数百分比整数部分和小数部分 */ if (count < total_count) { count = total_count - count; cpu_usage_major = (count * 100) / total_count; cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count; } else { total_count = count; /* CPU使用率为0 */ cpu_usage_major = 0; cpu_usage_minor = 0; }}void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor){ RT_ASSERT(major != RT_NULL); RT_ASSERT(minor != RT_NULL); *major = cpu_usage_major; *minor = cpu_usage_minor;}/* CPU使用率打印线程入口 */static void thread_entry(void *parameter){ rt_uint8_t major, minor; while (1) { cpu_usage_get(&major, &minor); rt_kprintf("cpu usage: %d.%d%\n", major, minor); /* 休眠50个OS Tick */ /* 手动修改此处休眠 tick 时间,可以模拟实现不同的CPU使用率 */ rt_thread_delay(50); }}int cpu_usage_init(){ /* 设置空闲线程钩子 */ rt_thread_idle_sethook(cpu_usage_idle_hook); /* 创建线程 */ tid = rt_thread_create("thread", thread_entry, RT_NULL, /* 线程入口是thread_entry, 入口参数是RT_NULL */ THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid); return 0;}/* 如果设置了RT_SAMPLES_AUTORUN,则加入到初始化线程中自动运行 */#if defined (RT_SAMPLES_AUTORUN) && defined(RT_USING_COMPONENTS_INIT) INIT_APP_EXPORT(cpu_usage_init);#endif/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(cpu_usage_init, idle hook sample);

转载地址:http://kswsi.baihongyu.com/

你可能感兴趣的文章
双层嵌套list扁平化输出
查看>>
输入一行字符串,统计英文字母,数字和其他字符个数
查看>>
idea运行提示Error:java:无效的源发行版:1.9
查看>>
随机输入0到99999任意数 判断是几位数
查看>>
公鸡5块钱,母鸡3块钱,小鸡1块钱3只,有100圆,有多少种买法?
查看>>
输入3个数,判断是否构成三角形三条边
查看>>
n个人围圈报数,顺序排号,1到3报数,报3的人退出,最后留下的是原来几号?
查看>>
输出200到500之间所有素数,从小到大排列,元素之间逗号隔开。
查看>>
求给定值幻方结果,每行每列,对角线各数之和相等
查看>>
一个整数,加100是一个完全平方,再加168又是一个完全平方,请问该数是多少
查看>>
求一个正整数的质因数。
查看>>
蛇形矩阵
查看>>
则正表达式
查看>>
maven 安装第三方jar包到本地仓库&安装第三方jar包到私服
查看>>
文件下载工具包DownLoadUtils
查看>>
经典基础编程50题
查看>>
dubbox简介
查看>>
spring boot 聚合工程 报错repackage failed: Unable to find main class -> [Help 1] 解决方法:
查看>>
Oracle Start With的用法
查看>>
1.oracle中的exists 和not exists 用法:
查看>>