Modified Task display to order based on task number or arbitraruy function
This commit is contained in:
@@ -1,4 +1,15 @@
|
||||
#include "utils.h"
|
||||
#include "freertos_stats.h"
|
||||
#include "sdkconfig.h"
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/portable.h"
|
||||
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
#include <functional>
|
||||
|
||||
#define FREERTOS_TASK_NUMBER_MAX_NUM 256 // RunTime stats for how many Tasks to be stored
|
||||
|
||||
std::string printBits(uint32_t value) {
|
||||
std::string result;
|
||||
@@ -12,3 +23,60 @@ std::string printBits(uint32_t value) {
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void printRunningTasksMod(Print &printer, std::function<bool(const TaskStatus_t &a, const TaskStatus_t &b)> orderBy)
|
||||
{
|
||||
static const char *taskStates[] = {"Running", "Ready", "Blocked", "Suspended", "Deleted", "Invalid"};
|
||||
|
||||
static uint32_t ulRunTimeCounters[FREERTOS_TASK_NUMBER_MAX_NUM];
|
||||
static uint32_t ulLastRunTime = 0;
|
||||
uint32_t ulCurrentRunTime = 0, ulTaskRunTime = 0;
|
||||
uint32_t ulTotalRunTime = 0;
|
||||
|
||||
std::vector<TaskStatus_t> pxTaskStatusArray;
|
||||
UBaseType_t uxArraySize = 0;
|
||||
|
||||
// Take a snapshot of the number of tasks in case it changes while this function is executing.
|
||||
uxArraySize = uxTaskGetNumberOfTasks();
|
||||
pxTaskStatusArray.resize(uxArraySize);
|
||||
|
||||
// Generate raw status information about each task.
|
||||
uxArraySize = uxTaskGetSystemState(pxTaskStatusArray.data(), uxArraySize, &ulTotalRunTime);
|
||||
|
||||
if (orderBy == nullptr)
|
||||
std::sort(pxTaskStatusArray.begin(), pxTaskStatusArray.end(), [](const TaskStatus_t &a, const TaskStatus_t &b)
|
||||
{ return a.xTaskNumber < b.xTaskNumber; });
|
||||
else
|
||||
std::sort(pxTaskStatusArray.begin(), pxTaskStatusArray.end(), orderBy);
|
||||
|
||||
// Compute system total runtime
|
||||
ulCurrentRunTime = ulTotalRunTime - ulLastRunTime;
|
||||
ulLastRunTime = ulTotalRunTime;
|
||||
|
||||
// Print Runtime Information
|
||||
printer.printf("Tasks: %u, Runtime: %lus, Period: %luus\r\n", uxArraySize, ulTotalRunTime / 1000000, ulCurrentRunTime);
|
||||
|
||||
// Print Task Headers
|
||||
printer.printf("Num\t Name\tLoad\tPrio\t Free\tCore\tState\r\n");
|
||||
for (const auto &task : pxTaskStatusArray)
|
||||
{
|
||||
|
||||
ulTaskRunTime = (task.ulRunTimeCounter - ulRunTimeCounters[task.xTaskNumber]);
|
||||
ulRunTimeCounters[task.xTaskNumber] = task.ulRunTimeCounter;
|
||||
ulTaskRunTime = (ulTaskRunTime * 100) / ulCurrentRunTime; // in percentage
|
||||
|
||||
printer.printf(
|
||||
"%3u\t%16s"
|
||||
"\t%3lu%%"
|
||||
"\t%4u\t%5lu"
|
||||
"\t%4c"
|
||||
"\t%s\r\n",
|
||||
task.xTaskNumber, task.pcTaskName,
|
||||
ulTaskRunTime,
|
||||
task.uxCurrentPriority, task.usStackHighWaterMark,
|
||||
(task.xCoreID == tskNO_AFFINITY) ? '*' : ('0' + task.xCoreID),
|
||||
taskStates[task.eCurrentState]);
|
||||
}
|
||||
printer.println();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user