找回密码
 立即注册
查看: 1856|回复: 23

裸机编程框架, 可以显示CPU使用率

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-12 14:40:42 | 显示全部楼层 |阅读模式
本帖最后由 tzz1983 于 2024-8-9 14:17 编辑

裸机如何显示CPU使用率, 想过这个问题吗

这是我自己经常在STC8H上用的一个裸机编程框架.

可以显示CPU使用率

可以测量函数运行时间, 复用滴答定时器, 不用额外的定时器资源.

测量功能稍加更改即可统计每个函数(任务)的运行时间.

另外就没什么功能了, 反正就是循环定时同步调度, 和官网上那个  " 任务调度方法,【无错,至简】!“多任务分时调度”" 差不多的.

纯祼机框架编译下来, 仅374 byte 字节代码. (去掉 "统计功能, 测量功能, 串口应用" )

演示代码:
截图202404121430531307.jpg


运行截图:
截图202404121432082051.jpg


Frame.rar (81.85 KB, 下载次数: 209)

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-04-30 10:57:37

17

主题

533

回帖

1326

积分

金牌会员

积分
1326
发表于 2024-4-12 15:47:58 | 显示全部楼层
这个 CPU usage 是怎么实现的?

点评

代码并不复杂, 下载下来看一下就明白了  详情 回复 发表于 2024-4-12 16:00
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

积分
2540
发表于 2024-4-12 15:48:30 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-12 16:00:21 | 显示全部楼层
嵌入*** 发表于 2024-4-12 15:47
这个 CPU usage 是怎么实现的?

代码并不复杂, 下载下来看一下就明白了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-05-01 08:38:15

12

主题

110

回帖

1072

积分

金牌会员

积分
1072
发表于 2024-4-12 16:40:09 | 显示全部楼层
学习下,谢谢
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:449
  • 最近打卡:2025-04-30 10:57:37

17

主题

533

回帖

1326

积分

金牌会员

积分
1326
发表于 2024-4-12 18:15:27 | 显示全部楼层
没有看的很明白,能不能麻烦稍微解释一下?


  1. /*以下统计相关功能*/
  2. #if USE_STATISTICAL
  3. /*---------------------------------------------------------
  4. 设置CPU使用率: CPUUsage  每秒更新一次
  5. ----------------------------------------------------------*/
  6. static void Set_CPUUsage(void)
  7. {
  8.     static u32 xdata st_cu=0;
  9.     static u16 xdata st_nu=0;
  10.     st_cu += Stat_counting;
  11.     Stat_counting = 0;
  12.     if(++st_nu>=TICKS_PER_SEC){
  13.         if(st_cu>Stat_base)Stat_base=st_cu;
  14.         CPUUsage = (Stat_base-st_cu)/(Stat_base/1000UL);
  15.         st_cu = st_nu = 0;
  16.     }
  17. }
  18. /*---------------------------------------------------------------
  19. 统计初始化, 一个时钟滴答Stat_counting加了多少次, 结果存于Stat_base
  20. ----------------------------------------------------------------*/
  21. static void Statistical_init(void)
  22. {
  23.     Timer0Init();           //Timer0 初始化
  24.     Frame_TICK = 0;
  25.     Stat_counting=0;
  26.     TR0=ET0=EA=1;
  27.     while(1){
  28.         if(Frame_TICK){
  29.             TR0=ET0=EA=0;
  30.             Stat_base = Stat_counting*TICKS_PER_SEC;
  31.             Stat_counting = 0;
  32.             return;
  33.         }else{
  34.             Stat_counting++;
  35.         }
  36.     }
  37. }
  38. #endif
复制代码

点评

简单点说吧, 正常调度运行时, 只有空闲时才执行 Stat_counting++ 初始化时, 是把所有的时间都用于 Stat_counting++ 通过对比调度时采样到的 Stat_counting 和 初始化时采样的到 Stat_counting 来得到CPU使用率. 计  详情 回复 发表于 2024-4-12 19:25
第一大步: Statistical_init() 执行的作用是初始化基数值 Stat_base 1. 在 Statistical_init() 中 重置定时器 和 Frame_TICK , 并开启计时和中断, 一个时钟滴答后, Frame_TICK 被中断置1 , 在这一个滴答期间, St  详情 回复 发表于 2024-4-12 18:46
自信就会温和,温和就会坚定!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-12 18:46:23 | 显示全部楼层
本帖最后由 tzz1983 于 2024-4-12 19:04 编辑
嵌入*** 发表于 2024-4-12 18:15
没有看的很明白,能不能麻烦稍微解释一下?

第一大步: Statistical_init() 执行的作用是初始化基数值 Stat_base
1.  在 Statistical_init() 中 重置定时器 和 Frame_TICK , 并开启计时和中断,  一个时钟滴答后,  Frame_TICK 被中断置1 ,就结束采样了.  
     在这一个滴答期间,  Statistical_init()只做了一件事, 就是不断的自增 Stat_counting++;
2.  Statistical_init()总结:  目的就是看一个时钟滴答内, Stat_counting++可以运行多少次,
     然后把采样到的值  Stat_counting * TICKS_PER_SEC  (1秒有多少个滴答)  后, 保存在 Stat_base 内

实现原理, 因为在执行 Statistical_init() 时, 没有其它的"任务" 可以执行,
所以此时采样到的 Stat_counting 是理论上一个滴答内最大可能的值.
换句话说 CPU 100% 空闲时, Stat_counting++也最多只能执行这么多次.

第二大步:  Set_CPUUsage() , 每次滴答都会执行一次 Set_CPUUsage(),
这个时候已经开启了任务调度. 由于有"任务"需要执行,   Stat_counting++可执行的次数变少了,
任务花费的时间越长, Stat_counting++可执行的次数就越少, 也就是空闲的时间越少, 这个是成正比的.

每次调用 Set_CPUUsage() 时, 将 Stat_counting 累加到 变量 st_cu ,  一秒(也就是TICKS_PER_SEC个滴答)后,
将st_cu累积起来的值和 Stat_base 对比, 通过数学运算即可得到CPU使用率.

我测试过很多次, 结果超准, 精确到小数位



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-4-12 19:25:46 | 显示全部楼层
本帖最后由 tzz1983 于 2024-4-12 19:30 编辑

嵌入*** 发表于 2024-4-12 18:15
没有看的很明白,能不能麻烦稍微解释一下?


简单点说吧, 正常调度运行时, 只有空闲时才会执行 Stat_counting++
初始化统计时, 是把所有的时间都用于 Stat_counting++

通过对比调度时采样到的 Stat_counting 和 初始化时采样到的 Stat_counting 来得到CPU使用率.
计算过程就是 CPUUsage = (Stat_base-st_cu)/(Stat_base/1000UL);
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-4-12 19:44:08 来自手机 | 显示全部楼层
下载下来学习一下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:391
  • 最近打卡:2025-04-30 00:26:42

0

主题

336

回帖

1490

积分

金牌会员

积分
1490
发表于 2024-4-12 20:06:50 | 显示全部楼层
学习一下
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 06:32 , Processed in 0.169056 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表