vTaskPrioritySet() dynamic priority in FreeRTOS - Time & Space Complexity
When changing a task's priority dynamically in FreeRTOS, it's important to know how the time taken grows as the system has more tasks.
We want to understand how the cost of setting a new priority changes with the number of tasks.
Analyze the time complexity of the following code snippet.
// Change the priority of a task dynamically
void changeTaskPriority(TaskHandle_t task, UBaseType_t newPriority) {
vTaskPrioritySet(task, newPriority);
}
This code changes the priority of a given task to a new level during runtime.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The function internally may check the ready lists for tasks at different priorities.
- How many times: It scans through priority levels, which depends on the total number of priority levels configured.
Changing a task's priority involves checking priority lists. The time grows with the number of priority levels, not the number of tasks.
| Input Size (priority levels) | Approx. Operations |
|---|---|
| 5 | 5 checks |
| 10 | 10 checks |
| 20 | 20 checks |
Pattern observation: The cost grows linearly with the number of priority levels, not tasks.
Time Complexity: O(P)
This means the time to set a task's priority grows linearly with the number of priority levels configured in the system.
[X] Wrong: "Changing a task's priority takes time proportional to the total number of tasks in the system."
[OK] Correct: The operation depends on the number of priority levels, which is usually fixed and small, not on how many tasks exist.
Understanding how task priority changes scale helps you reason about real-time system responsiveness and scheduling efficiency.
"What if the system had a very large number of priority levels? How would that affect the time complexity of vTaskPrioritySet()?"
Practice
What does the FreeRTOS function vTaskPrioritySet() do?
Solution
Step 1: Understand the function purpose
vTaskPrioritySet()is designed to change the priority of an existing task dynamically during runtime.Step 2: Compare with other task functions
Creating, deleting, or suspending tasks are done by different functions, notvTaskPrioritySet().Final Answer:
It changes the priority of a task while the program is running. -> Option AQuick Check:
vTaskPrioritySet() changes priority [OK]
- Confusing vTaskPrioritySet with task creation functions
- Thinking it deletes or suspends tasks
- Assuming priority is fixed at task creation
Which of the following is the correct syntax to change a task's priority using vTaskPrioritySet()?
TaskHandle_t xTaskHandle; // Change priority to 3 _____;
Solution
Step 1: Recall the function signature
The correct function isvTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority), so the task handle comes first, then the new priority.Step 2: Check the options
vTaskPrioritySet(xTaskHandle, 3); matches the correct syntax exactly. Options A, B, and D either swap parameters or use incorrect function names.Final Answer:
vTaskPrioritySet(xTaskHandle, 3); -> Option BQuick Check:
Correct syntax = vTaskPrioritySet(task, priority) [OK]
- Swapping the order of parameters
- Using incorrect function names
- Passing priority before task handle
Consider the following code snippet:
TaskHandle_t xTask1;
// Assume xTask1 is created with priority 2
vTaskPrioritySet(xTask1, 5);
UBaseType_t newPriority = uxTaskPriorityGet(xTask1);
printf("%u", newPriority);What will be printed?
Solution
Step 1: Understand priority change
The callvTaskPrioritySet(xTask1, 5)changes the task's priority from 2 to 5.Step 2: Check the priority retrieval
uxTaskPriorityGet(xTask1)returns the current priority, which is now 5.Final Answer:
5 -> Option CQuick Check:
Priority updated to 5, so output is 5 [OK]
- Assuming priority stays the same after set
- Confusing priority with task handle
- Thinking printf prints task handle
What is wrong with this code snippet?
TaskHandle_t xTask2 = NULL; vTaskPrioritySet(xTask2, 4);
Solution
Step 1: Check the task handle value
The variablexTask2is set to NULL, meaning it does not point to a valid task.Step 2: Understand effect of NULL handle
CallingvTaskPrioritySet()with a NULL handle leads to undefined behavior or runtime error because no valid task exists to change priority.Final Answer:
xTask2 is NULL, so setting priority causes undefined behavior. -> Option DQuick Check:
NULL task handle causes error [OK]
- Ignoring NULL task handle
- Assuming priority range is only 0 or 1
- Confusing handle with pointer to handle
You have two tasks: TaskA with priority 3 and TaskB with priority 5. You want TaskA to temporarily run with higher priority than TaskB during a critical section. Which code snippet correctly achieves this?
TaskHandle_t xTaskA, xTaskB; // Initially priorities: TaskA=3, TaskB=5 // Critical section starts _____; // Critical section ends vTaskPrioritySet(xTaskA, 3);
Solution
Step 1: Identify priority requirements
TaskA must have higher priority than TaskB (which is 5) during the critical section.Step 2: Choose correct priority change
Setting TaskA to 6 makes it higher than TaskB's 5. Options A and D lower TaskB's priority instead. vTaskPrioritySet(xTaskA, 5); sets TaskA to 5, equal to TaskB, not higher.Step 3: Restore original priority after critical section
After the critical section, TaskA's priority is reset to 3 as shown.Final Answer:
vTaskPrioritySet(xTaskA, 6); -> Option AQuick Check:
TaskA priority > TaskB priority during critical section [OK]
- Setting TaskA priority equal to TaskB
- Lowering TaskB priority instead of raising TaskA
- Not restoring original priority after critical section
Ready to prove it?
Pass the test and this pattern moves unknown
