임베디드 시스템에서의 DMA — CPU를 임베디드 시스템은 제한된 자원 속에서 동작해야 한다. CPU의 연산 능력, 메모리 용량, 전력 소모 등 모든 요소가 제약을 받기 때문에, 가능한 한 효율적인 리소스 활용이 필수다. 이 상황에서 DMA(Direct Memory Access)는 매우 유용한 수단이 된다.
⸻
DMA가 필요한 이유
일반적인 데이터 전송은 CPU가 직접 처리한다. 예를 들어, 센서에서 데이터를 읽어 RAM에 저장하려면 CPU가 다음 작업을 수행해야 한다:
1. 센서로부터 데이터를 읽는다.
2. 해당 데이터를 버퍼에 저장한다.
3. 이 작업을 계속 반복한다.
문제는 이 과정에서 CPU가 다른 일을 하지 못한다는 점이다. 특히 데이터 전송이 빈번하거나 대량인 경우, CPU의 대부분을 이 작업에 소비하게 된다. 이런 상황을 피하기 위해 DMA가 도입된다.
⸻
DMA의 기본 동작 방식
DMA는 주변 장치와 메모리 사이의 데이터 전송을 CPU의 개입 없이 처리할 수 있도록 한다. 동작 순서는 다음과 같다:
1. CPU가 DMA 컨트롤러에게 전송 설정을 전달한다.
(출발지 주소, 목적지 주소, 전송 크기, 전송 방식 등)
2. 설정이 끝나면 DMA가 데이터를 직접 전송한다.
3. 전송이 완료되면 인터럽트를 통해 CPU에 알린다.

이 구조에서는 CPU가 데이터를 직접 옮기지 않는다. 대신 CPU는 DMA를 세팅하고, 전송이 완료되면 후처리를 담당한다. 그동안 CPU는 다른 중요한 작업을 처리할 수 있다.
⸻
임베디드 환경에서 DMA가 유용한 이유
임베디드 시스템에서는 자원 효율성이 핵심이다. DMA는 다음과 같은 장점으로 자원 사용을 최적화한다:
• CPU 오프로딩: 데이터 전송을 DMA에 맡김으로써 CPU가 실제 연산이나 논리 처리에 집중할 수 있다.
• 빠른 반응성: 외부 인터럽트에 대한 응답 시간 단축. 데이터가 빠르게 처리되므로 시스템 전체 반응 속도가 좋아진다.
• 저전력 운용: 일부 MCU는 DMA 전송 중 CPU를 슬립 모드로 전환할 수 있어 전력 소모를 줄일 수 있다.
• 실시간 처리 용이: 대용량 데이터 스트림(예: ADC 샘플, UART 수신 등)을 실시간으로 수집하고 처리하기에 적합하다.
⸻
대표적인 활용 예
1. ADC + DMA
아날로그 센서 데이터를 주기적으로 샘플링하고 버퍼에 저장할 때 사용된다. ADC 변환이 끝날 때마다 DMA가 자동으로 메모리에 기록한다.
2. UART + DMA
대용량 시리얼 통신에서 DMA를 사용하면 CPU가 바이트 단위로 수신 데이터를 읽지 않아도 된다. 버퍼 크기 단위로 수신 데이터를 자동 저장할 수 있어 효율적이다.
3. SPI/I2C + DMA
플래시 메모리에서 대량 데이터를 읽거나 디스플레이로 빠르게 전송할 때 사용된다.
⸻
DMA 설정 시 고려할 점
DMA를 사용할 때는 몇 가지 주의할 점이 있다:
• 버퍼 정렬: 일부 DMA 컨트롤러는 버퍼가 특정 메모리 정렬을 만족해야 한다. 예를 들어 4바이트 정렬 등이 필요할 수 있다.
• 동기화: DMA 전송이 끝나기 전에 데이터를 참조하면 문제가 생긴다. 반드시 전송 완료 인터럽트를 확인하거나, 상태를 체크해야 한다.
• 메모리 접근 권한: DMA가 접근 가능한 메모리 영역인지 확인해야 한다. 일부 영역은 CPU 전용일 수 있다.
⸻
마무리
임베디드 시스템에서 DMA는 선택이 아닌 필수에 가깝다. 단순한 하드웨어 기능 같지만, 제대로 활용하면 시스템 전체 효율을 극적으로 끌어올릴 수 있다. 마이크로컨트롤러 하나로 다채로운 주변 장치를 다뤄야 하는 환경에서 DMA는 CPU의 조력자 역할을 한다.
'임베디드' 카테고리의 다른 글
Flash 제어 및 동작 방식 (0) | 2025.04.17 |
---|---|
Trace32 디버깅에 대해서 (0) | 2025.03.23 |
GDB 디버깅에 대해서 (0) | 2025.03.22 |
Endianess란 무엇일까? Big-Endian 과 Little-Endian (0) | 2025.03.21 |
ARM Exception Level(EL) 알아보기(2): EL2(하이퍼바이저)와 EL3(보안 모드) (0) | 2025.03.19 |