找回密码
 立即注册
查看: 217|回复: 3

FreeRTOS的cpu使用率

[复制链接]

2

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2022-9-8 12:46:24 | 显示全部楼层 |阅读模式
一、概述
CPU使用率其实就是你运行的程序占用的CPU资源,表示机器在某个时间点的运行程序的情况。



二、示例代码

文件路径:FreeRTOSConfig.h
  1. /********************************************************************
  2.           FreeRTOS与运行时间和任务状态收集有关的配置选项   
  3. **********************************************************************/
  4. //启用运行时间统计功能
  5. #define configGENERATE_RUN_TIME_STATS                1            

  6. //启用可视化跟踪调试
  7. #define configUSE_TRACE_FACILITY                        1   
  8. /* 与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
  9. * prvWriteNameToBuffer()
  10. * vTaskList(),
  11. * vTaskGetRunTimeStats()
  12. */
  13. #define configUSE_STATS_FORMATTING_FUNCTIONS        1     

  14. extern volatile unsigned long long FreeRTOSRunTimeTicks;   
  15. extern void ConfigureTimeForRunTimeStats(void);

  16. #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()   ConfigureTimeForRunTimeStats()//定时器3提供时间统计的时基,频率为10K,即周期为100us
  17. #define portGET_RUN_TIME_COUNTER_VALUE()                FreeRTOSRunTimeTicks              //获取时间统计时间值  
复制代码
新增加定时器3,中断频率为10000Hz,且TIM3_IRQHandler函数中对FreeRTOSRunTimeTicks自加。
  1. //FreeRTOS时间统计所用的节拍计数器
  2. volatile unsigned long long FreeRTOSRunTimeTicks;

  3. //初始化TIM3使其为FreeRTOS的时间统计提供时基
  4. void ConfigureTimeForRunTimeStats(void)
  5. {
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  7.         NVIC_InitTypeDef NVIC_InitStructure;
  8.        
  9.         FreeRTOSRunTimeTicks=0;
  10.        
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  ///使能TIM3时钟
  12.        
  13.         TIM_TimeBaseInitStructure.TIM_Period   = 100;                         //自动重装载值
  14.         TIM_TimeBaseInitStructure.TIM_Prescaler= 84-1;                  //定时器分频
  15.         TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
  16.         TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  17.        
  18.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
  19.        
  20.         TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
  21.         TIM_Cmd(TIM3,ENABLE); //使能定时器3
  22.        
  23.         NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
  24.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
  25.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //子优先级0
  26.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  27.         NVIC_Init(&NVIC_InitStructure);
  28. }

  29. //定时器3中断服务函数
  30. void TIM3_IRQHandler(void)
  31. {
  32.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
  33.         {
  34.                 FreeRTOSRunTimeTicks++;
  35.         }
  36.        
  37.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
  38. }
复制代码
文件路径:main.c
  1. static void app_task1(void* pvParameters)
  2. {
  3.         BaseType_t xReturn=pdFALSE;
  4.         uint32_t i;
  5.        
  6.         for(;;)
  7.         {
  8.                 i=0x1000000;
  9.                 while(i--);
  10.                 vTaskDelay(1000);
  11.         }
  12. }   

  13. static void app_task2(void* pvParameters)
  14. {
  15.         BaseType_t xReturn=pdFALSE;       
  16.         uint32_t i;

  17.         for(;;)
  18.         {
  19.                 i=0x2000000;
  20.                 while(i--);
  21.                 vTaskDelay(3000);
  22.         }
  23. }

  24. static void app_task3(void* pvParameters)
  25. {
  26.         BaseType_t xReturn=pdFALSE;       
  27.        
  28.         uint8_t cpu_run_info[400];                //保存任务运行时间信息
  29.        
  30.         for(;;)
  31.         {
  32.                 memset(cpu_run_info,0,400);        //信息缓冲区清零
  33.                
  34.                 vTaskList((char *)&cpu_run_info);  //获取任务运行时间信息
  35.                
  36.                 printf("---------------------------------------------\r\n");
  37.                 printf("任务名      任务状态 优先级   剩余栈 任务序号\r\n");
  38.                 printf("%s", cpu_run_info);
  39.                 printf("---------------------------------------------\r\n");
  40.                
  41.                 memset(cpu_run_info,0,400);        //信息缓冲区清零
  42.                
  43.                 vTaskGetRunTimeStats((char *)&cpu_run_info);
  44.                
  45.                 printf("任务名       运行计数         使用率\r\n");
  46.                 printf("%s", cpu_run_info);
  47.                 printf("---------------------------------------------\r\n\n");
  48.                 vTaskDelay(1000);   /* 延时1000个tick */       
  49.         }
  50. }
复制代码
演示


task.c


  1. #define tskRUNNING_CHAR        ( 'X' )
  2. #define tskBLOCKED_CHAR        ( 'B' )
  3. #define tskREADY_CHAR        ( 'R' )
  4. #define tskDELETED_CHAR        ( 'D' )
  5. #define tskSUSPENDED_CHAR        ( 'S' )
复制代码
X—运行态
R—就绪态
B—阻塞态
S—挂起态
D—已删除






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

2

主题

17

回帖

85

积分

注册会员

积分
85
发表于 2022-9-8 17:09:17 | 显示全部楼层
多谢温工提供FreeRTOS技术资料
回复

使用道具 举报

0

主题

1

回帖

6

积分

新手上路

积分
6
发表于 2022-9-8 18:31:56 来自手机 | 显示全部楼层
谢谢温工
回复

使用道具 举报

1

主题

12

回帖

37

积分

新手上路

积分
37
发表于 2022-9-9 13:55:43 | 显示全部楼层

谢谢温工
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|粤嵌技术交流空间

GMT+8, 2025-7-7 22:31 , Processed in 0.733705 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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