发 帖  
原厂入驻New
[原创]

灵动微课堂 (第138讲) | 基于MM32 MCU的OS移植与应用——RT-Thread CPU利用率统计

2020-9-24 17:57:22  85
分享
1. CPU利用率统计的方法
当前CPU利用率的统计,就是在相同时间内,统计CPU在不调度的情况下和CPU在调度情况下的占用时间比例,得出CPU的空闲比例;那CPU占用率就等于(1 - 空闲率)。
2. CPU利用率统计的实现
  2.1  
打开rtconfig.h文件,切换到Configuration Wizard窗口,将Basic Configuration中的OS tick per second值修改为100、勾选Hook Configuration中的子选项using idle hook配置,如下图所示:
2.png
图1:rtconfig.h配置
  2.2  
添加CPU占用率统计的实现代码:
/* Private define -----------------------------------------------------------*/
#define MM32_CPU_USAGE_TICK     10
#define MM32_CPU_USAGE_LOOP     100


/* Private variables --------------------------------------------------------*/
rt_uint8_t  mm32_cpu_usage_integer = 0;
rt_uint8_t  mm32_cpu_usage_decimal = 0;
rt_uint32_t mm32_cpu_usage_count   = 0;

/******************************************************************************
* @Brief      
* @param      
* @retval      
* @attention   
******************************************************************************/
void mm32_cpu_usage_hook(void)
{
    volatile rt_tick_t   tick  = 0;
    volatile rt_uint32_t count = 0;
    volatile rt_uint32_t loop  = 0;

    IF(mm32_cpu_usage_count == 0)
    {
        rt_enter_critical();

        tick = rt_tick_get();

        while((rt_tick_get() - tick) < MM32_CPU_USAGE_TICK)
        {
            mm32_cpu_usage_count++;

            loop = 0;

            while(loop < MM32_CPU_USAGE_LOOP)
            {
                loop++;
            }
        }

        rt_exit_critical();
    }

    count = 0;
    tick  = rt_tick_get();

    while((rt_tick_get() - tick) < MM32_CPU_USAGE_TICK)
    {
        count++;

        loop = 0;

        while(loop < MM32_CPU_USAGE_LOOP)
        {
            loop++;
        }
    }

/* Calculate MM32 CPU Usage */
    if(count < mm32_cpu_usage_count)
    {
        count = mm32_cpu_usage_count - count;

        mm32_cpu_usage_integer =  (count * 100) / mm32_cpu_usage_count;
        mm32_cpu_usage_decimal = ((count * 100) % mm32_cpu_usage_count) * 100 / mm32_cpu_usage_count;
    }
    else
    {
        mm32_cpu_usage_count = count;

        mm32_cpu_usage_integer = 0;
        mm32_cpu_usage_decimal = 0;
    }
}

/******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
******************************************************************************/
void mm32_cpu_usage_get(rt_uint8_t *integer, rt_uint8_t *decimal)
{
    RT_ASSERT(integer != RT_NULL);
    RT_ASSERT(decimal != RT_NULL);

    *integer = mm32_cpu_usage_integer;
    *decimal = mm32_cpu_usage_decimal;
}
2.3  
添加测试线程代码,并将CPU利用率的钩子函数设置为IDLE钩子函数,在其中一个线程中读取并打印当前的CPU利用率:
/* Private define -----------------------------------------------------------*/
#define MM32_THREAD_STACK_SIZE   512
#define MM32_THREAD_PRIORITY     5
#define MM32_THREAD_TIMESLICE    10

/* Private variables --------------------------------------------------------*/
static rt_thread_t mm32_thread1 = RT_NULL;

static char mm32_thread2_stack[1024];
static struct rt_thread mm32_thread2;

/******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
******************************************************************************/
void mm32_thread1_entry(void *parameter)
{
    rt_uint8_t integer = 0;
    rt_uint8_t decimal = 0;

    /* Init LEDs GPIO */
    BSP_LED_Init();

    while(1)
    {
        /* Toggle LED1~LED2 status */
        BSP_LED1_TOGGLE();
        BSP_LED2_TOGGLE();

        mm32_cpu_usage_get(&integer, &decimal);

        rt_kprintf("MM32 CPU Usage : %d.%d%\r\n", integer, decimal);

        /* Delay 500ms */
        rt_thread_mdelay(1000);
    }
}

/******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
******************************************************************************/
void mm32_thread2_entry(void *parameter)
{
    while(1)
    {
        /* Toggle LED3~LED4 status */
        BSP_LED3_TOGGLE();
        BSP_LED4_TOGGLE();

        /* Delay 250ms */
        rt_thread_mdelay(250);
    }
}

/******************************************************************************
* @brief      
* @param      
* @retval      
* @attention   
******************************************************************************/
int main(void)
{
    mm32_thread1 = rt_thread_create("thread1",
                                    mm32_thread1_entry, RT_NULL,
                                    MM32_THREAD_STACK_SIZE,
                                    MM32_THREAD_PRIORITY,
                                    MM32_THREAD_TIMESLICE);

    if(mm32_thread1 != RT_NULL)
    {
        rt_thread_startup(mm32_thread1);
    }

    rt_thread_init(&mm32_thread2, "thread2",
                   mm32_thread2_entry, RT_NULL,
                   &mm32_thread2_stack[0],
                   sizeof(mm32_thread2_stack),
                   MM32_THREAD_PRIORITY - 1,
                   MM32_THREAD_TIMESLICE);

    rt_thread_startup(&mm32_thread2);

    /* Set Idle Thread Hook */
    rt_thread_idle_sethook(mm32_cpu_usage_hook);

    return 0;
}
3. 结果验证
编译软件工程无误后,下载代码到芯片;在串口终端工具中我们可以看到当前两个LED灯闪烁线程对于CPU的利用率情况:
1.png
图2:运行结果


0
2020-9-24 17:57:22   评论 分享淘帖

只有小组成员才能发言,加入小组>>

1537个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

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