Bird
Raised Fist0
Embedded Cprogramming~5 mins

DMA with UART for bulk transfer in Embedded C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: DMA with UART for bulk transfer
O(n)
Understanding Time Complexity

When using DMA with UART for bulk data transfer, it's important to understand how the time to complete the transfer changes as the data size grows.

We want to know how the program's work increases when sending more data using DMA and UART.

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


// Start DMA transfer of data buffer over UART
void start_dma_uart_transfer(uint8_t *buffer, size_t length) {
    // Configure DMA source and destination
    DMA_SetSource(buffer);
    DMA_SetDestination(UART_DR);
    DMA_SetLength(length);
    DMA_Enable();
    UART_EnableDMA();
    // Transfer happens in background
}
    

This code starts a DMA transfer that sends a block of data over UART without CPU intervention during the transfer.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: DMA hardware moves each byte from memory to UART data register.
  • How many times: Once per byte in the data buffer (length times).
How Execution Grows With Input

The DMA transfers each byte one by one in the background, so the total work grows as the number of bytes increases.

Input Size (n)Approx. Operations
1010 byte transfers
100100 byte transfers
10001000 byte transfers

Pattern observation: The number of operations grows directly with the size of the data.

Final Time Complexity

Time Complexity: O(n)

This means the time to transfer data grows linearly with the amount of data being sent.

Common Mistake

[X] Wrong: "DMA transfers all data instantly regardless of size."

[OK] Correct: DMA still moves each byte one at a time; larger data means more transfers and more time.

Interview Connect

Understanding how DMA offloads work from the CPU but still depends on data size helps you explain efficient data handling in embedded systems.

Self-Check

"What if we used interrupt-driven UART instead of DMA? How would the time complexity change?"

Practice

(1/5)
1. What is the main advantage of using DMA with UART for bulk data transfer?
easy
A. It reduces CPU load by handling data transfer automatically.
B. It increases the UART baud rate beyond hardware limits.
C. It encrypts data during transmission for security.
D. It allows UART to work without any clock signal.

Solution

  1. Step 1: Understand DMA role in UART transfer

    DMA transfers data directly between memory and UART without CPU intervention for each byte.
  2. Step 2: Identify the benefit of reduced CPU load

    This frees CPU to perform other tasks while data moves in background.
  3. Final Answer:

    It reduces CPU load by handling data transfer automatically. -> Option A
  4. Quick Check:

    DMA offloads CPU [OK]
Hint: DMA moves data without CPU, so CPU load drops [OK]
Common Mistakes:
  • Thinking DMA increases UART speed beyond hardware limits
  • Confusing DMA with encryption or clock control
  • Assuming UART can work without clock signal
2. Which of the following code snippets correctly enables UART DMA transmission in embedded C?
easy
A. UART->CR3 |= USART_CR3_DMAT;
B. UART->CR1 |= USART_CR1_DMAT;
C. DMA->CR |= DMA_CR_EN;
D. UART->BRR = USART_BRR_DMAT;

Solution

  1. Step 1: Identify UART register for DMA transmit enable

    UART control register 3 (CR3) contains the DMAT bit to enable DMA for transmission.
  2. Step 2: Check correct bit and register usage

    Setting USART_CR3_DMAT in UART->CR3 enables DMA transmit requests.
  3. Final Answer:

    UART->CR3 |= USART_CR3_DMAT; -> Option A
  4. Quick Check:

    DMA transmit enable bit is in CR3 [OK]
Hint: DMA transmit enable is in UART CR3 register [OK]
Common Mistakes:
  • Using CR1 instead of CR3 for DMA transmit enable
  • Confusing DMA channel enable with UART DMA request enable
  • Setting baud rate register instead of control bits
3. Given this DMA setup code for UART RX bulk transfer, what will be the value of DMA->NDTR after starting the transfer?
DMA->CCR = DMA_CCR_MINC | DMA_CCR_TCIE;
DMA->CNDTR = 100;
DMA->CPAR = (uint32_t)&UART->RDR;
DMA->CMAR = (uint32_t)rx_buffer;
DMA->CCR |= DMA_CCR_EN;
medium
A. 0
B. 99
C. 100
D. Undefined

Solution

  1. Step 1: Understand DMA CNDTR register role

    CNDTR holds the number of data items to transfer; initially set to 100.
  2. Step 2: Check when CNDTR changes

    CNDTR decrements only after each data transfer, so right after enabling DMA, it remains 100.
  3. Final Answer:

    100 -> Option C
  4. Quick Check:

    DMA transfer count starts at set value = 100 [OK]
Hint: DMA count decrements after transfer, not immediately [OK]
Common Mistakes:
  • Assuming CNDTR decrements immediately on enable
  • Confusing CNDTR with current data register
  • Thinking CNDTR resets to zero on start
4. Identify the error in this DMA UART transmit setup code snippet:
DMA->CCR = DMA_CCR_MINC | DMA_CCR_DIR;
DMA->CNDTR = 50;
DMA->CPAR = (uint32_t)&UART->TDR;
DMA->CMAR = (uint32_t)tx_buffer;
DMA->CCR |= DMA_CCR_EN;
UART->CR3 &= ~USART_CR3_DMAT;
medium
A. DMA direction bit is set incorrectly for UART transmit.
B. UART DMA transmit request is disabled after enabling DMA.
C. Memory increment mode is not enabled.
D. Peripheral address points to wrong UART register.

Solution

  1. Step 1: Check UART DMA transmit enable bit

    UART->CR3 must have DMAT bit set to enable DMA requests for transmit.
  2. Step 2: Identify disabling of DMAT bit

    Code clears DMAT bit after DMA enable, disabling UART DMA transmit requests, so transfer won't start.
  3. Final Answer:

    UART DMA transmit request is disabled after enabling DMA. -> Option B
  4. Quick Check:

    DMAT bit must be set for DMA transmit [OK]
Hint: Keep UART DMAT bit set to allow DMA transmit [OK]
Common Mistakes:
  • Disabling UART DMA transmit request after DMA enable
  • Confusing DMA direction bit meaning
  • Forgetting to enable memory increment mode
5. You want to transfer 256 bytes from a memory buffer to UART using DMA. Which sequence correctly sets up the DMA and UART for this bulk transfer?
hard
A. Set DMA source to UART RDR, destination to buffer, length 256; enable UART DMAR bit; enable DMA channel.
B. Set DMA source to UART TDR, destination to buffer, length 256; enable UART DMAR bit; enable DMA channel.
C. Set DMA source to buffer, destination to UART RDR, length 256; enable UART DMAT bit; enable DMA channel.
D. Set DMA source to buffer, destination to UART TDR, length 256; enable UART DMAT bit; enable DMA channel.

Solution

  1. Step 1: Identify direction for UART transmit DMA

    For UART transmit, DMA source is memory buffer, destination is UART TDR register.
  2. Step 2: Enable UART DMA transmit request and DMA channel

    Set UART DMAT bit to enable DMA requests on transmit, then enable DMA channel to start transfer.
  3. Final Answer:

    Set DMA source to buffer, destination to UART TDR, length 256; enable UART DMAT bit; enable DMA channel. -> Option D
  4. Quick Check:

    Memory to UART TDR + DMAT enabled [OK]
Hint: For UART TX DMA: memory source, UART TDR destination, enable DMAT [OK]
Common Mistakes:
  • Confusing UART TDR and RDR registers for source/destination
  • Using DMAR bit for transmit instead of DMAT
  • Setting DMA direction opposite to data flow
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard