📖 Scenario: You are working on a small embedded system that can wake up from sleep mode using different sources like a timer, a button press, or a sensor signal.To save power, the system should only wake up from the sources you enable.
🎯 Goal: You will write a simple program to configure which wake-up sources are enabled using a bitmask variable.This will help the system know which events should wake it up.
📋 What You'll Learn
Create a variable to hold the wake-up sources configuration.
Define constants for each wake-up source using bit flags.
Set a configuration variable to enable specific wake-up sources using bitwise OR.
Print the final configuration value.
💡 Why This Matters
🌍 Real World
Embedded devices often need to save power by sleeping and waking only on certain events. Configuring wake-up sources correctly is essential for battery life and responsiveness.
💼 Career
Understanding bitwise operations and hardware configuration is key for embedded systems engineers and firmware developers working on low-power devices.
Progress0 / 4 steps
1
Define wake-up source constants
Define three constants called WAKEUP_TIMER, WAKEUP_BUTTON, and WAKEUP_SENSOR with values 0x01, 0x02, and 0x04 respectively.
Embedded C
Hint
Use #define to create constants with the exact names and values.
2
Create wake-up configuration variable
Create an unsigned char variable called wakeup_config and initialize it to zero.
Embedded C
Hint
Use unsigned char wakeup_config = 0; to create the variable.
3
Enable timer and button wake-up sources
Set wakeup_config to enable both WAKEUP_TIMER and WAKEUP_BUTTON using the bitwise OR operator.
Embedded C
Hint
Use | to combine the flags.
4
Print the wake-up configuration
Write a printf statement to print the value of wakeup_config as a hexadecimal number with 0x prefix.
Embedded C
Hint
Use printf("Wake-up configuration: 0x%02X\n", wakeup_config); to print the value.
Practice
(1/5)
1. Which of the following is a common wake-up source in embedded C devices?
easy
A. GPIO pin interrupt
B. Floating point calculation
C. String concatenation
D. File system read
Solution
Step 1: Understand wake-up sources
Wake-up sources are hardware events that can wake a device from sleep mode, such as GPIO interrupts or timers.
Step 2: Identify valid wake-up sources
GPIO pin interrupts are commonly used as wake-up sources because they detect external signals.
Final Answer:
GPIO pin interrupt -> Option A
Quick Check:
Wake-up source = GPIO pin interrupt [OK]
Hint: Wake-up sources are hardware events like GPIO or timers [OK]
Common Mistakes:
Confusing software operations with hardware wake-up sources
Thinking file operations can wake embedded devices
Assuming calculations can trigger wake-up
2. Which syntax correctly enables a GPIO pin as a wake-up source in embedded C?
easy
A. enable_wakeup(GPIO_PIN_5);
B. GPIO_WAKEUP_ENABLE(5);
C. wakeup_enable(GPIO5);
D. set_wakeup_pin(5);
Solution
Step 1: Recognize common embedded C macros
Macros often use uppercase and underscores, like GPIO_WAKEUP_ENABLE(pin).
Step 2: Match syntax style
GPIO_WAKEUP_ENABLE(5); matches typical embedded C macro style for enabling wake-up on GPIO pin 5.
Final Answer:
GPIO_WAKEUP_ENABLE(5); -> Option B
Quick Check:
Macro style = GPIO_WAKEUP_ENABLE(5) [OK]
Hint: Look for uppercase macro style for hardware config [OK]
Common Mistakes:
Using lowercase function names not defined in embedded C
Confusing parameter formats
Missing parentheses or semicolons
3. What will be the output of the following code snippet?
void configure_wakeup() {
WAKEUP_ENABLE_TIMER(1000); // 1000 ms
WAKEUP_ENABLE_GPIO(3);
}
int main() {
configure_wakeup();
if (is_wakeup_source(GPIO_3)) {
printf("Wakeup by GPIO 3\n");
} else if (is_wakeup_source(TIMER)) {
printf("Wakeup by Timer\n");
} else {
printf("No wakeup source\n");
}
return 0;
}
medium
A. Wakeup by GPIO 3
B. Wakeup by Timer
C. No wakeup source
D. Compilation error
Solution
Step 1: Analyze function and macros usage
The code uses WAKEUP_ENABLE_TIMER and WAKEUP_ENABLE_GPIO macros but does not define or include them, causing compilation errors.
Step 2: Check function calls and conditions
Functions like is_wakeup_source and constants GPIO_3, TIMER are undefined, leading to compilation failure.
Final Answer:
Compilation error -> Option D
Quick Check:
Undefined macros/functions cause compilation error [OK]
Hint: Undefined macros or functions cause compile errors [OK]
Common Mistakes:
Assuming macros are predefined without headers
Ignoring missing function definitions
Confusing runtime output with compile errors
4. Identify the error in this wake-up source configuration code:
The code enables GPIO pin 2 twice, which can cause conflicts or redundant configuration.
Step 2: Check timer configuration and function structure
Timer value 500 ms is valid; no return needed for void function.
Final Answer:
Duplicate GPIO wake-up enable causes conflict -> Option A
Quick Check:
Duplicate GPIO enable = conflict [OK]
Hint: Avoid enabling same GPIO wake-up twice [OK]
Common Mistakes:
Thinking timer value is invalid
Expecting return in void function
Ignoring duplicate hardware config issues
5. You want to configure a device to wake up either by GPIO pin 4 or after 2 seconds using a timer. Which code snippet correctly sets both wake-up sources?
hard
A. WAKEUP_CONFIG(GPIO4 | TIMER_2S);
B. WAKEUP_ENABLE_TIMER(2);
WAKEUP_ENABLE_GPIO(4);
C. WAKEUP_ENABLE_GPIO(4);
WAKEUP_ENABLE_TIMER(2000);
D. WAKEUP_ENABLE_GPIO(4, 2000);
Solution
Step 1: Understand separate wake-up source configuration
GPIO and timer wake-up sources are usually enabled with separate calls specifying pin and time in milliseconds.
Step 2: Evaluate options for correctness
WAKEUP_ENABLE_GPIO(4);
WAKEUP_ENABLE_TIMER(2000); correctly enables GPIO pin 4 and timer with 2000 ms (2 seconds). WAKEUP_ENABLE_TIMER(2);
WAKEUP_ENABLE_GPIO(4); uses 2 (seconds) instead of milliseconds. WAKEUP_ENABLE_GPIO(4, 2000); incorrectly combines parameters. WAKEUP_CONFIG(GPIO4 | TIMER_2S); uses an undefined macro.
Final Answer:
WAKEUP_ENABLE_GPIO(4);
WAKEUP_ENABLE_TIMER(2000); -> Option C
Quick Check:
Separate calls with correct units = WAKEUP_ENABLE_GPIO(4);
WAKEUP_ENABLE_TIMER(2000); [OK]
Hint: Enable GPIO and timer separately with correct units [OK]
Common Mistakes:
Using seconds instead of milliseconds for timer
Combining GPIO and timer in one call
Using undefined macros
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.