|
|
@ -207,8 +207,14 @@ void RegisterDbInit() { |
|
|
|
|
|
|
|
|
|
|
|
int CmdTasks(int argc, char** argv) { |
|
|
|
int CmdTasks(int argc, char** argv) { |
|
|
|
#if (configUSE_TRACE_FACILITY == 0) |
|
|
|
#if (configUSE_TRACE_FACILITY == 0) |
|
|
|
std::cout << "configUSE_TRACE_FACILITY must be enabled" << std::endl; |
|
|
|
std::cout |
|
|
|
std::cout << "also consider configTASKLIST_USE_COREID" << std::endl; |
|
|
|
<< "FreeRTOS is not configured to track task info." << std::endl |
|
|
|
|
|
|
|
<< "You can enable task tracing via sdkconfig, by setting" << std::endl |
|
|
|
|
|
|
|
<< "CONFIG_FREERTOS_USE_TRACE_FACILITY=y. Alternately, use" << std::endl |
|
|
|
|
|
|
|
<< "idf.py menuconfig to enable Components/FreeRTOS/Kernel" << std::endl |
|
|
|
|
|
|
|
<< "configUSE_TRACE_FACILITY to do the same." << std::endl << std::endl |
|
|
|
|
|
|
|
<< "Also consider 'Enable display of xCoreID in vTaskList'," << std::endl |
|
|
|
|
|
|
|
<< "or CONFIG_FREERTOS_VTASKLIST_INCLUDE_COREID=y" << std::endl; |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
@ -218,6 +224,14 @@ int CmdTasks(int argc, char** argv) { |
|
|
|
return 1; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Sample the task runtime percentage over 2.5 seconds if collecting
|
|
|
|
|
|
|
|
// task statistics. Else, we don't need to sample for as long.
|
|
|
|
|
|
|
|
#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS |
|
|
|
|
|
|
|
const int kSamplePeriodMs = 2500; |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
const int kSamplePeriodMs = 10; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Pad the number of tasks so that uxTaskGetSystemState still returns info
|
|
|
|
// Pad the number of tasks so that uxTaskGetSystemState still returns info
|
|
|
|
// if new tasks are started during measurement.
|
|
|
|
// if new tasks are started during measurement.
|
|
|
|
size_t num_tasks = uxTaskGetNumberOfTasks() + 4; |
|
|
|
size_t num_tasks = uxTaskGetNumberOfTasks() + 4; |
|
|
@ -229,11 +243,23 @@ int CmdTasks(int argc, char** argv) { |
|
|
|
size_t start_num_tasks = |
|
|
|
size_t start_num_tasks = |
|
|
|
uxTaskGetSystemState(start_status, num_tasks, &start_elapsed_ticks); |
|
|
|
uxTaskGetSystemState(start_status, num_tasks, &start_elapsed_ticks); |
|
|
|
|
|
|
|
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(2500)); |
|
|
|
vTaskDelay(pdMS_TO_TICKS(kSamplePeriodMs)); |
|
|
|
|
|
|
|
|
|
|
|
size_t end_num_tasks = |
|
|
|
size_t end_num_tasks = |
|
|
|
uxTaskGetSystemState(end_status, num_tasks, &end_elapsed_ticks); |
|
|
|
uxTaskGetSystemState(end_status, num_tasks, &end_elapsed_ticks); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t elapsed_ticks = end_elapsed_ticks - start_elapsed_ticks; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (0 == elapsed_ticks) { |
|
|
|
|
|
|
|
std::cout << "Warning: the scheduler is not recording run-time" << std::endl |
|
|
|
|
|
|
|
<< "statistics, and this means that detailed task" << std::endl |
|
|
|
|
|
|
|
<< "information is not available." << std::endl |
|
|
|
|
|
|
|
<< "Enable CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS" << std::endl |
|
|
|
|
|
|
|
<< "in sdkconfig to capture these stats, or via" << std::endl |
|
|
|
|
|
|
|
<< "idf.py menuconfig, in Components/FreeRTOS/Kernel" << std::endl |
|
|
|
|
|
|
|
<< "configGENERATE_RUN_TIME_STATS." << std::endl; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::vector<std::pair<uint32_t, std::pmr::string>> info_strings; |
|
|
|
std::vector<std::pair<uint32_t, std::pmr::string>> info_strings; |
|
|
|
for (int i = 0; i < start_num_tasks; i++) { |
|
|
|
for (int i = 0; i < start_num_tasks; i++) { |
|
|
|
int k = -1; |
|
|
|
int k = -1; |
|
|
@ -279,8 +305,12 @@ int CmdTasks(int argc, char** argv) { |
|
|
|
str << "\t\t"; |
|
|
|
str << "\t\t"; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS |
|
|
|
str << std::fixed << std::setprecision(1) << (time_percent * 100); |
|
|
|
str << std::fixed << std::setprecision(1) << (time_percent * 100); |
|
|
|
str << "%"; |
|
|
|
str << "%"; |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
str << "(unavailable)"; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
info_strings.push_back({run_time, std::pmr::string{str.str()}}); |
|
|
|
info_strings.push_back({run_time, std::pmr::string{str.str()}}); |
|
|
|
} |
|
|
|
} |
|
|
|