임베디드

DMA(Direct Memory Access) 에 대해서

embeddedworld 2025. 4. 19. 18:08


임베디드 시스템에서의 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에 알린다.

DMA 동작방식


이 구조에서는 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의 조력자 역할을 한다.