裸机编程框架, 可以显示CPU使用率
本帖最后由 tzz1983 于 2024-8-9 14:17 编辑裸机如何显示CPU使用率, 想过这个问题吗
这是我自己经常在STC8H上用的一个裸机编程框架.
可以显示CPU使用率
可以测量函数运行时间, 复用滴答定时器, 不用额外的定时器资源.
测量功能稍加更改即可统计每个函数(任务)的运行时间.
另外就没什么功能了, 反正就是循环定时同步调度, 和官网上那个" 任务调度方法,【无错,至简】!“多任务分时调度”" 差不多的.
纯祼机框架编译下来, 仅374 byte 字节代码. (去掉 "统计功能, 测量功能, 串口应用" )
演示代码:
运行截图:
这个 CPU usage 是怎么实现的? {:4_174:} 嵌入式之路 发表于 2024-4-12 15:47
这个 CPU usage 是怎么实现的?
代码并不复杂, 下载下来看一下就明白了 学习下,谢谢 没有看的很明白,能不能麻烦稍微解释一下?
/*以下统计相关功能*/
#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 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:30 编辑
嵌入式之路 发表于 2024-4-12 18:15
没有看的很明白,能不能麻烦稍微解释一下?
简单点说吧, 正常调度运行时, 只有空闲时才会执行 Stat_counting++
初始化统计时, 是把所有的时间都用于 Stat_counting++
通过对比调度时采样到的 Stat_counting 和 初始化时采样到的 Stat_counting 来得到CPU使用率.
计算过程就是 CPUUsage = (Stat_base-st_cu)/(Stat_base/1000UL);
下载下来学习一下 学习一下