Receiving a byte over UART in Embedded C - Time & Space Complexity
When receiving a byte over UART, it's important to understand how the time to get data changes as more data arrives.
We want to know how the program's waiting or processing time grows when receiving bytes.
Analyze the time complexity of the following code snippet.
// Wait until data is received
while (!(UART_STATUS_REG & DATA_READY_FLAG)) {
// waiting
}
// Read the received byte
uint8_t received_byte = UART_DATA_REG;
This code waits for one byte to arrive on UART and then reads it.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop checking the data ready flag repeatedly.
- How many times: It repeats until one byte arrives, which depends on the data arrival speed.
Each byte requires waiting until it arrives, so time grows linearly with the number of bytes.
| Input Size (n bytes) | Approx. Operations (wait loops) |
|---|---|
| 10 | About 10 times the wait for one byte |
| 100 | About 100 times the wait for one byte |
| 1000 | About 1000 times the wait for one byte |
Pattern observation: The waiting time grows directly with the number of bytes received.
Time Complexity: O(n)
This means the time to receive bytes grows in a straight line as more bytes come in.
[X] Wrong: "Receiving one byte always takes the same fixed time regardless of data."
[OK] Correct: The code waits actively until data arrives, so if data is slow, waiting time grows and is not fixed.
Understanding how waiting for hardware data scales helps you reason about program responsiveness and efficiency in embedded systems.
"What if we used an interrupt instead of polling the data ready flag? How would the time complexity change?"
Practice
Solution
Step 1: Understand UART communication basics
UART communication involves sending and receiving data one byte at a time between devices.Step 2: Identify receiving action
Receiving a byte means reading one character sent from another device, not sending or configuring settings.Final Answer:
Reading one character sent from another device -> Option AQuick Check:
Receiving byte = Reading one character [OK]
- Confusing receiving with sending data
- Thinking configuration is receiving
- Assuming multiple bytes are received at once
Solution
Step 1: Understand UART status checking
To check if data is ready, we test a status register bit (e.g., RX_READY) using bitwise AND.Step 2: Correct syntax for reading byte
If data is ready, read the byte from the data register. if (UART_STATUS & RX_READY) { byte = UART_DATA; } correctly does this.Final Answer:
if (UART_STATUS & RX_READY) { byte = UART_DATA; } -> Option CQuick Check:
Status & RX_READY then read data [OK]
- Comparing data register to status bits
- Assigning instead of checking bits
- Using wrong registers for status or data
char received_byte;
if (UART_STATUS & RX_READY) {
received_byte = UART_DATA;
}
printf("%c", received_byte);Solution
Step 1: Check condition for data ready
UART_STATUS & RX_READY is true, so the if block executes.Step 2: Assign and print received byte
received_byte is assigned UART_DATA value 0x41, which is ASCII 'A'. printf prints 'A'.Final Answer:
A -> Option BQuick Check:
UART_DATA 0x41 = 'A' printed [OK]
- Assuming no output if condition true
- Confusing hex 0x41 with zero
- Expecting error without syntax issues
char byte;
if (UART_STATUS & RX_READY);
{
byte = UART_DATA;
}Solution
Step 1: Analyze if statement syntax
The semicolon after if condition ends the if statement prematurely.Step 2: Effect of semicolon on code block
The block following runs always, ignoring the if condition, causing logic error.Final Answer:
Semicolon after if condition causes unconditional block execution -> Option AQuick Check:
Semicolon after if = unconditional block [OK]
- Ignoring semicolon after if
- Confusing data and status registers
- Thinking variable must be initialized before if
Solution
Step 1: Understand non-blocking UART receive
Non-blocking means program continues if no data; so check status first.Step 2: Choose correct method
Checking RX_READY bit before reading ensures data is available and avoids waiting.Final Answer:
Check UART status register for RX_READY before reading data -> Option DQuick Check:
Check status before read to avoid blocking [OK]
- Using blocking read causing program to wait
- Reading data without checking status
- Resetting UART unnecessarily
Ready to prove it?
Pass the test and this pattern moves unknown
