Stack size allocation in FreeRTOS - Time & Space Complexity
When we allocate stack size in FreeRTOS tasks, we want to know how the time to allocate grows as the stack size changes.
We ask: How does increasing the stack size affect the time the system spends setting it up?
Analyze the time complexity of the following code snippet.
// Create a task with a given stack size
xTaskCreate(
TaskFunction, // Task function
"TaskName", // Name
stackSize, // Stack size in words
NULL, // Parameters
tskIDLE_PRIORITY, // Priority
NULL // Task handle
);
This code creates a FreeRTOS task and allocates memory for its stack based on stackSize.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Allocating and initializing the stack memory of size
stackSize. - How many times: The system sets up each stack element once during allocation.
As the stack size increases, the system spends more time setting up the stack memory.
| Input Size (stackSize) | Approx. Operations |
|---|---|
| 10 | 10 operations (setting up each stack word) |
| 100 | 100 operations |
| 1000 | 1000 operations |
Pattern observation: The time grows directly with the stack size; doubling the stack size roughly doubles the setup time.
Time Complexity: O(n)
This means the time to allocate and initialize the stack grows linearly with the stack size.
[X] Wrong: "Allocating a larger stack size takes the same time as a smaller one because it's just one call."
[OK] Correct: Even though it's one function call, the system must set up each stack element, so bigger stacks take more time.
Understanding how stack size affects allocation time helps you reason about resource use in embedded systems, a key skill for real-world programming.
"What if the stack memory was allocated from a pre-allocated pool instead of dynamically? How would the time complexity change?"
Practice
stack size parameter specify when creating a FreeRTOS task?Solution
Step 1: Understand stack size meaning in FreeRTOS
The stack size defines how much memory a task can use for its temporary data and function calls.Step 2: Identify the unit of stack size
In FreeRTOS, stack size is given in words, not bytes, when creating a task.Final Answer:
The amount of memory allocated for the task's temporary data in words -> Option CQuick Check:
Stack size = task memory in words [OK]
- Confusing stack size with heap size
- Thinking stack size is in bytes
- Mixing stack size with task priority
Solution
Step 1: Recall stack size unit in FreeRTOS
Stack size is specified in words, so just giving 128 means 128 words.Step 2: Analyze each option
xTaskCreate(taskFunction, "Task", 128, NULL, 1, NULL); uses 128 words directly, which is correct. xTaskCreate(taskFunction, "Task", 128 * sizeof(char), NULL, 1, NULL); and C multiply by size, which is incorrect. xTaskCreate(taskFunction, "Task", 128 / sizeof(int), NULL, 1, NULL); divides, which is also wrong.Final Answer:
xTaskCreate(taskFunction, "Task", 128, NULL, 1, NULL); -> Option DQuick Check:
Stack size = number of words, no sizeof needed [OK]
- Multiplying stack size by sizeof(int)
- Dividing stack size by sizeof(int)
- Confusing bytes and words in stack size
void vTaskCode(void * pvParameters) {
int x = 0;
for(int i = 0; i < 10; i++) {
x += i;
}
vTaskDelete(NULL);
}
xTaskCreate(vTaskCode, "Task1", 50, NULL, 2, NULL);What is the minimum stack size allocation (in words) to safely run this task without overflow?
Solution
Step 1: Analyze task stack usage
The task uses a few local variables (x, i) and a small loop. This requires some stack but not very large.Step 2: Check stack size given
The task is created with 50 words stack size, which is enough for simple local variables and loop.Final Answer:
50 words -> Option AQuick Check:
Simple task needs moderate stack, 50 words is safe [OK]
- Assuming 10 words is enough for loop variables
- Overestimating stack need as 100 words
- Underestimating stack causing overflow
Solution
Step 1: Identify cause of crash
Stack overflow means the task's stack is too small for its needs.Step 2: Choose appropriate fix
Increasing stack size to a larger value like 100 words prevents overflow safely.Final Answer:
Increase the stack size to a larger value like 100 words -> Option BQuick Check:
Stack overflow fix = increase stack size [OK]
- Reducing stack size to save memory
- Changing priority instead of stack size
- Ignoring local variables impact
Solution
Step 1: Understand total heap limit
Total heap is 100 words, so sum of stack sizes must not exceed 100.Step 2: Allocate stack sizes within limit
Task A needs 80 words ideally, Task B needs 40 words, total 120 words which is over heap.Step 3: Adjust allocation to fit heap
Reduce Task A to 60 words and keep Task B at 40 words to fit 100 words total.Final Answer:
Allocate 60 words to Task A and 40 words to Task B -> Option AQuick Check:
Sum stack ≤ heap, adjust sizes accordingly [OK]
- Allocating more stack than heap allows
- Ignoring total heap limit
- Splitting stack sizes evenly without need
Ready to prove it?
Pass the test and this pattern moves unknown
