ESP-IDF的线程栈大小与CPU利用率的查看

·分析

由于ESP-IDF开发是使用FreeRTOS轻量级操作系统,有时候我们并不知道创建指定核心上的任务时分配的栈大小需要多少合适。

分配栈过小会触发看门狗一直复位,如果分配过大则又导致资源的浪费。这时就需查看任务线程栈的大小了。

·代码

代码:

 1
2
void CPU_Task(void *arg) 3 { 4 /* 5 vTaskGetRunTimeStats() 使用 6 注意: 7 使用 vTaskGetRunTimeStats() 前需使能: 8 make menuconfig -> Component config -> FreeRTOS -> configUSE_TRACE_FACILITY 9 make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility -> configUSE_STATS_FORMATTING_FUNCTIONS 10 make menuconfig -> Component config -> FreeRTOS -> Enable display of xCorelD in vlaskList 11 make menuconfig -> Component config -> FreeRTOS -> configGENERATE_RUN_TIME_STATS 12 通过上面配置,等同于使能 FreeRTOSConfig.h 中如下三个宏: 13 configGENERATE_RUN_TIME_STATS,configUSE_STATS_FORMATTING_FUNCTIONS 和 configSUPPORT_DYNAMIC_ALLOCATION 14 */ 15 16 uint8_t CPU_RunInfo[400]; //保存任务运行时间信息 17 18 while (1) 19 { 20 memset(CPU_RunInfo, 0, 400); /* 信息缓冲区清零 */ 21 22 vTaskList((char *)&CPU_RunInfo); //获取任务运行时间信息 23 24 printf("----------------------------------------------------\r\n"); 25 printf("task_name task_status priority stack task_id\r\n"); 26 printf("%s", CPU_RunInfo); 27 printf("----------------------------------------------------\r\n"); 28 29 memset(CPU_RunInfo, 0, 400); /* 信息缓冲区清零 */ 30 31 vTaskGetRunTimeStats((char *)&CPU_RunInfo); 32 33 printf("task_name run_cnt usage_rate \r\n"); 34 printf("%s", CPU_RunInfo); 35 printf("----------------------------------------------------\r\n"); 36 37 vTaskDelay(500 / portTICK_PERIOD_MS); 38 } 39 }

 

PS:如果编译 vTaskGetRunTimeStats()和vTaskList() 没有定义,那需要进入SDK Configuration Editor (menuconfig)里面打开

  ①configUSE_TRACE_FACILITY

  ②configUSE_STATS_FORMATTING_FUNCTIONS

  ③Enable display of xCorelD in vlaskList

  ④configGENERATE_RUN_TIME_STATS

 

 

·结果

串口打印结果:

 

posted @ 2022-09-19 19:14  ArsSama  阅读(1196)  评论(0编辑  收藏  举报