Просмотр исходного кода

gdbstub: added cpu id of running tasks to the output

Felipe Neves 5 лет назад
Родитель
Сommit
c296d01737

+ 12 - 1
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"); 

+ 1 - 0
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;
 
 /**

+ 19 - 0
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;