diff --git a/components/esp_gdbstub/src/gdbstub.c b/components/esp_gdbstub/src/gdbstub.c index 67386c566..d4e8c9380 100644 --- a/components/esp_gdbstub/src/gdbstub.c +++ b/components/esp_gdbstub/src/gdbstub.c @@ -22,6 +22,7 @@ static void init_task_info(void); static void find_paniced_task_index(void); static int handle_task_commands(unsigned char *cmd, int len); +static void esp_gdbstub_send_str_as_hex(const char *str); #endif static void send_reason(void); @@ -89,6 +90,7 @@ static uint32_t gdbstub_hton(uint32_t i) return __builtin_bswap32(i); } +#ifdef CONFIG_ESP_GDBSTUB_SUPPORT_TASKS static void esp_gdbstub_send_str_as_hex(const char *str) { while (*str) { @@ -96,6 +98,8 @@ static void esp_gdbstub_send_str_as_hex(const char *str) str++; } } +#endif + /** Send all registers to gdb */ static void handle_g_command(const unsigned char* cmd, int len) { @@ -188,6 +192,11 @@ static eTaskState get_task_state(size_t index) return s_scratch.tasks[index].eState; } +static int get_task_cpu_id(size_t index) +{ + return s_scratch.tasks[index].xCpuId; +} + /** Get the index of the task running on the current CPU, and save the result */ static void find_paniced_task_index(void) { @@ -306,7 +315,9 @@ static void handle_qThreadExtraInfo_command(const unsigned char* cmd, int len) eTaskState state = get_task_state(task_index); switch (state) { case eRunning: - esp_gdbstub_send_str_as_hex("State: Running"); + esp_gdbstub_send_str_as_hex("State: Running "); + esp_gdbstub_send_str_as_hex("@CPU"); + esp_gdbstub_send_hex(get_task_cpu_id(task_index) + '0', 8); break; case eReady: esp_gdbstub_send_str_as_hex("State: Ready"); diff --git a/components/freertos/include/freertos/task.h b/components/freertos/include/freertos/task.h index 7957d3b03..46863304a 100644 --- a/components/freertos/include/freertos/task.h +++ b/components/freertos/include/freertos/task.h @@ -200,6 +200,7 @@ typedef struct xTASK_SNAPSHOT StackType_t *pxEndOfStack; /*!< Points to the end of the stack. pxTopOfStack < pxEndOfStack, stack grows hi2lo pxTopOfStack > pxEndOfStack, stack grows lo2hi*/ eTaskState eState; /*!< Current state of the task. Can be running or suspended */ + BaseType_t xCpuId; /*!< CPU where this task was running */ } TaskSnapshot_t; /** diff --git a/components/freertos/tasks.c b/components/freertos/tasks.c index d09e36e56..210b6595a 100644 --- a/components/freertos/tasks.c +++ b/components/freertos/tasks.c @@ -5058,6 +5058,25 @@ TickType_t uxReturn; pxTaskSnapshotArray[ *uxTask ].pxTCB = pxTCB; pxTaskSnapshotArray[ *uxTask ].pxTopOfStack = (StackType_t *)pxTCB->pxTopOfStack; pxTaskSnapshotArray[ *uxTask ].eState = eTaskGetState(pxTCB); + + if(pxTaskSnapshotArray[ *uxTask ].eState == eRunning) + { + BaseType_t xCoreId = xPortGetCoreID(); + /* task is running, let's find in which core it is located */ + if(pxTCB == pxCurrentTCB[xCoreId]) + { + pxTaskSnapshotArray[ *uxTask ].xCpuId = xCoreId; + } + else + { + pxTaskSnapshotArray[ *uxTask ].xCpuId = !xCoreId; + } + } + else + { + pxTaskSnapshotArray[ *uxTask ].xCpuId = -1; + } + #if( portSTACK_GROWTH < 0 ) { pxTaskSnapshotArray[ *uxTask ].pxEndOfStack = pxTCB->pxEndOfStack;