Bird
Raised Fist0
Embedded Cprogramming~10 mins

DMA controller concept in Embedded C - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - DMA controller concept
CPU Initiates DMA
↓
DMA Controller Setup
↓
DMA Transfers Data
↓
DMA Signals Completion
↓
CPU Resumes Normal Operation
The CPU sets up the DMA controller, which then transfers data directly between memory and peripherals, freeing the CPU until the transfer completes.
Execution Sample
Embedded C
void dma_transfer(void *src, void *dst, size_t size) {
    DMA->SRC = src;
    DMA->DST = dst;
    DMA->SIZE = size;
    DMA->CTRL |= START;
    while (!(DMA->STATUS & DONE)) {}
}
This code sets up and starts a DMA transfer, then waits until the transfer is done.
Execution Table
StepActionDMA RegistersCPU StatusResult
1CPU sets DMA->SRC to source addressSRC=src_addrCPU idleSource set
2CPU sets DMA->DST to destination addressDST=dst_addrCPU idleDestination set
3CPU sets DMA->SIZE to transfer sizeSIZE=sizeCPU idleSize set
4CPU sets DMA->CTRL START bitCTRL=STARTCPU idleTransfer started
5DMA controller transfers dataSTATUS=busyCPU waitingData moving
6DMA controller sets STATUS DONE bitSTATUS=DONECPU waitingTransfer complete
7CPU detects DMA done, resumes workCTRL=idleCPU activeCPU resumes
💡 DMA STATUS DONE bit set, CPU resumes normal operation
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4After Step 6Final
DMA->SRCundefinedsrc_addrsrc_addrsrc_addrsrc_addrsrc_addrsrc_addr
DMA->DSTundefinedundefineddst_addrdst_addrdst_addrdst_addrdst_addr
DMA->SIZE000sizesizesizesize
DMA->CTRL0000STARTSTARTidle
DMA->STATUS0000busyDONEDONE
CPU Statusactiveidleidleidleidlewaitingactive
Key Moments - 3 Insights
Why does the CPU wait after starting the DMA transfer?
The CPU waits because the DMA controller is busy transferring data (see execution_table step 5), so the CPU pauses until the DMA signals completion.
Does the CPU move the data during DMA transfer?
No, the DMA controller moves data directly between memory and peripherals, freeing the CPU (execution_table step 5 shows DMA doing the transfer).
What signals the CPU that the DMA transfer is complete?
The DMA controller sets the STATUS DONE bit (step 6), which the CPU checks to know it can resume work.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of DMA->CTRL after step 4?
ASTART
Bidle
CDONE
D0
💡 Hint
Check the DMA->CTRL column in execution_table row for step 4
At which step does the CPU resume normal operation?
AStep 5
BStep 6
CStep 7
DStep 4
💡 Hint
Look at the CPU Status and Result columns in execution_table
If DMA->STATUS never sets DONE, what happens to the CPU?
ACPU continues working normally
BCPU waits forever in the while loop
CCPU restarts the DMA transfer
DCPU ignores DMA and proceeds
💡 Hint
Refer to the while loop waiting for DMA->STATUS DONE bit in the code and execution_table step 5
Concept Snapshot
DMA Controller Concept:
- CPU sets source, destination, size in DMA registers
- CPU starts DMA transfer by setting START bit
- DMA controller moves data independently
- CPU waits until DMA signals DONE
- CPU resumes work after transfer completes
Full Transcript
This visual execution trace shows how a DMA controller works in embedded C. The CPU first sets the DMA source, destination, and size registers. Then it starts the transfer by setting the START bit in the control register. The DMA controller takes over and moves data directly between memory and peripherals, freeing the CPU. The CPU waits in a loop checking the DMA status. When the DMA sets the DONE bit, the CPU detects it and resumes normal operation. Variables like DMA->SRC, DMA->DST, DMA->SIZE, DMA->CTRL, and DMA->STATUS change step-by-step as shown. Key moments clarify why the CPU waits and how the DMA signals completion. The quiz tests understanding of register values and CPU behavior during DMA transfer.

Practice

(1/5)
1. What is the main purpose of a DMA controller in embedded systems?
easy
A. To transfer data between memory and peripherals without CPU involvement
B. To execute arithmetic operations faster
C. To manage power consumption of the CPU
D. To handle interrupts from external devices

