From 57a516389cbb4d90d2cf26ddf891f9e111a03f09 Mon Sep 17 00:00:00 2001
From: Ivan Grokhotkov <ivan@espressif.com>
Date: Wed, 31 Jan 2018 14:04:40 +0800
Subject: [PATCH] console example: add 'tasks' command to print vTaskList
 output

This command prints list of tasks, their state, and stack
watermark values.
Fixes https://github.com/espressif/esp-idf/issues/1534
---
 examples/system/console/main/cmd_system.c  | 41 ++++++++++++++++++++++
 examples/system/console/sdkconfig.defaults |  4 +++
 2 files changed, 45 insertions(+)

diff --git a/examples/system/console/main/cmd_system.c b/examples/system/console/main/cmd_system.c
index 04003e8d5e..e7192b9fec 100644
--- a/examples/system/console/main/cmd_system.c
+++ b/examples/system/console/main/cmd_system.c
@@ -20,11 +20,19 @@
 #include "freertos/FreeRTOS.h"
 #include "freertos/task.h"
 #include "soc/rtc_cntl_reg.h"
+#include "sdkconfig.h"
+
+#ifdef CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS
+#define WITH_TASKS_INFO 1
+#endif
 
 static void register_free();
 static void register_restart();
 static void register_deep_sleep();
 static void register_make();
+#if WITH_TASKS_INFO
+static void register_tasks();
+#endif
 
 void register_system()
 {
@@ -32,6 +40,9 @@ void register_system()
     register_restart();
     register_deep_sleep();
     register_make();
+#if WITH_TASKS_INFO
+    register_tasks();
+#endif
 }
 
 /** 'restart' command restarts the program */
@@ -72,6 +83,36 @@ static void register_free()
     ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
 }
 
+/** 'tasks' command prints the list of tasks and related information */
+#if WITH_TASKS_INFO
+
+static int tasks_info(int argc, char** argv)
+{
+    const size_t bytes_per_task = 40; /* see vTaskList description */
+    char* task_list_buffer = malloc(uxTaskGetNumberOfTasks() * bytes_per_task);
+    if (task_list_buffer == NULL) {
+        ESP_LOGE(__func__, "failed to allocate buffer for vTaskList output");
+        return 1;
+    }
+    vTaskList(task_list_buffer);
+    fputs(task_list_buffer, stdout);
+    free(task_list_buffer);
+    return 0;
+}
+
+static void register_tasks()
+{
+    const esp_console_cmd_t cmd = {
+        .command = "tasks",
+        .help = "Get information about running tasks",
+        .hint = NULL,
+        .func = &tasks_info,
+    };
+    ESP_ERROR_CHECK( esp_console_cmd_register(&cmd) );
+}
+
+#endif // WITH_TASKS_INFO
+
 /** 'deep_sleep' command puts the chip into deep sleep mode */
 
 static struct {
diff --git a/examples/system/console/sdkconfig.defaults b/examples/system/console/sdkconfig.defaults
index 96cda3dea4..4bb6acaaae 100644
--- a/examples/system/console/sdkconfig.defaults
+++ b/examples/system/console/sdkconfig.defaults
@@ -11,3 +11,7 @@ CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions_example.csv"
 CONFIG_PARTITION_TABLE_CUSTOM_APP_BIN_OFFSET=0x10000
 CONFIG_PARTITION_TABLE_FILENAME="partitions_example.csv"
 CONFIG_APP_OFFSET=0x10000
+
+# Enable FreeRTOS stats formatting functions, needed for 'tasks' command
+CONFIG_FREERTOS_USE_TRACE_FACILITY=y
+CONFIG_FREERTOS_USE_STATS_FORMATTING_FUNCTIONS=y
-- 
2.40.0