대개, 실제 CPU 타임을 건드리지 않고 접근해야 할 메모리는 크다.


DMA 컨트롤러는 두 세가지 단계로 스케쥴을 처리한다.

1. 작업 할당.

2. 작업 종료시 재할당 혹은 스케쥴 종료.


그래서 프로그래머들은

SetDMAEnable(ISR 의 주소) 인터럽트 서비스 루틴을 셋팅하고 인터럽트를 활성화할 함수

SetDMATask(DMA 컨트롤러 핸들, 전송을 시작할 메모리 주소, 크기) 함수

DMAHandler(핸들, 주소, 크기등은 옵션)

이상과 같은 세 가지 함수를 준비하게 되고 (더 쪼개도 무방하지만)

DMAHandler 안에선, 인터럽트 disable, 작업의 재할당 혹은 스케쥴 종료, 인터럽트 enable

등을 구현하게 된다.


요약하면 여기부터 이만큼 전송해라. 하고 task 예약하고 땡.

다했는디요? 하고 응답오면 또시키든지 완료하든지.


개발 환경마다 조금씩 차이는 있긴 하지만, 개념은 다 똑같음.

당연히 DMAHandler (ISR) 은, DMA 컨트롤러가 전송을 완료 했을때 발생하는 인터럽트에 의해 트리거 되는 call back 형태고,

그 안에서 CPU타임을 오래 잡아먹으면 성능이 급격히 떨어지니

간단하게 최적화해서 짜 줘야 하지.