硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7522|回复: 12
收起左侧

[FreeRTOS] ST做的一个FreeRTOS的CPU利用率统计方法

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
发表于 2018-1-20 15:46:27 | 显示全部楼层 |阅读模式
仅需下面两个文件即可:
cpu_utils.c (5 KB, 下载次数: 271)
cpu_utils.h (2.92 KB, 下载次数: 257)
使用方法:
  1. 1- in the _OS_Config.h file (ex. FreeRTOSConfig.h) enable the following macros :
  2.       - #define configUSE_IDLE_HOOK        1
  3.       - #define configUSE_TICK_HOOK        1

  4. 2- in the _OS_Config.h define the following macros :
  5.       - #define traceTASK_SWITCHED_IN()  extern void StartIdleMonitor(void); \
  6.                                          StartIdleMonitor()
  7.       - #define traceTASK_SWITCHED_OUT() extern void EndIdleMonitor(void); \
  8.                                          EndIdleMonitor()
复制代码

代码:
cpu_utils.c
  1. /**
  2.   ******************************************************************************
  3.   * @file    cpu_utils.c
  4.   * @author  MCD Application Team
  5.   * @version V1.1.0
  6.   * @date    20-November-2014
  7.   * @brief   Utilities for CPU Load calculation
  8.   ******************************************************************************
  9.   * @attention
  10.   *
  11.   * <h2><center>&#169; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
  12.   *
  13.   * Redistribution and use in source and binary forms, with or without modification,
  14.   * are permitted provided that the following conditions are met:
  15.   *   1. Redistributions of source code must retain the above copyright notice,
  16.   *      this list of conditions and the following disclaimer.
  17.   *   2. Redistributions in binary form must reproduce the above copyright notice,
  18.   *      this list of conditions and the following disclaimer in the documentation
  19.   *      and/or other materials provided with the distribution.
  20.   *   3. Neither the name of STMicroelectronics nor the names of its contributors
  21.   *      may be used to endorse or promote products derived from this software
  22.   *      without specific prior written permission.
  23.   *
  24.   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  25.   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  27.   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  28.   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  30.   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  31.   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  32.   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  33.   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  34.   *
  35.   ******************************************************************************
  36.   */

  37. /********************** NOTES **********************************************
  38. To use this module, the following steps should be followed :

  39. 1- in the _OS_Config.h file (ex. FreeRTOSConfig.h) enable the following macros :
  40.       - #define configUSE_IDLE_HOOK        1
  41.       - #define configUSE_TICK_HOOK        1

  42. 2- in the _OS_Config.h define the following macros :
  43.       - #define traceTASK_SWITCHED_IN()  extern void StartIdleMonitor(void); \
  44.                                          StartIdleMonitor()
  45.       - #define traceTASK_SWITCHED_OUT() extern void EndIdleMonitor(void); \
  46.                                          EndIdleMonitor()
  47. *******************************************************************************/


  48. /* Includes ------------------------------------------------------------------*/
  49. #include "cpu_utils.h"

  50. /* Private typedef -----------------------------------------------------------*/
  51. /* Private define ------------------------------------------------------------*/
  52. /* Private macro -------------------------------------------------------------*/
  53. /* Private function prototypes -----------------------------------------------*/
  54. /* Private variables ---------------------------------------------------------*/

  55. xTaskHandle    xIdleHandle = NULL;
  56. __IO uint32_t  osCPU_Usage = 0;
  57. uint32_t       osCPU_IdleStartTime = 0;
  58. uint32_t       osCPU_IdleSpentTime = 0;
  59. uint32_t       osCPU_TotalIdleTime = 0;

  60. /* Private functions ---------------------------------------------------------*/
  61. /**
  62.   * @brief  Application Idle Hook
  63.   * @param  None
  64.   * @retval None
  65.   */
  66. void vApplicationIdleHook(void)
  67. {
  68.   if( xIdleHandle == NULL )
  69.   {
  70.     /* Store the handle to the idle task. */
  71.     xIdleHandle = xTaskGetCurrentTaskHandle();
  72.   }
  73. }

  74. /**
  75.   * @brief  Application Idle Hook
  76.   * @param  None
  77.   * @retval None
  78.   */
  79. void vApplicationTickHook (void)
  80. {
  81.   static int tick = 0;
  82.   
  83.   if(tick ++ > CALCULATION_PERIOD)
  84.   {
  85.     tick = 0;
  86.    
  87.     if(osCPU_TotalIdleTime > 1000)
  88.     {
  89.       osCPU_TotalIdleTime = 1000;
  90.     }
  91.     osCPU_Usage = (100 - (osCPU_TotalIdleTime * 100) / CALCULATION_PERIOD);
  92.     osCPU_TotalIdleTime = 0;
  93.   }
  94. }

  95. /**
  96.   * @brief  Start Idle monitor
  97.   * @param  None
  98.   * @retval None
  99.   */
  100. void StartIdleMonitor (void)
  101. {
  102.   if( xTaskGetCurrentTaskHandle() == xIdleHandle )
  103.   {
  104.     osCPU_IdleStartTime = xTaskGetTickCountFromISR();
  105.   }
  106. }

  107. /**
  108.   * @brief  Stop Idle monitor
  109.   * @param  None
  110.   * @retval None
  111.   */
  112. void EndIdleMonitor (void)
  113. {
  114.   if( xTaskGetCurrentTaskHandle() == xIdleHandle )
  115.   {
  116.     /* Store the handle to the idle task. */
  117.     osCPU_IdleSpentTime = xTaskGetTickCountFromISR() - osCPU_IdleStartTime;
  118.     osCPU_TotalIdleTime += osCPU_IdleSpentTime;
  119.   }
  120. }

  121. /**
  122.   * @brief  Stop Idle monitor
  123.   * @param  None
  124.   * @retval None
  125.   */
  126. uint16_t osGetCPUUsage (void)
  127. {
  128.   return (uint16_t)osCPU_Usage;
  129. }


  130. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
