Choosing priorities for real applications in FreeRTOS - Time & Space Complexity
When we assign priorities to tasks in FreeRTOS, it affects how often tasks run and how long they wait.
We want to understand how the time to complete tasks changes as we add more tasks with different priorities.
Analyze the time complexity of scheduling tasks with different priorities.
// Create tasks with different priorities
xTaskCreate(task1, "Task1", 1000, NULL, 3, NULL);
xTaskCreate(task2, "Task2", 1000, NULL, 2, NULL);
xTaskCreate(task3, "Task3", 1000, NULL, 1, NULL);
// Start the scheduler
vTaskStartScheduler();
This code creates three tasks with different priorities and starts the scheduler to run the highest priority task ready to run.
Look at what repeats during scheduling:
- Primary operation: The scheduler checks all ready tasks to find the highest priority one.
- How many times: This check happens every time a task finishes or blocks, so it repeats often.
As the number of tasks (n) grows, the scheduler must check more tasks to find the highest priority ready one.
| Input Size (n) | Approx. Operations |
|---|---|
| 3 | 3 checks per scheduling decision |
| 10 | 10 checks per scheduling decision |
| 100 | 100 checks per scheduling decision |
Pattern observation: The number of checks grows directly with the number of tasks.
Time Complexity: O(n)
This means the scheduler's work grows linearly as you add more tasks with different priorities.
[X] Wrong: "Adding more tasks won't affect scheduling time because priorities decide order instantly."
[OK] Correct: The scheduler still checks all ready tasks to find the highest priority one, so more tasks mean more checks.
Understanding how task priorities affect scheduling time helps you design responsive systems and shows you can think about performance in real applications.
"What if all tasks have the same priority? How would the time complexity of scheduling change?"
Practice
Solution
Step 1: Understand task priority meaning
In FreeRTOS, task priority determines which task the scheduler runs first.Step 2: Higher number means higher priority
A higher priority number means the task is more important and runs before lower priority tasks.Final Answer:
The task runs before lower priority tasks -> Option AQuick Check:
Higher priority = runs first [OK]
- Thinking higher priority means slower task
- Confusing priority with memory usage
- Assuming priority pauses the task
Solution
Step 1: Check parameter for priority in xTaskCreate
The fifth parameter in xTaskCreate is the task priority and must be an integer.Step 2: Validate options
xTaskCreate(taskFunction, "Task", stackSize, NULL, 5, NULL); uses integer 5, which is valid. xTaskCreate(taskFunction, "Task", stackSize, NULL, "high", NULL); uses a string, invalid. xTaskCreate(taskFunction, "Task", stackSize, NULL, -1, NULL); uses negative priority, invalid. xTaskCreate(taskFunction, "Task", stackSize, NULL, 0.5, NULL); uses float, invalid.Final Answer:
xTaskCreate(taskFunction, "Task", stackSize, NULL, 5, NULL); -> Option CQuick Check:
Priority must be integer >= 0 [OK]
- Using string or float for priority
- Using negative numbers for priority
- Confusing parameter order
Solution
Step 1: Compare task priorities
TaskB has priority 5, TaskA has 3, TaskC has 2.Step 2: Highest priority runs first
Since 5 is highest, TaskB runs first when all are ready.Final Answer:
TaskB -> Option DQuick Check:
Highest priority = 5 = TaskB [OK]
- Choosing lowest priority task
- Thinking tasks run simultaneously
- Ignoring priority values
Solution
Step 1: Understand equal priority behavior
Tasks with same priority share CPU time via time slicing.Step 2: Effects of equal priority
This can cause unpredictable timing because tasks switch frequently, but no starvation occurs.Final Answer:
Tasks will share CPU time but may cause unpredictable timing -> Option AQuick Check:
Same priority = time slicing, possible timing issues [OK]
- Assuming one task never runs
- Expecting system crash
- Ignoring time slicing behavior
Solution
Step 1: Identify task urgency
SensorRead must respond fastest, so highest priority. UIUpdate is medium, DataLogging less urgent.Step 2: Assign priorities accordingly
Assign SensorRead=3 (highest), UIUpdate=2, DataLogging=1 (lowest).Final Answer:
SensorRead=3, UIUpdate=2, DataLogging=1 -> Option BQuick Check:
Fastest task gets highest priority [OK]
- Giving low priority to fastest task
- Assigning same priority to all
- Reversing urgency order
Ready to prove it?
Pass the test and this pattern moves unknown
