임베디드 시스템

DMA(Direct Memory Access)란 무엇인가?

lko9911_ 2025. 12. 31. 13:17

임베디드 시스템이나 고속 데이터 처리를 다루다 보면 DMA라는 용어를 자주 만나게 됩니다.
UART, ADC, SPI, 카메라, 센서 데이터를 다룰 때 CPU 개입 없이 메모리로 바로 전송한다는 설명이 따라붙죠.

 

이번 글에서는

  • DMA의 개념
  • 왜 필요한지
  • CPU 방식과의 차이
  • 실제 MCU/임베디드에서 어떻게 쓰이는지
    를 직관적으로 정리해 보겠습니다.

 

1. DMA란?

DMA (Direct Memory Access)주변장치(Peripheral)가 CPU를 거치지 않고 메모리에 직접 데이터를 전송할 수 있게 해주는 방식입니다.

 

- 기존 방식 (CPU 개입)

 
Peripheral → CPU → Memory

 

- DMA 방식

 
Peripheral → DMA Controller → Memory

 

즉, 데이터 복사 일을 CPU 대신 DMA 컨트롤러가 맡는 구조입니다.


2. 왜 DMA가 필요한가?

문제 상황

CPU가 직접 데이터를 옮기면:

  • 인터럽트 폭증
  • CPU 사용률 증가
  • 실시간 처리 성능 저하

특히 아래 상황에서 문제가 커집니다.

  • ADC 고속 샘플링
  • UART 대량 수신
  • 카메라 / 이미지 스트림
  • 센서 연속 데이터

DMA의 장점

- CPU 부하 감소
- 고속 데이터 전송
- 실시간성 향상
- 전력 소모 감소

CPU는 연산과 제어,
DMA는 반복적인 데이터 이동 담당


3. CPU 방식 vs DMA 방식 비교

 

데이터 이동 CPU가 직접 수행 DMA 컨트롤러
CPU 부하 높음 매우 낮음
속도 느림 빠름
실시간성 나쁨 좋음
인터럽트 잦음 전송 완료 시 1회

4. DMA 동작 흐름

1. CPU가 DMA 설정

  • 소스 주소 (Peripheral / Memory)
  • 목적지 주소 (Memory)
  • 데이터 크기
  • 전송 모드

2. DMA 전송 시작
3. DMA가 데이터 전송 수행
4. 전송 완료 인터럽트 발생
5. CPU가 결과 처리

 

CPU는 중간 과정에 개입하지 않음


5. DMA 전송 모드

🔹 Normal Mode

  • 설정한 크기만큼 1회 전송
  • 완료 후 정지

🔹 Circular Mode

  • 버퍼 끝에 도달하면 다시 처음으로
  • 연속 데이터 스트림에 사용
  • ADC, 센서 데이터에 매우 자주 사용

🔹 Double Buffer (핑퐁 버퍼)

  • 버퍼 A 처리 중 버퍼 B 수신
  • 끊김 없는 스트리밍 가능

6. 실제 사용 예시

✔ UART + DMA

  • 대량 문자열 수신
  • GPS, 통신 모듈 데이터

✔ ADC + DMA

  • 연속 아날로그 신호 샘플링
  • 오실로스코프, 센서 계측

✔ SPI / I2C + DMA

  • 고속 센서 데이터
  • IMU, 카메라 모듈

✔ 카메라 / 영상 처리

  • 프레임 버퍼로 직접 저장
  • CPU는 영상 처리만 담당

8. DMA 사용 시 주의점 ⚠️

❗ 메모리 정렬 문제
❗ Cache (특히 Cortex-A, Raspberry Pi)
❗ 버퍼 오버런
❗ 동기화 문제

“DMA는 빠르지만, 잘못 쓰면 디버깅이 매우 어려움”



9. DMA는 언제 꼭 써야 할까?

✔ 데이터가 많다
✔ 연속적으로 들어온다
✔ 실시간성이 중요하다
✔ CPU가 바쁘다

 


 

마무리

 

DMA는 단순한 최적화 기법이 아니라,
임베디드 시스템의 구조 자체를 바꾸는 핵심 기술입니다.

CPU는 생각하게 두고
DMA는 옮기게 하자