Sleep modes overview in Embedded C - Time & Space Complexity
When using sleep modes in embedded C, it's important to understand how the program's execution time changes.
We want to see how the time spent running code grows when sleep modes are involved.
Analyze the time complexity of the following code snippet.
void main_loop() {
while(1) {
do_task();
enter_sleep_mode();
}
}
void do_task() {
// Some fixed time work
}
void enter_sleep_mode() {
// MCU sleeps until interrupt
}
This code runs a task repeatedly, then puts the microcontroller to sleep until an interrupt wakes it.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The infinite while loop repeating do_task and sleep.
- How many times: Runs indefinitely, repeating the task and sleep cycle.
Since the loop runs forever, the total execution time grows linearly with the number of cycles.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 cycles | 10 task executions + 10 sleeps |
| 100 cycles | 100 task executions + 100 sleeps |
| 1000 cycles | 1000 task executions + 1000 sleeps |
Pattern observation: The number of operations grows directly with the number of cycles.
Time Complexity: O(n)
This means the total time grows in a straight line as the number of task and sleep cycles increases.
[X] Wrong: "Sleep mode makes the program run faster overall."
[OK] Correct: Sleep mode pauses the CPU, so it saves power but does not reduce the number of task cycles or their time.
Understanding how sleep modes affect program flow and timing helps you explain embedded system behavior clearly and confidently.
"What if the do_task function took time proportional to input size? How would the time complexity change?"
Practice
Solution
Step 1: Understand sleep mode function
Sleep modes reduce power by stopping CPU and peripherals.Step 2: Compare options
Only To save power by stopping the CPU and peripherals matches the purpose of saving power by stopping CPU and peripherals.Final Answer:
To save power by stopping the CPU and peripherals -> Option CQuick Check:
Sleep modes save power = D [OK]
- Thinking sleep mode speeds up the CPU
- Confusing sleep mode with reset
- Assuming sleep mode enables debugging
Solution
Step 1: Recall standard sleep function
The standard function to enter sleep mode issleep_mode();in many embedded C libraries.Step 2: Check other options
Other options likesleep();,enter_sleep();, andgo_to_sleep();are not standard or common function names.Final Answer:
sleep_mode(); -> Option AQuick Check:
Standard sleep function = sleep_mode() [OK]
- Using non-standard function names
- Confusing sleep_mode() with sleep()
- Assuming function names from other languages
set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); // enable interrupts sleep_cpu(); // CPU sleeps here // Interrupt wakes CPU sleep_disable();What happens when an interrupt occurs during sleep?
Solution
Step 1: Understand sleep and interrupt behavior
When CPU is in sleep mode, an interrupt wakes it up and execution continues after sleep_disable().Step 2: Analyze options
Only The CPU wakes up and continues execution after sleep_disable() correctly describes waking up and continuing execution. Others describe incorrect behaviors.Final Answer:
The CPU wakes up and continues execution after sleep_disable() -> Option DQuick Check:
Interrupt wakes CPU = C [OK]
- Thinking CPU resets on interrupt
- Assuming CPU stays asleep ignoring interrupts
- Confusing sleep_disable() effect
set_sleep_mode(SLEEP_MODE_IDLE); sleep_enable(); cli(); // disable interrupts sleep_cpu(); sleep_disable();What is the main problem?
Solution
Step 1: Check interrupt status before sleep
Interrupts are disabled withcli();, so no interrupt can wake CPU.Step 2: Understand wake-up mechanism
CPU wakes from sleep only via interrupts; disabling interrupts prevents wake-up.Final Answer:
Interrupts are disabled, so CPU cannot wake up -> Option BQuick Check:
Interrupts disabled = no wake-up [OK]
- Thinking sleep mode IDLE stops CPU
- Believing sleep_disable() controls wake-up
- Ignoring interrupt enable/disable status
Solution
Step 1: Understand power saving vs peripheral activity
SLEEP_MODE_PWR_DOWN saves max power but stops watchdog timer. SLEEP_MODE_STANDBY saves power and keeps watchdog running.Step 2: Compare sleep modes
SLEEP_MODE_IDLE and SLEEP_MODE_ADC keep more peripherals active, so use more power. SLEEP_MODE_STANDBY balances max power saving and watchdog activity.Final Answer:
SLEEP_MODE_STANDBY -> Option AQuick Check:
Max power save + watchdog running = STANDBY [OK]
- Choosing PWR_DOWN which stops watchdog
- Confusing IDLE with max power saving
- Assuming ADC mode saves most power
Ready to prove it?
Pass the test and this pattern moves unknown
