본문 바로가기
DMA (Direct Memory Access) - CPU몰래 영차영차

드디어 DMA에요. 기다리셨나요? - 설마 - DMA라고 해서 뭐가 특별한 건 아니고요.
 
두 개의 Hardware Device간의 데이터 블록을 Trasfer하는 트릭으로 사용되는 DMA. DNA아니구요. 직접 메모리 억세스라고 해석되는 방법인데요, CPU가 데이터를 전송할 때 일일이 신경을 쓰면 그만큼 속도도 나오지 않을 뿐 더러, CPU가 다른 일을 못하고 데이터 전송하는 일을 해야 하니까, 전체적인 System 성능에 악영향을 미치는 게 되지요.

한가지 용어 선정을 또 해야겠는데요, DMA는 이런 식으로 CPU와 상관없이 전송하는걸 DMA라고 부르고요, 실제 CPU가 Control하는 건 DMAC (DMA Controller)를 Control 해주는 과정을 의미해요. 자, 차이점을 한번 볼까요?

DMA는 source와 destination, 그리고 전송할 바이트수만 주면 알아서 data를 전송해 주고요, Processor가 전혀 신경 쓰지 않아도 된다고 봐야 해요. DMA는 모든 data 전송이 끝나면 HW interrupt로 CPU에게 완료를 알려주는 구조에요. 오 간단하죠. Device를 Memory Address처럼 Control 할 수 있으니까, 이런 게 가능해 지는 거죠. 이렇게 하려면, DMA는 CPU와의 Interface로 여러 가지 Register들을 갖는데, 필요한 것들이 있겠죠. Source의 주소를 알려주는 Source Register, Destination의 주소를 알려주는 Dest_Register, 몇 개나 보낼 건지 알려주는 Couter_Register, 마지막으로 전체적인 DMA관련한 Control을 해주는 Control_Register가 필요하겠지요? Control_Register에는 전송시작 명령을 내릴 수 있는 bit나, 어떤 방식으로 Data 전송을 할 것인지를 정해줄 수 있는 bit등이 정의되어 있어요. DMAC가 일을 끝내면 Interrupt를 통해서 CPU에 알려주고요, 이런 경우에 이미~ 훑어 보았던 ISR call back함수를 등록해 놓거나, call back ISR이 DMA를 처리하는 Task에 signal을 날려주거나 하는 구현이 가능해 지는 거죠.

자, 그냥 넘어가면 심심하니까, 그럼 실제로 Transfer가 어떻게 이루어 지는지 볼까요? 이 녀석도 좋은 DMAC같은 경우는 Register로 설정이 가능하고요, 가능하지 않은 녀석도 있어요. 한가지 방식만 지원하는 싸구려 DMA같은 거요. ㅋ 뭐, 싸구려라고 해서 나쁜 건 아니고 어디에 쓸 건지에 따라서 틀리겠죠! 두 가지 Transfer 방식이 있는데 하나는 Single Address Mode가 있고요, 이건 한번에 읽고 쓰고를 한번씩 해주는 모드이고요, (Read는 Source에서, Write는 Destination에 해주겠죠?) Counter를 1씩 줄여나가면서 0이 될 때 까지 쓰는거죠. 다 끝나면 DMA_INT를 이용해서 CPU에게 알려주고요,

Burst Address Mode는 무작정 시작하면 끝까지 Read Write를 무한 반복 하는 거에요. 이 녀석도 마찬가지로 Counter를 1씩 줄여나가면서 0이 될 때까지 하는 거죠. 다 끝나면 마찬가지로 DMA_INT를 이용해서 CPU에게 알려주고요.

Burst mode가 더 좋은데, 왜 이런 Single Addressing Mode같은 녀석을 쓰느냐 하면 워낙 큰 Data를 계속 사용하는 경우라면 DMA가 Bus를 계속 장악하고 있어서 CPU가 또 놀게 되는 경우가 발생하는 거죠. 그래서 중간에 다른 녀석이 Arbiter를 통해서 치고 들어 올 수 있도록 배려하는 Mode인 거고요. 일장 일단이 있다고 봐야 할까요? 일단은 엄청 Simple한 DMA case를 봤는데요. 뭐, DMAC Spec을 찾아보면 이런 원리 더하기 이상한 기능들도 많이 지원하니까, 역시나 Spec을 잘 찾아보시는 것이 신상에 좋아요. 안 그러면 어느 순간에 아뿔싸! 하는 경우가 발생할 지도 모르니까요. DMA를 쓰려면 Cache와 엮여서 아주 조심해서 사용해야 해요. 안 그러면 곤란에 빠지는 경우도 있다니까요. 

 이런 DMAC에는 여러 개의 DMA Channel을 지원하도록 하는 게 보통인데, 그런걸 Multichannel DMA라고 불러요. Multi channel DMA를 통해서 각 Channel을 특별한 Device에 연결해 놓고서 사용하는 경우도 있어요. 그렇게 쓰면 CPU가 동시에 큰 Data를 여기저기 Device에 마구 뿌릴 수 도 있는 거지요?

친절한 임베디드 시스템 개발자 되기 강좌 글 전체 리스트 (링크) -



댓글





친절한 임베디드 개발자 되기 강좌 글 전체 리스트 (링크) -