임베디드 시스템이나 고속 데이터 처리를 다루다 보면 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는 옮기게 하자