Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Kernel
CPU使用率
统计线程的CPU使用率
请教cpu使用率分析
发布于 2013-07-06 16:35:14 浏览:13231
订阅该版
各位好! 在近在用RT的时候需要在里面添加查看CPU使用率,找到了rt自带的cpu使用率的历程,自己对比源码分析了一下其实现的思路,如有不对的地方欢迎指正,再次谢谢各位! RT里面提供的CPU使用率函数, 首先把cpu_usage_idle_hook函数添加到RT空闲钩子函数上,通过rt_thread_idle_sethook(cpu_usage_idle_hook); 函数实现,在添加钩子函数之后只有在进入空闲线程的时候才会执行此钩子函数cpu_usage_idle_hook, 然后在钩子函数里面,首先在进入 rt_enter_critical(); (关闭中断和调度)相当于CPU全速模式,计算total_count 在一个相对时间 rt_tick_get() - tick < CPU_USAGE_CALC_TICK 10个时钟周期(100ms) 累加的数值, 把这个累加出来的数值作为CPU在100ms 关闭中断和调度的情况下能够处理数据的”标准“ , 这部分源码: ```c if (total_count == 0) { /* get total count */ rt_enter_critical();//进入临界区 tick = rt_tick_get(); //得到当前系统时钟节拍 //10个时钟周期 100ms while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { total_count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } rt_exit_critical();//离开临界区 } ``` 接着计算 count 数据,这个count 数据每个调度周期都是变化的,根据空闲线程被调度的时间,同样是在10个系统时钟周期100ms的时间,计算出在不关闭中断和调度的情况下,count数据能够累加的数据,通过这个累加的数值反映出空闲线程的执行时间,然后通过total_count数值就可以计算出系统在一个相对时间的使用率, ```c count = 0; tick = rt_tick_get();//得到当前系统时钟节拍 //10个时钟周期 100ms while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK) { count ++; loop = 0; while (loop < CPU_USAGE_LOOP) loop ++; } ``` 最后根据total_count 和count数值计算cpu使用率 计算公式: ``` count = total_count - count; cpu_usage_major = (count * 100) / total_count; cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count; ``` 如`total_count = 100;count = 80;` 则可以计算出CPU在一个相对时间内占用率是20%. 主要思路是根据在一个相对时间(100ms)空闲线程执行的时间来计算,空闲线程执行的时间越长,证明CPU使用率越低,反之亦然。
查看更多
16
个回答
默认排序
按发布时间排序
prife
2013-07-06
这家伙很懒,什么也没写!
赞一下,学习。
ufbycd
2013-07-06
这家伙很懒,什么也没写!
为何不计算每个线程的CPU使用率呢?
aozima
2013-07-07
调网络不抓包,调I2C等时序不上逻辑分析仪,就像电工不用万用表!多用整理的好的文字,比截图更省流量,还能在整理过程中思考。
>为何不计算每个线程的CPU使用率呢? --- 有道理,感觉很有用。
grissiom
2013-07-07
这家伙很懒,什么也没写!
total_count 是不变的吧,或许应该在初始化的时候校准一下就行。而且这个校准应该是在中断关闭的情况下进行的? 如果在 TCB 里加一些统计量,统计各个线程所使用的时间片,那么 CPU 使用率就可以不用这种方式计算了~
bernard
2013-07-07
这家伙很懒,什么也没写!
计算每个任务的CPU占用率就不是这么计算的了
weiyuliang
2013-07-08
这家伙很懒,什么也没写!
>total_count 是不变的吧,或许应该在初始化的时候校准一下就行。而且这个校准应该是在中断关闭的情况下进行的? > >如果在 TCB 里加一些统计量,统计各个线程所使用的时间片,那么 CPU 使用率就可以不用这种方式计算了~ --- total_count就是在关闭中断和调度的情况下进行一次累加, 查看每个线程CPU使用率是不是在每个线程的TCB里面添加一个时间片信息。等所有线程调度完之后,根据每个TCB里面时间片和调度一次总的时间片,两个比值就可以计算所占用的比例那? E.G:系统调度完成一次所用的时间片是100,一个线程TCB统计的这个线程的时间片是10 则可以表明此线程在上个调度周期CPU使用率10%?
weiyuliang
2013-07-08
这家伙很懒,什么也没写!
>计算每个任务的CPU占用率就不是计算的了 --- 看每个线程CPU使用率是不是在每个线程的TCB里面添加一个时间片信息。等所有线程调度完之后,根据每个TCB里面时间片和调度一次总的时间片,两个比值就可以计算所占用的比例那? E.G:系统调度完成一次所用的时间片是100,一个线程TCB统计的这个线程的时间片是10 则可以表明此线程在上个调度周期CPU使用率10%? 能否提供一个思路?
bernard
2013-07-08
这家伙很懒,什么也没写!
时间片的粒度太粗,所以不能够使用时间片的方式进行。
ufbycd
2013-07-08
这家伙很懒,什么也没写!
>时间片的粒度太粗,所以不能够使用时间片的方式进行。 --- 嗯。FreeRTOS的做法是用一个比时间片更快的物理定时器来进行计算的。 有空可以研究下FreeRTOS的 configGENERATE_RUN_TIME_STATS 宏,及 void vTaskGetRunTimeStats( portCHAR *pcWriteBuffer ) 函数。
sunnydragon
2013-08-03
这家伙很懒,什么也没写!
建议在新版本中能集成获取当前CPU总利用率功能~要是能再获取每个线程的CPU利用率就更好了~
撰写答案
登录
注册新账号
关注者
0
被浏览
13.2k
关于作者
weiyuliang
这家伙很懒,什么也没写!
提问
15
回答
81
被采纳
0
关注TA
发私信
相关问题
1
选择FreeRTOS, 还是RT-Thread。
2
thread heap stack overflow ?
3
rtt消息队列delay问题
4
释放被删除线程的内存地方在哪里啊
5
请教:各线程结束后,释放其中的内存的连续性问题
6
STM32F103中断关于信号量、邮箱问题
7
RTT中的线程栈大小如何控制
8
关于线程由执行态变为挂起态的代码实现,,,
9
rt_malloc(rt_size_t size)内存分配函数最小分配尺寸问题
10
RT-Thread 同优先级轮询出现问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
【RT-Thread】记录一次对主仓的bsp进行修复并提交pr的总结
2
【请投票】嵌入式大赛Top10排名等你来选!
3
【24嵌入式设计大赛】HPM5300-EVK 网络测速仪
4
RT-Thread Nano 上线ST CubeMX
5
Nordic移植笔记: RT_Thread v5.1.0(基于Nordic nRF52840的ble_app_hids_mouse工程)
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
ART-Pi
FinSH
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
flash
packages_软件包
cubemx
PWM
freemodbus
BSP
潘多拉开发板_Pandora
定时器
ADC
socket
flashDB
中断
Debug
GD32
编译报错
msh
keil_MDK
C++_cpp
rt_mq_消息队列_msg_queue
ulog
at_device
SFUD
本月问答贡献
出出啊
1515
个答案
342
次被采纳
小小李sunny
1438
个答案
289
次被采纳
张世争
785
个答案
168
次被采纳
crystal266
546
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
6
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
1
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部