|
一、概述
CPU使用率其实就是你运行的程序占用的CPU资源,表示机器在某个时间点的运行程序的情况。
二、示例代码
文件路径:FreeRTOSConfig.h
- /********************************************************************
- FreeRTOS与运行时间和任务状态收集有关的配置选项
- **********************************************************************/
- //启用运行时间统计功能
- #define configGENERATE_RUN_TIME_STATS 1
-
- //启用可视化跟踪调试
- #define configUSE_TRACE_FACILITY 1
- /* 与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数
- * prvWriteNameToBuffer()
- * vTaskList(),
- * vTaskGetRunTimeStats()
- */
- #define configUSE_STATS_FORMATTING_FUNCTIONS 1
- extern volatile unsigned long long FreeRTOSRunTimeTicks;
- extern void ConfigureTimeForRunTimeStats(void);
- #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() ConfigureTimeForRunTimeStats()//定时器3提供时间统计的时基,频率为10K,即周期为100us
- #define portGET_RUN_TIME_COUNTER_VALUE() FreeRTOSRunTimeTicks //获取时间统计时间值
复制代码 新增加定时器3,中断频率为10000Hz,且TIM3_IRQHandler函数中对FreeRTOSRunTimeTicks自加。
- //FreeRTOS时间统计所用的节拍计数器
- volatile unsigned long long FreeRTOSRunTimeTicks;
- //初始化TIM3使其为FreeRTOS的时间统计提供时基
- void ConfigureTimeForRunTimeStats(void)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- FreeRTOSRunTimeTicks=0;
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); ///使能TIM3时钟
-
- TIM_TimeBaseInitStructure.TIM_Period = 100; //自动重装载值
- TIM_TimeBaseInitStructure.TIM_Prescaler= 84-1; //定时器分频
- TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
- TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
-
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //允许定时器3更新中断
- TIM_Cmd(TIM3,ENABLE); //使能定时器3
-
- NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x00; //子优先级0
- NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- //定时器3中断服务函数
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
- {
- FreeRTOSRunTimeTicks++;
- }
-
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志位
- }
复制代码 文件路径:main.c
- static void app_task1(void* pvParameters)
- {
- BaseType_t xReturn=pdFALSE;
- uint32_t i;
-
- for(;;)
- {
- i=0x1000000;
- while(i--);
- vTaskDelay(1000);
- }
- }
- static void app_task2(void* pvParameters)
- {
- BaseType_t xReturn=pdFALSE;
- uint32_t i;
- for(;;)
- {
- i=0x2000000;
- while(i--);
- vTaskDelay(3000);
- }
- }
- static void app_task3(void* pvParameters)
- {
- BaseType_t xReturn=pdFALSE;
-
- uint8_t cpu_run_info[400]; //保存任务运行时间信息
-
- for(;;)
- {
- memset(cpu_run_info,0,400); //信息缓冲区清零
-
- vTaskList((char *)&cpu_run_info); //获取任务运行时间信息
-
- printf("---------------------------------------------\r\n");
- printf("任务名 任务状态 优先级 剩余栈 任务序号\r\n");
- printf("%s", cpu_run_info);
- printf("---------------------------------------------\r\n");
-
- memset(cpu_run_info,0,400); //信息缓冲区清零
-
- vTaskGetRunTimeStats((char *)&cpu_run_info);
-
- printf("任务名 运行计数 使用率\r\n");
- printf("%s", cpu_run_info);
- printf("---------------------------------------------\r\n\n");
- vTaskDelay(1000); /* 延时1000个tick */
- }
- }
复制代码 演示
task.c
- #define tskRUNNING_CHAR ( 'X' )
- #define tskBLOCKED_CHAR ( 'B' )
- #define tskREADY_CHAR ( 'R' )
- #define tskDELETED_CHAR ( 'D' )
- #define tskSUSPENDED_CHAR ( 'S' )
复制代码 X—运行态
R—就绪态
B—阻塞态
S—挂起态
D—已删除
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|