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

发布者:码上奇迹最新更新时间:2016-09-02 来源: eefocus关键字:FreeRTOS  CPU  使用率 手机看文章 扫描二维码
随时随地手机看文章
1、前言

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


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

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

1

本文将以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文件添加到工程,并在工程中添加对应头文件目录:

2

第二步:打开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"                   //添加包含此头文件
//…

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

3

第六步:在工程中任何用户代码处都可以调用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的值:

4

osCPU_Usage是在cpu_utils.c文件中定义的全局变量,表示当前CPU的使用率,是个动态值,由上图可以,CPU使用率的动态值为20%。实际在代码中是按第六步中调用osGetCPUUsage()函数来获取当前CPU的使用率的。

至此,算法使用方法介绍完毕。

3 、算法实现原理分析
操作系统运行时是不断在不同的任务间进行切换,而驱动这一调度过程是通过系统tick来驱动的,即每产生一次系统tick则检查一下当前正在运行的任务的环境判断是否需要切换任务,即调度,如果需要,则触发PendSV,通过在PendSV中断调用vTaskSwitchContext()函数来实现任务的调度。而本文所要讲述的CPU使用率算法是通过在一定时间内(1000个时间片内),计算空闲任务所占用的时间片总量,100减去空闲任务所占百分比则为工作任务所占百分比,即CPU使用率。
void vApplicationIdleHook(void)
{
  if( xIdleHandle == NULL )
  {
    /* Store the handle tothe idle task. */
    xIdleHandle =xTaskGetCurrentTaskHandle(); //记录空闲任务的句柄
  }
}
此函数为空闲任务钩子函数,每次当切换到空闲任务时就会运行此钩子函数,它的作用就是记录当前空闲任务的句柄并保存到全局变量xIdleHandle。
void vApplicationTickHook (void)
{
  static int tick = 0;

  if(tick ++ >CALCULATION_PERIOD)  //每1000个tick,刷新一次CPU使用率  
  {
    tick = 0;
  
    if(osCPU_TotalIdleTime> 1000)
    {
      osCPU_TotalIdleTime =1000;
    }
    osCPU_Usage = (100 -(osCPU_TotalIdleTime * 100) / CALCULATION_PERIOD); //这行代码就是CPU使用率的具体计算方法了
    osCPU_TotalIdleTime =0;
  }
}
此函数为操作系统的tick钩子函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示在1000个tick时间内空闲任务总共占用的时间片,CALCULATION_PERIOD宏的值为1000,即每1000个tick时间内重新计算一次CPU的使用率。

下面两个函数就是如何计算osCPU_TotalIdleTime的:
void StartIdleMonitor(void)
{
  if( xTaskGetCurrentTaskHandle() ==xIdleHandle ) //如果是切入到空闲任务
  {
    osCPU_IdleStartTime =xTaskGetTickCountFromISR();//记录切入到空闲任务的时间点
  }
}

void EndIdleMonitor(void)
{
  if( xTaskGetCurrentTaskHandle() ==xIdleHandle ) //如果是从空闲任务切出
  {
    /* Store the handle to the idle task. */
    osCPU_IdleSpentTime =xTaskGetTickCountFromISR() - osCPU_IdleStartTime; //计算此次空闲任务花费多长时间
    osCPU_TotalIdleTime += osCPU_IdleSpentTime;//空闲任务所占时间进行累加
  }
}
这两个函数是调度器钩子函数,在调度器进行任务切进和切出时分别回调,StartIdleMonitor()函数记录切换到空闲任务时的时间点,EndIdleMonitor()则在推出空闲任务时计算此次空闲任务花费多长时间,并累加到osCPU_TotalIdleTime,即空闲任务总共占用的时间片。
uint16_t osGetCPUUsage(void)
{
  return (uint16_t)osCPU_Usage;         //直接返回全局变量osCPU_Usage,即CPU使用率
}
全局变量osCPU_Usage保存的就是CPU的使用率,它是在操作系统的tick钩子函数中每隔1000个tick就被重新计算一次。


