Merge branch 'feature/gdb_stub_task_state' into 'master'
feature/gdb_stub: make task state available on info thread command when in gdb stub. Closes IDF-720 See merge request espressif/esp-idf!8371
This commit is contained in:
@@ -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);
|
||||
@@ -76,7 +77,6 @@ void esp_gdbstub_panic_handler(esp_gdbstub_frame_t *frame)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void send_reason(void)
|
||||
{
|
||||
esp_gdbstub_send_start();
|
||||
@@ -90,6 +90,16 @@ 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) {
|
||||
esp_gdbstub_send_hex(*str, 8);
|
||||
str++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/** Send all registers to gdb */
|
||||
static void handle_g_command(const unsigned char* cmd, int len)
|
||||
{
|
||||
@@ -177,6 +187,16 @@ static bool get_task_handle(size_t index, TaskHandle_t *handle)
|
||||
return true;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -288,12 +308,34 @@ static void handle_qThreadExtraInfo_command(const unsigned char* cmd, int len)
|
||||
return;
|
||||
}
|
||||
esp_gdbstub_send_start();
|
||||
const char* task_name = pcTaskGetTaskName(handle);
|
||||
while (*task_name) {
|
||||
esp_gdbstub_send_hex(*task_name, 8);
|
||||
task_name++;
|
||||
esp_gdbstub_send_str_as_hex("Name: ");
|
||||
esp_gdbstub_send_str_as_hex(pcTaskGetTaskName(handle));
|
||||
esp_gdbstub_send_hex(' ', 8);
|
||||
|
||||
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("@CPU");
|
||||
esp_gdbstub_send_hex(get_task_cpu_id(task_index) + '0', 8);
|
||||
break;
|
||||
case eReady:
|
||||
esp_gdbstub_send_str_as_hex("State: Ready");
|
||||
break;
|
||||
case eBlocked:
|
||||
esp_gdbstub_send_str_as_hex("State: Blocked");
|
||||
break;
|
||||
case eSuspended:
|
||||
esp_gdbstub_send_str_as_hex("State: Suspended");
|
||||
break;
|
||||
case eDeleted:
|
||||
esp_gdbstub_send_str_as_hex("State: Deleted");
|
||||
break;
|
||||
default:
|
||||
esp_gdbstub_send_str_as_hex("State: Invalid");
|
||||
break;
|
||||
}
|
||||
/** TODO: add "Running" or "Suspended" and "CPU0" or "CPU1" */
|
||||
|
||||
esp_gdbstub_send_end();
|
||||
}
|
||||
|
||||
|
||||
@@ -199,6 +199,8 @@ typedef struct xTASK_SNAPSHOT
|
||||
StackType_t *pxTopOfStack; /*!< Points to the location of the last item placed on the tasks stack. */
|
||||
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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -5057,6 +5057,26 @@ 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;
|
||||
|
||||
@@ -27,6 +27,9 @@ TEST_CASE("Tasks snapshot", "[freertos]")
|
||||
esp_cpu_stall(other_core_id);
|
||||
#endif
|
||||
UBaseType_t task_num = uxTaskGetSnapshotAll(tasks, TEST_MAX_TASKS_NUM, &tcb_sz);
|
||||
for (uint32_t i = 0; i < task_num; i++) {
|
||||
TEST_ASSERT_EQUAL(tasks[i].eState, eTaskGetState(tasks[i].pxTCB));
|
||||
}
|
||||
#ifndef CONFIG_FREERTOS_UNICORE
|
||||
esp_cpu_unstall(other_core_id);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user