一种基于FreeRTOS的CPU使用率测算方法及原理介绍

一种基于FreeRTOS的CPU使用率测算方法及原理介绍,第1张

一种基于FreeRTOS的CPU使用率测算方法及原理介绍, 一种基于FreeRTOS的CPU使用率测算方法及原理介绍,第2张

1、前言
出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。


2、移植算法
2.1 算法简介
此算法是基于 *** 作系统的,理论上不限于任何 *** 作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。

本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示:

一种基于FreeRTOS的CPU使用率测算方法及原理介绍,1,第3张

本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。

2.2 、开始移植
本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0\Projects\STM324xG_EVAL\ApplicaTIons\FreeRTOS\FreeRTOS_ThreadCreaTIon为例,IDE使用IAR。

第一步:
使用IAR打开FreeRTOS_ThreadCreaTIon工程,将cpu_uTIls.c文件添加到工程,并在工程中添加对应头文件目录:

一种基于FreeRTOS的CPU使用率测算方法及原理介绍,2,第4张

第二步:打开FreeRTOST的配置头文件FreeRTOSConfig.h修改宏configUSE_IDLE_HOOK和configUSE_TICK_HOOK的值为1:

#defineconfigUSE_PREEMPTION                   1
#defineconfigUSE_IDLE_HOOK                    1            //修改此宏的值为1
#defineconfigUSE_TICK_HOOK                    1            //修改此宏的值为1
#defineconfigCPU_CLOCK_HZ              (SystemCoreClock )
#defineconfigTICK_RATE_HZ              ( (TickType_t ) 1000 )
#define configMAX_PRIORITIES                   (  8 )
#define configMINIMAL_STACK_SIZE        (( uint16_t ) 128 )

第三步:继续在FreeRTOSConfig.h头文件的末尾处添加traceTASK_SWITCHED_IN与traceTASK_SWITCHED_OUT定义:

#definetraceTASK_SWITCHED_IN()  extern voidStartIdleMonitor(void); \
                                 StartIdleMonitor()
#define traceTASK_SWITCHED_OUT() extern voidEndIdleMonitor(void); \
                                EndIdleMonitor()

第四步:在main.h头文件中include“”cmsis_os.h“”
Main.h :

#include "stm32f4xx_hal.h"
#include "stm324xg_eval.h"
#include "cmsis_os.h"                   //添加包含此头文件
//…

第五步:修改工程属性,使编译过程不需要函数原型:

一种基于FreeRTOS的CPU使用率测算方法及原理介绍,3,第5张

第六步:在工程中任何用户代码处都可以调用osGetCPUUsage()函数来获取当前CPU的使用率:
static void LED_Thread2(void const *argument)
{
  uint32_t count;
  uint16_t usage =0;
  (void) argument;

  for(;;)
  {
    count =osKernelSysTick() + 10000;
  
    /* Toggle LED2 every500 ms for 10 s */
    while (count >=osKernelSysTick())
    {
      BSP_LED_Toggle(LED2);
    
      osDelay(500);
    }
    usage =osGetCPUUsage();                    //获取当前CPU的使用率
    /* Turn off LED2 */
    BSP_LED_Off(LED2);
  
    /* Resume Thread 1 */
   osThreadResume(LEDThread1Handle);
  
    /* Suspend Thread 2 */
   osThreadSuspend(NULL);
  }
}
第七步:编译并运行测试
在调试状态下使用Live Watch窗口监控全部变量osCPU_Usage的值:

一种基于FreeRTOS的CPU使用率测算方法及原理介绍,4,第6张

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2587989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-08
下一篇 2022-08-08

发表评论

登录后才能评论

评论列表(0条)

保存