4 结论
通过此方法可以用来评估STM23 MCU的运行性能。

 

关键字:FreeRTOS  CPU  使用率 引用地址:一种基于FreeRTOS的CPU使用率测算方法及原理介绍

上一篇:MCU功能严重异常的几个常见原因
下一篇:STM8 CAN总线的IdMask模式的讲解

推荐阅读最新更新时间:2024-03-16 15:07

多核嵌入式微处理器前景光明
2007年10月13日报道,根据美国投资开发公司(VDC)的分析,在嵌入式应用领域,到2011年来自多核微处理器的收入将比2007年多6倍,是2006年收入的44倍。 VDC公司的白皮书预测,2007年嵌入式多核中央处理(CPU)的年收入为3.721亿美元,2009年将达到13.3亿美元。这预示着嵌入式CPU年收入增长将从2006年的0.507亿美元增长到2011年的22.3亿美元。 据VDC分析,单核处理器和性能受摩尔定律限制,采用简单通过增加时钟频率增加处理性能的做法将要达到上限。 VDC公司在题为《嵌入式应用领域的多核计算》的报告中还预测,存在于多核微处理器硬件和软件之间的主要问题是利用好新架构的优点。
[焦点新闻]
中国新超算彻底告别进口CPU 国产芯片已可与国外抗衡
  日前, 飞腾 已经完成FT-2000plus服务器 CPU 的研制工作, 飞腾 公司的合作伙伴正在积极研发相应的整机产品。FT-2000plus这款芯片是以FT2000为基础的改进版本,虽然在单核性能上和Intel还存在一定差距,但在多核性能上,已经达到Intel服务器 CPU  E5 主流产品的水平。下面就随嵌入式小编一起来了解一下相关内容吧   据传,国防科大正在研发的1000P超算天河3号(性能指标是神威太湖之光的8倍),其原型机的 CPU 或将采用FT-2000或其后继产品作为主控CPU。考虑到在天河2A上,国防科大已经用自主研发的加速器矩阵2000取代Intel的Xeon Phi计算卡。从今往后,天河系列超算也将和
