找回密码
 立即注册
查看: 228|回复: 11

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

[复制链接]

该用户从未签到

19

主题

519

回帖

1642

积分

荣誉版主

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

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

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

可以显示CPU使用率

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

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

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

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

演示代码:
截图202404121430531307.jpg


运行截图:
截图202404121432082051.jpg


Frame.rar (294.44 KB, 下载次数: 36)

回复 送花

使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:12
  • 签到天数: 138 天

    [LV.7]常住居民III

    9

    主题

    264

    回帖

    917

    积分

    高级会员

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

    点评

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

    使用道具 举报

  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 154 天

    [LV.7]常住居民III

    25

    主题

    709

    回帖

    1765

    积分

    金牌会员

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

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1642

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    6 小时前
  • 签到天数: 147 天

    [LV.7]常住居民III

    12

    主题

    100

    回帖

    1442

    积分

    金牌会员

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

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 10:12
  • 签到天数: 138 天

    [LV.7]常住居民III

    9

    主题

    264

    回帖

    917

    积分

    高级会员

    积分
    917
    发表于 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
    自信就会温和,温和就会坚定!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1642

    积分

    荣誉版主

    积分
    1642
     楼主| 发表于 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使用率.

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



    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    519

    回帖

    1642

    积分

    荣誉版主

    积分
    1642
     楼主| 发表于 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);
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    41 秒前
  • 签到天数: 56 天

    [LV.5]常住居民I

    2

    主题

    520

    回帖

    665

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 00:15
  • 签到天数: 54 天

    [LV.5]常住居民I

    0

    主题

    177

    回帖

    332

    积分

    中级会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-30 09:00 , Processed in 0.079617 second(s), 72 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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