Solution

  1. Step 1: Understand DMA controller role

    A DMA controller is designed to move data automatically without CPU intervention.
  2. Step 2: Compare options with DMA function

    Only To transfer data between memory and peripherals without CPU involvement describes data transfer without CPU involvement, which matches DMA's purpose.
  3. Final Answer:

    To transfer data between memory and peripherals without CPU involvement -> Option A
  4. Quick Check:

    DMA = data transfer without CPU [OK]
Hint: DMA moves data automatically, freeing CPU [OK]
Common Mistakes:
  • Confusing DMA with CPU arithmetic operations
  • Thinking DMA manages power or interrupts
  • Assuming DMA executes code
2. Which of the following is the correct way to start a DMA transfer in embedded C?
easy
A. dma_start(source, destination, size);
B. start_dma(source, destination, size);
C. DMA_Transfer(source, destination, size);
D. dma_transfer(source, destination, size);

Solution

  1. Step 1: Identify common DMA function naming

    In embedded C, functions often use lowercase with underscores, like dma_transfer.
  2. Step 2: Check syntax correctness

    dma_transfer(source, destination, size); uses a plausible function name and correct parameter order: source, destination, size.
  3. Final Answer:

    dma_transfer(source, destination, size); -> Option D
  4. Quick Check:

    Correct DMA function syntax = dma_transfer(...) [OK]
Hint: DMA functions usually use lowercase with underscores [OK]
Common Mistakes:
  • Using incorrect function names with uppercase letters
  • Wrong parameter order
  • Assuming DMA functions start with 'start_' prefix
3. Given this code snippet, what will be the value of buffer[0] after DMA transfer?
char source[3] = {10, 20, 30};
char buffer[3] = {0, 0, 0};
dma_transfer(source, buffer, 3);
medium
A. 20
B. 0
C. 10
D. 30

Solution

  1. Step 1: Understand dma_transfer behavior

    The function copies data from source to buffer for the given size (3 bytes).
  2. Step 2: Check first element after transfer

    buffer[0] will be assigned source[0], which is 10.
  3. Final Answer:

    10 -> Option C
  4. Quick Check:

    buffer[0] = source[0] = 10 [OK]
Hint: DMA copies source to destination byte-by-byte [OK]
Common Mistakes:
  • Assuming buffer remains zero
  • Mixing up source and destination
  • Using wrong index for buffer
4. Identify the error in this DMA setup code:
uint8_t src[5] = {1,2,3,4,5};
uint8_t dst[5];
dma_transfer(dst, src, 5);
medium
A. Arrays must be declared as volatile
B. Source and destination parameters are swapped
C. Size parameter should be 4, not 5
D. DMA transfer function missing return type

Solution

  1. Step 1: Check parameter order in dma_transfer

    Correct order is source first, then destination.
  2. Step 2: Analyze given code

    Code calls dma_transfer(dst, src, 5), swapping source and destination.
  3. Final Answer:

    Source and destination parameters are swapped -> Option B
  4. Quick Check:

    Correct order = source, destination [OK]
Hint: Source comes before destination in DMA calls [OK]
Common Mistakes:
  • Mixing source and destination arguments
  • Incorrect size parameter
  • Assuming volatile needed for arrays
5. You want to transfer a large array of 1000 integers from memory to a peripheral using DMA. Which approach is best to optimize CPU usage?
hard
A. Split the transfer into multiple smaller DMA transfers of 100 integers each
B. Use a single DMA transfer for all 1000 integers at once
C. Copy data manually using a CPU loop instead of DMA
D. Disable DMA and use interrupts for each integer transfer

Solution

  1. Step 1: Consider CPU load and DMA transfer size

    Very large DMA transfers may block bus or cause latency; splitting reduces impact.
  2. Step 2: Evaluate options for CPU efficiency

    Splitting into smaller chunks allows CPU to handle other tasks between transfers.
  3. Final Answer:

    Split the transfer into multiple smaller DMA transfers of 100 integers each -> Option A
  4. Quick Check:

    Smaller DMA chunks optimize CPU usage [OK]
Hint: Split large DMA transfers to keep CPU responsive [OK]
Common Mistakes:
  • Assuming one big DMA transfer is always best
  • Using CPU loops wastes CPU time
  • Disabling DMA loses its benefits
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