Direct Memory Access. CPU 가 바이트를 하나씩 복사하는 대신 전용 컨트롤러가 알아서 옮긴다.
왜 필요한가
VSS 오디오가 대표적이다. 48 kHz 스테레오면 초당 96,000 샘플을 코덱에 넘겨야 하는데, 이걸 CPU 가 인터럽트로 하나씩 처리하면 CPU 가 그 일만 하다 끝난다.
DMA 를 쓰면 CPU 는 버퍼를 채워 두기만 하고, 실제 전송은 하드웨어가 한다. 그래서 오디오를 내면서 상태 종합 태스크도 돌 수 있다.
이 프로젝트에서 쓰이는 곳
오디오 출력 메모리 → I2S 코덱 끊기면 소리가 튄다(underrun)
ADC 스캔 ADC → 메모리 여러 채널을 CPU 개입 없이
CAN 수신 주변장치 → 링버퍼 프레임 손실 방지
주의 — 버퍼가 살아 있어야 한다
DMA 가 참조하는 버퍼를 스택에 잡고 함수가 반환하면, DMA 는 이미 사라진 메모리를 계속 읽는다. 정적 버퍼나 힙이어야 하고, 임베디드에서는 보통 정적으로 잡는다.
그리고 DMA 가 쓴 메모리를 CPU 가 읽을 때 캐시 일관성을 신경 써야 하는 칩도 있다.