复制代码


回复

使用道具 举报

5

主题

33

回帖

92

积分

初级会员

积分
92
发表于 2018-1-21 09:26:03 | 显示全部楼层
实现起来还是很简单的。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-1-22 09:10:57 | 显示全部楼层
不错,正是我需要的。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

7

主题

69

回帖

90

积分

初级会员

积分
90
发表于 2018-1-22 09:33:54 | 显示全部楼层
改成rtx能用的
回复

使用道具 举报

10

主题

45

回帖

75

积分

初级会员

积分
75
发表于 2018-1-26 14:25:03 | 显示全部楼层
请问一下,这函数osGetCPUUsage()是不是在每个任务上调用,打印出来显示CPU利用率
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
 楼主| 发表于 2018-1-26 14:28:13 | 显示全部楼层
0520kuang 发表于 2018-1-26 14:25
请问一下,这函数osGetCPUUsage()是不是在每个任务上调用,打印出来显示CPU利用率

不用,任意一个任务都可以调用,获取的结果就是CPU利用率。
回复

使用道具 举报

4

主题

9

回帖

21

积分

新手上路

积分
21
发表于 2019-10-8 17:41:19 | 显示全部楼层
不受FreeRTOS管理的中断是不是测量不到?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
 楼主| 发表于 2019-10-9 00:25:37 | 显示全部楼层
eemwin 发表于 2019-10-8 17:41
不受FreeRTOS管理的中断是不是测量不到?

他这个统计的是1000个滴答时钟周期内,空闲任务执行的滴答周期个数,所以都统计了。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2020-11-26 16:56:24 | 显示全部楼层
eric2013 发表于 2019-10-9 00:25
他这个统计的是1000个滴答时钟周期内,空闲任务执行的滴答周期个数,所以都统计了。

如果空闲任务中发生中断,那这个中断时间会被统计 认为是空闲任务吧,所以不受FreeRTOS管理的中断应该是测不到
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
 楼主| 发表于 2020-11-27 01:59:26 | 显示全部楼层
yuche 发表于 2020-11-26 16:56
如果空闲任务中发生中断,那这个中断时间会被统计 认为是空闲任务吧,所以不受FreeRTOS管理的中断应该是 ...

这么理解的话,是的。

这种情况下,受不受FreeRTOS管理,没有进行任务切换,都无法正常统计,都会被统计到空闲里。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-12-1 14:38:53 | 显示全部楼层
eric2013 发表于 2020-11-27 01:59
这么理解的话,是的。

这种情况下,受不受FreeRTOS管理,没有进行任务切换,都无法正常统计,都会被统 ...

都是几年前的帖子了,现在统一了cmosis了,应该有统一的函数了吧?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106721
QQ
 楼主| 发表于 2020-12-1 16:51:49 | 显示全部楼层
caicaptain2 发表于 2020-12-1 14:38
都是几年前的帖子了,现在统一了cmosis了,应该有统一的函数了吧?

CMSIS-RTOS封装了下,这个机制还是没变。
回复

使用道具 举报

1

主题

13

回帖

16

积分

新手上路

积分
16
发表于 2024-2-22 17:14:53 | 显示全部楼层
添加进工程  CPU利用率显示波动很大
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-1 05:16 , Processed in 0.331224 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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