tzz1983 发表于 2024-4-12 14:40:42

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

本帖最后由 tzz1983 于 2024-8-9 14:17 编辑

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

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

可以显示CPU使用率

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

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

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

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

演示代码:



运行截图:





嵌入式之路 发表于 2024-4-12 15:47:58

这个 CPU usage 是怎么实现的?

jwd 发表于 2024-4-12 15:48:30

{:4_174:}

tzz1983 发表于 2024-4-12 16:00:21

嵌入式之路 发表于 2024-4-12 15:47
这个 CPU usage 是怎么实现的?

代码并不复杂, 下载下来看一下就明白了

gzlai 发表于 2024-4-12 16:40:09

学习下,谢谢

嵌入式之路 发表于 2024-4-12 18:15:27

没有看的很明白,能不能麻烦稍微解释一下?


/*以下统计相关功能*/
#if USE_STATISTICAL
/*---------------------------------------------------------
设置CPU使用率: CPUUsage每秒更新一次
----------------------------------------------------------*/
static void Set_CPUUsage(void)
{
    static u32 xdata st_cu=0;
    static u16 xdata st_nu=0;

    st_cu += Stat_counting;
    Stat_counting = 0;
    if(++st_nu>=TICKS_PER_SEC){
      if(st_cu>Stat_base)Stat_base=st_cu;
      CPUUsage = (Stat_base-st_cu)/(Stat_base/1000UL);
      st_cu = st_nu = 0;
    }
}

/*---------------------------------------------------------------
统计初始化, 一个时钟滴答Stat_counting加了多少次, 结果存于Stat_base
----------------------------------------------------------------*/
static void Statistical_init(void)
{
    Timer0Init();         //Timer0 初始化
    Frame_TICK = 0;
    Stat_counting=0;
    TR0=ET0=EA=1;
    while(1){
      if(Frame_TICK){
            TR0=ET0=EA=0;
            Stat_base = Stat_counting*TICKS_PER_SEC;
            Stat_counting = 0;
            return;
      }else{
            Stat_counting++;
      }
    }
}
#endif

tzz1983 发表于 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使用率.

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



tzz1983 发表于 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);

soma 发表于 2024-4-12 19:44:08

下载下来学习一下

xxxevery 发表于 2024-4-12 20:06:50

学习一下
页: [1] 2 3
查看完整版本: 裸机编程框架, 可以显示CPU使用率