RT-Thread的CPU使用率计算
2016-05-17 11:46
429 查看
CPU 的使用率一般是我们比较关心的问题,在这里我们就用空闲线程的钩子函数去统计 CPU 的使用率,并通过串口打印出来。
首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“事情”,让其占用率变高,方便统计,然后每个 1 秒中打印一次 CPU 使用率。其中 CPU 的使用率我们是根据 CPU 的空闲率反推出来的。
前面说过,系统的心跳时钟过快,会增加 cpu 的负担,我们可以在这里来验证,读者可
以将系统滴答时间改为 1ms,然后你将会发现 cpu 的使用率从 24%升高到了 87%!!,如下图:
首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“事情”,让其占用率变高,方便统计,然后每个 1 秒中打印一次 CPU 使用率。其中 CPU 的使用率我们是根据 CPU 的空闲率反推出来的。
#include <rtthread.h> #include <rthw.h> #define CPU_USAGE_CALC_TICK 10 #define CPU_USAGE_LOOP 100 static rt_uint8_t cpu_usage_major = 0, cpu_usage_minor= 0; static rt_uint32_t total_count = 0; static void cpu_usage_idle_hook(void) { rt_tick_t tick; rt_uint32_t count; volatile rt_uint32_t loop; if (total_count == 0) { /* get 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; /* get CPU usage */ tick = rt_tick_get(); while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } /* calculate major and minor */ 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; /* no CPU usage */ 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; } void cpu_usage_init(void) { /* set idle thread hook */ rt_thread_idle_sethook(cpu_usage_idle_hook); }
前面说过,系统的心跳时钟过快,会增加 cpu 的负担,我们可以在这里来验证,读者可
以将系统滴答时间改为 1ms,然后你将会发现 cpu 的使用率从 24%升高到了 87%!!,如下图:
相关文章推荐
- 苹果下如果安装nginx,给nginx安装markdown第三方插件
- HDU1054 Strategic Game(二分匹配)
- C#清除WebBrowser中Cookie缓存的方法
- 获取SHA1值
- Xamarin.Forms之PCLStorage
- callback to handle completion of pipe
- 解决linux不能上外网的问题
- The Three Most Important Things You Look for in Your Employment Relationship
- 2016 UESTC Training for Dynamic Programming D - 柱爷的恋爱 区间dp、记忆化搜索
- 2016 UESTC Training for Dynamic Programming C - 柱爷的下凡 预处理打表、背包问题
- tb740605_2012
- 软件开发过程-Python集成开发环境
- 在ASP.NET 2.0中操作数据之五十八:在程序启动阶段缓存数据
- 04-时序逻辑电路设计之计数器——小梅哥FPGA设计思想与验证方法视频教程配套文档
- polymer 1.0 dom-repeat filter only runs once
- 真实大起底:一名黑马程序员的就业经历
- CentOS 7 (无盘安装)PXE服务器的搭建(失败求助版)
- H5元素以及属性
- js 通过userAgent判断是安卓还是ios
- List<?> list= new ArrayList<?>为什么这样写 接口引用指向实现类的对象