길고 짧은 것은 DMA가 CPU가 기본 속도로 효과적으로 작동하는 반면 주변 장치는 기본 속도로 효과적으로 작동한다는 것입니다. 이 예에서 대부분의 숫자는 구성됩니다.
ADC에서 주기적으로 데이터를 수집하는 두 가지 옵션을 비교해 보겠습니다.
- 인터럽트의 일부로 ADC를 설정할 수 있습니다 (정기 또는 기타)
- 버퍼를 생성하고 ADC 판독 값을 버퍼로 전송하도록 DMA에 지시 할 수 있습니다.
1000 개의 샘플을 ADC에서 RAM으로 옮깁니다.
옵션 1 사용 : 모든 샘플에 대해
- 인터럽트를 입력하는 데 12주기가 소비됩니다.
- 읽기 adc
- 램에 저장
- 인터럽트를 종료하는 데 12주기가 소비됩니다.
이 인터럽트 기능이 76 개의 명령 인 것처럼 가정하고, 전체 사이클의 길이는 단일 사이클 실행 (가장 좋은 경우) 인 경우 100 개의 명령입니다. 이는 옵션 1이 실행하는 데 100,000주기의 CPU 시간을 소비 함을 의미합니다.
옵션 2 : DMA는 1000 개의 ADC 샘플을 수집하도록 구성되어 있습니다. ADC에 타이머 카운터에서 하드웨어 트리거가 있다고 가정 해 봅시다.
- ADC 및 DMA는 1000 샘플 데이터를 램으로 전송
- 1000 샘플 후 DMA가 CPU를 중단
- 인터럽트를 입력하는 데 12주기가 소비됩니다.
- 코드가 발생합니다 (DMA에 RAM을 덮어 쓰라고 알려줍니다)
- 인터럽트를 종료하는 데 12주기가 소비됩니다.
전체 인터럽트를 척하는 것은 (입력 및 종료 오버 헤드로) 100 개의 단일 사이클 명령입니다. DMA를 사용하면 100 개의 사이클 만 사용하여 동일한 1000 개의 샘플을 저장합니다.
이제 DMA가 버스에 액세스 할 때마다 CPU와 DMA 사이에 분쟁이있을 수 있습니다. CPU는 DMA가 끝날 때까지 기다려야 할 수도 있습니다. 그러나 DMA가 끝날 때까지 기다리는 것은 ADC를 서비스하기 위해 CPU를 잠그는 것보다 훨씬 짧습니다. CPU 코어 클럭이 2x 버스 클럭 인 경우 CPU는 DMA가 완료되기를 기다리는 몇 개의 코어주기를 낭비 할 수 있습니다. 이는 전송의 유효 실행 시간이 1000 (CPU가 대기하지 않는다고 가정)과 9000주기 사이임을 의미합니다. 여전히 100,000 사이클보다 낫습니다.