[嵌入式]
无线路由器硬件细节解密
说到路由器的硬件,很多人可能会说,我就是要买个路由器而已,又不是造个路由器,知道这么多细节又能做啥? 这种想法,其实......也对。路由器其实跟我们常用的电脑或者手机类似,内部也包含了CPU、内存、硬盘等等对应的配置,这些硬件能力越强,想必路由器的性能也就越强悍。但当你在购物网站打开某款路由器的介绍时,会发现大多数厂家的各种牛逼闪闪的亮点宣传,其实都是顾左右而言它,就是不想告诉你这玩意儿内部到底配了啥。反正绝大多数人对此也没有太多要求。 如果优秀的你想要详细了解一款路由器的肚子里到底有多少货,做工到底扎不扎实,就只能去看拆机视频了。到了这一步,事先了解下路由器的硬件组成和作用就是有必要的了。好,那我们这就开始。 CP
[嵌入式]
无线路由器硬件细节解密
stm32串口占用时间、消耗CPU及最大中断时间的深度分析,探寻一种更有效的串口发送方式
1、stm32串口发送占用的时间 答:做嵌入式以来,一直自认为在两个MCU之间的串口通信很占用时间,让我感觉很是不爽。经过一番查找资料后发现并没有我想象的那么糟糕。 串口发送数据: 发送数据在软件层面来看是按照字节来发送的。USARTx- DR = (Data & (uint16_t)0x01FF);CPU只需要把一个字节的数据填充到DR寄存器中就可以了,然后具体的发送过程是由硬件来完成,单字节的发送过程中不消耗CPU。但是为什么我们使用串口来发送连续的数据时为什么还是感觉到这么慢,而且连续发送的过程中CPU不能去做其他任务呢?究其原因是因为我们为保证数据发送的完整性在发送过程中加入了while(USART_GetFlagSt
[单片机]
stm32串口占用时间、消耗<font color='red'>CPU</font>及最大中断时间的深度分析,探寻一种更有效的串口发送方式
CPU/显卡品牌偏好调查显示AMD超过60% 未来比例或继续上升
欧洲硬件协会最近发布了一项针对 CPU /显卡品牌偏好的硬件调查结果,显示有超过60%的被调查者首选 AMD 的CPU,而在去年,这个数字还是40%。 该调查每半年进行一次,调查数据还是具有相当的现实意义的,从下面的统计图中可以看到,在今年下半年的调查结果中,将AMD的CPU作为自己首选的被调查者占比已经超过了60%,而在去年上半年的时候,这个数字也就刚过40%而已,甚至比2017上半年还要低一些。 Zen+架构处理器的降价和今年Zen 2处理器的优秀表现应该是推动用户选择AMD CPU的主要因素,尤其是后者,它的游戏表现已经非常不错了,同时它能够在多线程负载下面提供更好的性能表现。AMD CPU的表现确确实实的征服了更多的
[半导体设计/制造]
<font color='red'>CPU</font>/显卡品牌偏好调查显示AMD超过60% 未来比例或继续上升
国产CPU有望统一架构龙芯MIPS可能胜出
    国产CPU发展数年之后,可能会迎来一次影响未来发展方向的最大调整。   据著名电子技术类网站EE Times报道,今年3月,工信部召集相关企业和学术机构,召开了名为“中国国家指令集架构计划”的一次会议。会议目的是商讨为国产CPU打造一个统一的指令集架构,即统一的CPU架构标准(ISA)。   多位知情人士向新浪科技证实了这一计划,但透露该计划正在推进之中,目前没有具体结果。   国产CPU处境尴尬   指令集架构是CPU的核心部分,是CPU实现任务处理的关键所在,很多软件都是在此基础上进行开发。   目前在PC芯片领域,英特尔X86架构近乎垄断了整个市场。在最热的移动芯片市场,英国ARM厂商的ARM架构也占据了超过80%的市
[手机便携]
蒋尚义:中国半导体“痛点” 自主CPU对国安太重要!
台积电研发“一把手”蒋尚义虽已经淡出半导体圈,多半时间在美深居简出,但论起他的辈分,华人半导体圈都知道,台积电除了张忠谋,人称“蒋爸”的蒋尚义在台积电 “一言九鼎”, 相当于“第二号人物”,率领七千研发大军,许多关键技术决策靠他“拍板”说了算。日前,他接受DIGITIMES独家访问,畅谈摩尔定律未来看法,以及,对中国半导体行业的观察和建言。 蒋尚义估计,摩尔定律未来很可能仅剩十年左右的寿命。目前看来,工艺发展到3纳米已逼近极限,再往下延伸,除非有重大研发创新问世,才能让摩尔定律“山穷水尽疑无路,柳暗花明又一村”。 经常来到中国,他也特别关注中国半导体行业的发展。他说,正因摩尔定律步伐慢下来,会带给国内发展半导体业一个很好的
[半导体设计/制造]
Thunderbolt技术集成到CPU 苹果很兴奋!
从2011年开始,Intel都在推广Thunderbolt雷电接口,但到目前来看效果并不怎么样,不过苹果倒是很愿意配合,去年发布的新MBP直接换上了四个USB-C接口(兼容Thunderbolt 3雷电接口)。下面就随嵌入式小编一起来了解一下相关内容吧。 为了让更多的厂商跟进Thunderbolt,Intel对外宣布今后将在CPU上集成雷电3的主控(并未透露在哪一代CPU中集成,应该会是酷睿8代),也就是说主板上不在需要额外的芯片即可支持该功能,降低成本的同时,他们还表示免费的技术授权。 Thunderbolt技术集成到CPU 苹果很兴奋! 这样的举动,让苹果很是兴奋,除了省去一大笔开销外,还能让用户停止无谓的吐槽,因为
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved