diff --git a/components/freertos/Kconfig b/components/freertos/Kconfig index 1a037377c..16c7c4bc8 100644 --- a/components/freertos/Kconfig +++ b/components/freertos/Kconfig @@ -305,6 +305,14 @@ config FREERTOS_USE_STATS_FORMATTING_FUNCTIONS FreeRTOS. This will allow the usage of stats formatting functions such as vTaskList(). +config FREERTOS_VTASKLIST_INCLUDE_COREID + bool "Enable display of xCoreID in vTaskList" + depends on FREERTOS_USE_STATS_FORMATTING_FUNCTIONS + default n + help + If enabled, this will include an extra column when vTaskList is called + to display the CoreID the task is pinned to (0,1) or -1 if not pinned. + config FREERTOS_GENERATE_RUN_TIME_STATS bool "Enable FreeRTOS to collect run time stats" default n diff --git a/components/freertos/include/freertos/FreeRTOS.h b/components/freertos/include/freertos/FreeRTOS.h index 1bc931757..486d9c329 100644 --- a/components/freertos/include/freertos/FreeRTOS.h +++ b/components/freertos/include/freertos/FreeRTOS.h @@ -740,6 +740,10 @@ extern "C" { #define configUSE_STATS_FORMATTING_FUNCTIONS 0 #endif +#ifndef configTASKLIST_INCLUDE_COREID + #define configTASKLIST_INCLUDE_COREID 0 +#endif + #ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID() #endif diff --git a/components/freertos/include/freertos/FreeRTOSConfig.h b/components/freertos/include/freertos/FreeRTOSConfig.h index c52bc927c..f74b79d4e 100644 --- a/components/freertos/include/freertos/FreeRTOSConfig.h +++ b/components/freertos/include/freertos/FreeRTOSConfig.h @@ -211,6 +211,10 @@ int xt_clock_freq(void) __attribute__((deprecated)); #define configUSE_STATS_FORMATTING_FUNCTIONS 1 /* Used by vTaskList() */ #endif +#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID +#define configTASKLIST_INCLUDE_COREID 1 +#endif + #ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS #define configGENERATE_RUN_TIME_STATS 1 /* Used by vTaskGetRunTimeStats() */ #endif diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index ab605bb30..31df0bdd1 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -181,6 +181,9 @@ typedef struct xTASK_STATUS uint32_t ulRunTimeCounter; /*!< The total run time allocated to the task so far, as defined by the run time stats clock. See http://www.freertos.org/rtos-run-time-stats.html. Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */ StackType_t *pxStackBase; /*!< Points to the lowest address of the task's stack area. */ uint32_t usStackHighWaterMark; /*!< The minimum amount of stack space that has remained for the task since the task was created. The closer this value is to zero the closer the task has come to overflowing its stack. */ +#if configTASKLIST_INCLUDE_COREID + BaseType_t xCoreID; /*!< Core this task is pinned to. This field is present if CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID is set. */ +#endif } TaskStatus_t; /** diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index fe081975d..ac0b732a8 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -3785,6 +3785,10 @@ BaseType_t xTaskGetAffinity( TaskHandle_t xTask ) pxTaskStatusArray[ uxTask ].eCurrentState = eState; pxTaskStatusArray[ uxTask ].uxCurrentPriority = pxNextTCB->uxPriority; + #if ( configTASKLIST_INCLUDE_COREID == 1 ) + pxTaskStatusArray[ uxTask ].xCoreID = pxNextTCB->xCoreID; + #endif /* configTASKLIST_INCLUDE_COREID */ + #if ( INCLUDE_vTaskSuspend == 1 ) { /* If the task is in the suspended list then there is a chance @@ -4449,7 +4453,11 @@ For ESP32 FreeRTOS, vTaskExitCritical implements both portEXIT_CRITICAL and port pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName ); /* Write the rest of the string. */ +#if configTASKLIST_INCLUDE_COREID + sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\t%hd\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber, ( int ) pxTaskStatusArray[ x ].xCoreID ); +#else sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); +#endif pcWriteBuffer += strlen( pcWriteBuffer ); } diff --git a/docs/Doxyfile b/docs/Doxyfile index 643ae2e29..c898e9469 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -199,7 +199,8 @@ PREDEFINED = \ configUSE_RECURSIVE_MUTEXES=1 \ configTHREAD_LOCAL_STORAGE_DELETE_CALLBACKS=1 \ configNUM_THREAD_LOCAL_STORAGE_POINTERS=1 \ - configUSE_APPLICATION_TASK_TAG=1 + configUSE_APPLICATION_TASK_TAG=1 \ + configTASKLIST_INCLUDE_COREID=1 ## Do not complain about not having dot ## diff --git a/examples/system/console/main/cmd_system.c b/examples/system/console/main/cmd_system.c index b65645829..0d5c76fd7 100644 --- a/examples/system/console/main/cmd_system.c +++ b/examples/system/console/main/cmd_system.c @@ -94,7 +94,11 @@ static int tasks_info(int argc, char** argv) ESP_LOGE(__func__, "failed to allocate buffer for vTaskList output"); return 1; } - fputs("Task Name\tStatus\tPrio\tHWM\tTask Number\n", stdout); + fputs("Task Name\tStatus\tPrio\tHWM\tTask#", stdout); +#ifdef CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID + fputs("\tAffinity", stdout); +#endif + fputs("\n", stdout); vTaskList(task_list_buffer); fputs(task_list_buffer, stdout); free(task_list_buffer);