RT-Thread的CPU使用率计算

来源:互联网 发布:scala编程完整版 pdf 编辑:程序博客网 时间:2024/06/08 03:52
CPU 的使用率一般是我们比较关心的问题,在这里我们就用空闲线程的钩子函数去统计 CPU 的使用率,并通过串口打印出来。

首先我们在初始化线程中设置好钩子函数,并在 LED 线程中给系统人为的加入很多“事情”,让其占用率变高,方便统计,然后每个 1 秒中打印一次 CPU 使用率。其中 CPU 的使用率我们是根据 CPU 的空闲率反推出来的。

//CPU使用率#include #include #define CPU_USAGE_CALC_TICK    10#define CPU_USAGE_LOOP        100static rt_uint8_t  cpu_usage_major = 0, cpu_usage_minor= 0;static rt_uint32_t total_count = 0;static void cpu_usage_idle_hook(void){    rt_tick_t tick;    rt_uint32_t count;    volatile rt_uint32_t loop;    if (total_count == 0)    {        /* get total count */        rt_enter_critical();        tick = rt_tick_get();        while(rt_tick_get() - tick < CPU_USAGE_CALC_TICK)        {            total_count ++;            loop = 0;            while (loop < CPU_USAGE_LOOP) loop ++;        }        rt_exit_critical();    }    count = 0;    /* get CPU usage */    tick = rt_tick_get();    while (rt_tick_get() - tick < CPU_USAGE_CALC_TICK)    {        count ++;        loop  = 0;        while (loop < CPU_USAGE_LOOP) loop ++;    }    /* calculate major and minor */    if (count < total_count)    {        count = total_count - count;        cpu_usage_major = (count * 100) / total_count;        cpu_usage_minor = ((count * 100) % total_count) * 100 / total_count;    }    else    {        total_count = count;        /* no CPU usage */        cpu_usage_major = 0;        cpu_usage_minor = 0;    }}void cpu_usage_get(rt_uint8_t *major, rt_uint8_t *minor){    RT_ASSERT(major != RT_NULL);    RT_ASSERT(minor != RT_NULL);    *major = cpu_usage_major;    *minor = cpu_usage_minor;}void cpu_usage_init(void){    /* set idle thread hook */    rt_thread_idle_sethook(cpu_usage_idle_hook);}

前面说过,系统的心跳时钟过快,会增加 cpu 的负担,我们可以在这里来验证,读者可
以将系统滴答时间改为 1ms,然后你将会发现 cpu 的使用率从 24%升高到了 87%!!,如下图:



原创粉丝点击