9#include "FreeRTOSConfig.h"
14#if INCLUDE_uxTaskGetStackHighWaterMark == 1
24static void Task_exec(
UART_t *uart,
char *flags);
25static void Task_help(
UART_t *uart);
29DEFINE_PROGRAM_HANDLE(
"task", Task_exec, Task_help)
31static void Task_help(
UART_t *uart) {
33 uart->println(uart,
"\ttask\n");
34 uart->println(uart,
"USAGE:");
35 uart->println(uart,
"\ttask print name");
36 uart->println(uart,
"\ttask print stack [--task-name <name>]\n");
37 uart->println(uart,
"DESCRIPTION:");
38 uart->println(uart,
"\tprint name");
39 uart->println(uart,
"\t Print the name of every task in the Australis Core list.\n");
40 uart->println(uart,
"\tprint stack");
41 uart->println(uart,
"\t Print the stack high-watermark of each/selected task.\n");
42 uart->println(uart,
"OPTIONS:");
43 uart->println(uart,
"\t-t, --task-name");
44 uart->println(uart,
"\t Select a task to operate with. Has no effect when used with `print name`.");
45 uart->println(uart,
"\t-h, --help");
46 uart->println(uart,
"\t Print this help and exit");
49static void printTaskName(TaskHandle_t task) {
50 char *taskName = pcTaskGetName(task);
51 pUart->println(pUart, taskName);
54static void printTaskStack(TaskHandle_t task) {
55 unsigned int stackRemaining = uxTaskGetStackHighWaterMark(task);
56 char *taskName = pcTaskGetName(task);
57 uint8_t taskNameLength = strlen(taskName);
59 pUart->print(pUart, taskName);
60 for (uint8_t i = 0; i < (configMAX_TASK_NAME_LEN - taskNameLength); i++) {
61 pUart->send(pUart,
' ');
64 uint8_t stackRemainingLength = snprintf(NULL, 0,
"%u", stackRemaining);
66 char stackStr[stackRemainingLength + 1];
67 snprintf(stackStr, stackRemainingLength + 1,
"%u", stackRemaining);
68 pUart->println(pUart, stackStr);
78static void Task_exec(
UART_t *uart,
char *flags) {
82 int argPrintIdx = parser.addArg(
83 &parser,
"print", 0, ARG_TYPE_STRING,
false
85 int argTaskNameIdx = parser.addArg(
86 &parser,
"--task-name",
't', ARG_TYPE_STRING,
false
89 char *tokens[MAX_ARGS];
93 char *token = strtok(flags,
" ");
94 while (token != NULL && numTokens < MAX_ARGS) {
95 tokens[numTokens++] = token;
96 token = strtok(NULL,
" ");
100 parser.parseArgs(&parser, numTokens, tokens);
103 if (parser.error.status == PARSER_STATUS_ERROR) {
104 uart->println(uart, parser.error.msg);
109 if (parser.args[argPrintIdx].provided) {
110 char *value = parser.args[argPrintIdx].value;
116 if (!strcmp(value,
"name")) {
117 uart->println(uart,
"");
118 uart->println(uart,
"Task Name ");
119 uart->println(uart,
"----------------");
124 else if (!strcmp(value,
"stack")) {
125 TaskHandle_t taskHandle;
126 uart->println(uart,
"");
127 uart->println(uart,
"Task Name Stack High Watermark");
128 uart->println(uart,
"------------------------------------");
130 Argument argTaskName = parser.args[argTaskNameIdx];
131 char *taskName = argTaskName.provided ? argTaskName.value : NULL;
135 printTaskStack(taskHandle);
139 snprintf(str,
sizeof(str),
"Error: Task `%s` not found\n", taskName);
149 snprintf(str,
sizeof(str),
"Error: invalid argument\n");
152 uart->println(uart, str);
TaskHandle_t TaskList_getTaskByName(char *)
Retrieve task handle from list by name string.
void TaskList_forEach(void(*func)(TaskHandle_t))
void(* println)(struct UART *, char *)
UART print line method.
Struct definition for UART interface.