This function helps you see how much CPU time each task uses. It shows which tasks are working hard and which are idle.
vTaskGetRunTimeStats() for CPU usage in FreeRTOS
void vTaskGetRunTimeStats( char *pcWriteBuffer );
You must provide a buffer (string) where the stats will be stored.
The buffer should be large enough to hold all the stats text.
char buffer[512]; vTaskGetRunTimeStats(buffer); printf("%s", buffer);
char stats[256]; vTaskGetRunTimeStats(stats); // Use stats string to display on screen or log
This program creates two simple tasks and a stats task. The stats task prints CPU usage stats every second. The FreeRTOS scheduler runs indefinitely.
#include "FreeRTOS.h" #include "task.h" #include <stdio.h> void vTask1(void *pvParameters) { for (;;) { // Task code here vTaskDelay(pdMS_TO_TICKS(100)); } } void vTask2(void *pvParameters) { for (;;) { // Task code here vTaskDelay(pdMS_TO_TICKS(200)); } } void vStatsTask(void *pvParameters) { char statsBuffer[512]; for (;;) { vTaskGetRunTimeStats(statsBuffer); printf("CPU Usage Stats:\n%s", statsBuffer); vTaskDelay(pdMS_TO_TICKS(1000)); } } int main(void) { xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL); xTaskCreate(vTask2, "Task2", 1000, NULL, 1, NULL); xTaskCreate(vStatsTask, "Stats", 1000, NULL, 1, NULL); vTaskStartScheduler(); for(;;) {} return 0; }
You must enable configGENERATE_RUN_TIME_STATS in FreeRTOSConfig.h for this function to work.
You need a timer or counter to measure run time; FreeRTOS uses this to calculate CPU usage.
The output format is a table showing each task's name, total run time, and percentage of CPU time.
vTaskGetRunTimeStats() shows CPU time used by each FreeRTOS task.
Use it to find which tasks use most CPU and optimize your system.
Remember to enable run time stats and provide a big enough buffer for results.
Practice
vTaskGetRunTimeStats() function in FreeRTOS?Solution
Step 1: Understand the function's role
vTaskGetRunTimeStats()is designed to collect and display CPU usage statistics for each task in FreeRTOS.Step 2: Compare options with function purpose
Options A, B, and C relate to task management but not CPU usage reporting, which is the key role ofvTaskGetRunTimeStats().Final Answer:
To display the CPU usage time of each task -> Option DQuick Check:
Function purpose = CPU usage display [OK]
- Confusing it with task creation or deletion functions
- Thinking it suspends tasks instead of reporting stats
- Assuming it modifies task priorities
vTaskGetRunTimeStats() to store the stats in a buffer named buffer?Solution
Step 1: Check function parameter type
vTaskGetRunTimeStats()expects a pointer to a char array (string buffer), so passing the buffer name directly is correct.Step 2: Analyze each option's syntax
vTaskGetRunTimeStats(buffer); passes the buffer correctly. vTaskGetRunTimeStats(&buffer); passes address of buffer pointer (wrong). vTaskGetRunTimeStats(buffer[]); uses invalid syntax. vTaskGetRunTimeStats(*buffer); dereferences buffer incorrectly.Final Answer:
vTaskGetRunTimeStats(buffer); -> Option AQuick Check:
Pass buffer name directly [OK]
- Using &buffer which is wrong for arrays
- Adding [] inside function call
- Dereferencing buffer pointer incorrectly
statsBuffer?
char statsBuffer[100];
vTaskGetRunTimeStats(statsBuffer);
printf("%s", statsBuffer);
Assuming two tasks "TaskA" and "TaskB" run and TaskA used 70% CPU, TaskB used 30%.Solution
Step 1: Understand output format of vTaskGetRunTimeStats()
The function outputs CPU usage as run time counter ticks, not percentages. If TaskA used 70% CPU, it might show 7000 ticks and TaskB 3000 ticks (assuming 10000 total ticks).Step 2: Match options with expected output
TaskA 7000 TaskB 3000 shows usage in ticks (7000 and 3000), matching expected output. Options B, C, and D show percentages or smaller numbers, which are not the direct output format.Final Answer:
TaskA 7000 TaskB 3000 -> Option CQuick Check:
Output shows ticks, not percentages [OK]
- Assuming output shows percentages directly
- Confusing ticks with smaller numbers
- Expecting formatted percentages in output
vTaskGetRunTimeStats(statsBuffer); but the output is empty. What is the most likely cause?Solution
Step 1: Identify prerequisites for run time stats
Run time stats must be enabled in FreeRTOSConfig.h (configGENERATE_RUN_TIME_STATS set to 1) forvTaskGetRunTimeStats()to work.Step 2: Analyze other options
Buffer size being too large does not cause empty output. Passing NULL is invalid. Task priority does not affect stats collection directly.Final Answer:
Run time stats collection is not enabled in FreeRTOSConfig.h -> Option BQuick Check:
Enable run time stats in config [OK]
- Assuming buffer size too large causes empty output
- Passing NULL pointer mistakenly
- Thinking task priority disables stats
vTaskGetRunTimeStats(). Which approach correctly ensures accurate and meaningful stats?Solution
Step 1: Understand requirements for accurate CPU stats
Run time stats must be enabled, buffer must be large enough to hold all task info, and stats should be collected periodically to track changes over time.Step 2: Evaluate each option
Enable run time stats, provide a large buffer, call periodically, and reset counters between calls describes the correct approach including resetting counters to avoid cumulative overflow. CallvTaskGetRunTimeStats()once at startup with a small buffer is insufficient (only once, small buffer). Disable run time stats and manually count task switches disables stats, losing automation. CallvTaskGetRunTimeStats()inside each task to get its own CPU usage is incorrect because stats are global, not per task.Final Answer:
Enable run time stats, provide a large buffer, call periodically, and reset counters between calls -> Option AQuick Check:
Enable + buffer + periodic calls + reset = accurate stats [OK]
- Calling once only at startup
- Disabling run time stats
- Calling inside each task expecting per-task stats
Ready to prove it?
Pass the test and this pattern moves unknown
