임베디드 CPU에서 DMA의 요점은 무엇입니까?


17

나는 최근에 mbed (LPC1768)로 프로젝트를하고 있었고, DAC를 사용하여 다양한 파도를 출력했습니다. 데이터 시트의 일부를 읽었으며 많은 주변 장치에 DMA가 어떻게 사용되는지에 대해 이야기했습니다. 이것은 유용한 것처럼 보였지만, 더 읽을 때 DMA가 CPU와 동일한 데이터 버스를 사용한다는 것을 알았습니다 (정상적인 것 같습니다). 이것은 DAC가 데이터를 가져 오는 동안 CPU가 메모리와 상호 작용할 수 없다는 것을 의미합니까? 또한 DAC에는 버퍼가 없었기 때문에 (내가 알 수있는 한) DMA를 자주해야하기 때문에 DMA의 요점은 무엇입니까? CPU가 메모리 트랜잭션을 수행 할 수 없다면 무엇을 할 수 있습니까?


8
CPU의 기능을 살펴보고 메모리에 액세스하는 것 이외의 작업을 수행 할 수 있는지 확인하십시오. 내가 할 수있는 몇 개의 CPU를 전해 들었다 결정 또는 계산, 같은 것들을하지 않도록이 모든 ..에서 일반적인 경우
PlasmaHH

CPU가 데이터를 I / O 포트로 전송하거나 작업을 전용 장치에 위임하는 데 시간을 소비해야합니까?
StainlessSteelRat

그렇습니다. CPU는 다른 작업을 수행 할 수 있지만 임베디드 시스템에서는 주변 장치, 특히 I / O 포트와 인터페이스하는 데 많은 시간이 소요됩니다. DMA 전용으로 추가 데이터 버스를 갖는 것이 더 합리적이지 않습니까? 아니면 보통 필요하지 않습니까? 여분의 버스를 원하는 상황은 하드웨어의 한계를 뛰어 넘을 때입니다. 어쨌든 미국 DMA를 원할 때입니다.
BeB00

1
간단한 예를 들어, 직렬 포트에 많은 정보를 인쇄하고 싶다고 가정하십시오. 각 바이트가 전송 될 때까지 앉아서 (느리게), 버퍼에 복사 한 다음, CPU의 인터럽트를 사용하여 포트가 준비되면 (컨텍스트 전환이 느릴 때) 각 바이트를 보내거나 CPU가 다른 작업을 수행하는 동안 DMA 컨트롤러가 데이터를 타임 아웃하도록합니다 (더 빠를 수 있음).
Tom Carpenter

2
거대한 3 피트 길이의 신발을 신은 남자와 "신발이라면 그것을 신으십시오"라는 제목을 보여주는 EDN 표지를 한 번 보았습니다. 요점은, 부품이 필요하지 않은 10 가지, 필요로하는 1 가지, 가격, 설치 공간 및 전력 예산이 모두 적합한 경우에는이를 사용하고 무언가를 찾는 데 시간을 낭비하지 않아야한다는 것입니다. 더 적은 기능으로.
Solomon Slow

답변:


17

LPC1768 데이터 시트 내가 찾은 다음과 같은 따옴표 (중점 광산)있다 :

SSP, I2S- 버스, UART, 아날로그-디지털 및 디지털-아날로그 변환기 주변 장치, 타이머 일치 ​​신호 및 메모리-대화 기와 함께 사용할 수있는 AHB 다층 매트릭스의 8 채널 GPDMA (General Purpose DMA Controller) 메모리 전송.

분할 APB 버스로 CPU와 DMA 사이의 스톨이 적고 높은 처리량

6 페이지의 블록 다이어그램은 AHB 매트릭스와 다음 인용문 사이에 여러 채널이있는 SRAM을 보여줍니다.

LPC17xx에는 총 64kB 온칩 정적 RAM 메모리가 포함되어 있습니다. 여기에는 고속 버스의 CPU 및 DMA 컨트롤러에서 액세스 할 수있는 주 32kB SRAM과 AHB 멀티 레이어 매트릭스 의 별도 슬레이브 포트 에 위치한 각 SRAM 블록 2 개가 추가로 16kB 있습니다 . 이 아키텍처를 통해 CPU 및 DMA 액세스를 동시에 액세스 할 수있는 3 개의 개별 RAM에 분산

그리고 이것은 다음 인용문으로 강화됩니다.

GPDMA는 주변 장치 간, 메모리 대 주변 장치, 주변 장치 대 주변 장치 및 메모리 대 메모리 트랜잭션을 가능하게합니다.

따라서 다른 기능에 기본 SRAM을 사용하는 동안 별도의 SRAM 블록 중 하나 또는 다른 주변 장치에서 DAC로 데이터를 스트리밍 할 수 있습니다.

이러한 종류의 주변 장치 주변 DMA는 메모리 인터페이스가 매우 간단한 작은 부분에서 일반적입니다 (현대 인텔 프로세서와 비교).


고마워, 나는 그것이 가능하다는 것을 몰랐다. 나는 DMA를 처음 접했다. 이는 DAC가 별도의 SRAM에 액세스하는 동안 CPU가 주변 장치에 액세스 할 수 있다는 것을 의미합니까?
BeB00

1
예-이것이 바로 AHB 매트릭스의 목적입니다. 다른 컨트롤러 (CPU, DMA, 이더넷 및 USB와 같은 특정 주변 장치)가 동시에 다른 것에 액세스 할 수 있습니다. 이것이 SRAM에 여러 개의 '포트'가있는 이유입니다.
David

예,이 저렴한 소형 동물의 AHB는 병렬 메모리 뱅크로 인해 미친 메모리 대역폭을 제공합니다. 이더넷, USB2 및 모든 처리량을 최대 처리량으로 실행할 수 있으며 CPU도 인식하지 못합니다 ...
peufeu

또한 썸 코드는 하나의 32 비트 워드에 2 개의 명령어를 넣을 수 있으므로 CPU는 주로 레지스터를 포함하는 수학 또는 연산을 수행 할 때 버스에 액세스 할 필요가 없을 수 있습니다. 다른 한편으로는 M3과 M4가 여러 버스가 있기 때문에 클럭 당 여러 메모리 액세스 (명령 및 데이터)를 수행하십시오.
peufeu

30

길고 짧은 것은 DMA가 CPU가 기본 속도로 효과적으로 작동하는 반면 주변 장치는 기본 속도로 효과적으로 작동한다는 것입니다. 이 예에서 대부분의 숫자는 구성됩니다.

ADC에서 주기적으로 데이터를 수집하는 두 가지 옵션을 비교해 보겠습니다.

  1. 인터럽트의 일부로 ADC를 설정할 수 있습니다 (정기 또는 기타)
  2. 버퍼를 생성하고 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 사이클보다 낫습니다.


2
CPU가 데이터를 저장할 수있는 유일한 장소는 RAM이 아닙니다. 일반적으로 CPU는 작업하기 전에 RAM의 데이터를 레지스터로로드합니다.
Aron

예, 절대적으로 맞습니다. 내 예는 순전히 거친 스케치입니다.
pgvoorhees 2016 년

많은 마이크로 컨트롤러에도 멀티 레이어 버스가 있으므로 동시 작업이 가능합니다. 예 : adc-> ram 및 flash-> register 동시에. 또한 많은 명령이 1 클럭보다 길기 때문에 DMA에 충분한 시간이 있습니다.
Jeroen3

9

주어진주기에서 프로세서와 DMA 컨트롤러가 동일한 버스에 액세스해야하는 경우, 하나 또는 다른 쪽이 기다려야합니다. 그러나 많은 시스템에는 DMA 컨트롤러가 다른 메모리에 액세스하는 동안 CPU가 한 메모리에 액세스 할 수 있도록하는 버스 "브리지"와 함께 별도의 버스가있는 여러 메모리 영역이 있습니다.

또한 많은 CPU가 매주기마다 메모리 장치에 액세스 할 필요가 없습니다. CPU가 일반적으로 3주기 중 2주기에서 메모리에 액세스 해야하는 경우 우선 순위가 낮은 DMA 장치는 메모리 버스가 유휴 상태 일 때주기를 이용할 수 있습니다.

모든 DMA 주기로 인해 CPU가주기 동안 정지되는 경우에도 데이터가 CPU가 들어오는 데이터 항목간에 다른 작업을 수행 할 수있을 정도로 느린 속도에 도달하면 DMA가 여전히 유용 할 수 있습니다. 하지만 항목 별 오버 헤드를 최소화해야 할만큼 충분히 빠릅니다. 예를 들어, SPI 포트가 16 개의 CPU주기마다 1 바이트의 속도로 장치에 데이터를 공급하는 경우, 각 전송에 대해 CPU를 중단하면 거의 모든 시간이 인터럽트 서비스 루틴에 들어가고 돌아 오는 데 소요될 수 있습니다. 실제 작업을 수행합니다. 그러나 DMA를 사용하면 각 DMA 전송으로 인해 CPU가 두주기 동안 정지되는 경우에도 오버 헤드가 13 %로 줄어들 수 있습니다.

마지막으로 일부 CPU에서는 CPU가 절전 모드 인 동안 DMA를 수행 할 수 있습니다. 인터럽트 기반 전송을 사용하려면 시스템이 전송 된 각 데이터 단위에 대해 시스템을 완전히 깨워 야합니다. 그러나 DMA를 사용하면 바이트가 들어올 때마다 슬립 컨트롤러가 메모리 컨트롤러에 몇 클럭을 공급할 수 있지만 나머지는 모두 잠들게하여 전력 소비를 줄일 수 있습니다.


1
LPC1768과 같은 Cortex-M 부품은 플래시에서 명령 디코더까지의 고유 한 메모리 경로를 가지므로 실제로 레지스터 대 레지스터 작업은 CPU가 데이터 메모리에 액세스해야 할 때 사이에 여러 명령을 실행할 수 있음을 의미 할 수 있습니다.
Chris Stratton

5

프로그래머로서 DMA는 데이터를 지원하는 주변 장치와 데이터를주고받는 옵션입니다. SPI 또는 UART와 같은 직렬 주변 장치를 통해 큰 버퍼를 이동하거나 ADC에서 여러 샘플을 수집하는 전형적인 예를 보려면 해당 데이터를 이동하는 세 가지 방법이 있습니다.

  1. 폴링 방법. 다음 바이트에서 레지스터 인 / 아웃 할 수 있도록 레지스터 플래그를 기다리는 곳입니다. 문제는 이것을 기다리는 동안 CPU의 모든 실행을 보류한다는 것입니다. 또는 운영 체제에서 CPU 시간을 공유해야하는 경우 전송 속도가 크게 느려집니다.

  2. 인터럽트 방법. 여기에서 모든 바이트 전송시 실행되는 ISR (인터럽트 서비스 루틴)을 작성하고 전송을 관리하는 ISR에 코드를 작성합니다. CPU는 필요할 때만 ISR을 서비스하기 때문에 CPU 효율성이 높습니다. ISR을 제외한 다른 모든 시간에는 무료로 사용할 수 있습니다. ISR은 또한 전송 속도 측면에서 전송을위한 가장 빠른 옵션 중 하나입니다.

  3. DMA. 소스 / 대상 포인터, 전송 횟수 및 꺼짐으로 DMA를 구성합니다. 전송을 수행하기 위해 버스주기와 CPU 시간을 훔치며 CPU는 그 동안 다른 작업을 자유롭게 수행 할 수 있습니다. 전송이 완료되었음을 나타내는 플래그 또는 인터럽트를 구성 할 수 있습니다. 일반적으로 ISR보다 터치 속도가 빠르고 일반적으로 가장 빠른 전송 옵션입니다.

프로그래머로서 DMA는 코딩하기가 가장 쉽고 본질적으로 가장 빠른 전송 기술이기 때문에 DMA를 선호합니다. 일반적으로 소스 / 목적지 포인터와 전송 및 해제를 위해 몇 개의 레지스터 만 구성하면됩니다. ISR 코드에는 중요한 설계 기술이 필요하고 코딩, 테스트, 검증 등이 필요하기 때문에 DMA 가속 코드보다 ISR 코드 작업에 훨씬 더 많은 시간을 소비합니다. DMA 코드가 훨씬 작고 직접 작성해야하는 코드 상대적으로 사소한 일이며 거래에서 최대 전송 속도를 얻고 있습니다.

필자의 경험에 따르면 최근 Atmel SAM3 / 4 프로세서를 사용하여 DMA는 내 자체 제작의 효율적인 ISR보다 빠르게 터치를 실행합니다. 5msec마다 SPI에서 바이트 더미로 읽는 응용 프로그램이 있습니다. 백그라운드 작업에서 많은 부동 소수점 수학이 발생했기 때문에 해당 작업에 대해 CPU가 최대한 자유롭기를 원했습니다. 초기 구현은 ISR이었고, 그런 다음 DMA로 옮겨 샘플 간 CPU 시간을 조금 더 구입하려고 시도했습니다. 전송 속도 게인이 약간 개선되었지만 조금만 향상되었습니다. o-scope에서 거의 측정 할 수 없었습니다.

내가 본 최근의 마이크로 프로세서에서 ISR과 DMA는 거의 같은 방식으로 작동하고 있기 때문에 필요에 따라 CPU주기가 걸리고 DMA는 본질적으로 효율적인 ISR로 코딩 한 CPU와 동일한 작업을 수행합니다. .

드문 경우지만, DMA에서만 액세스 할 수있는 자체 RAM 영역이있는 주변 장치를 보았습니다. 이더넷 MAC 또는 USB에있었습니다.


3

DMA는 DAC가 일정한 타이밍을 가질 수 있고 알려진 간격으로 아날로그 출력을 변경하여 파형을 생성 할 수 있도록 여기에서 사용될 가능성이 높습니다.

예. 공유 버스라면 ... 공유해야합니다.

CPU가 항상 버스를 사용하지는 않으므로 dma 엔진과 공유하는 것이 좋습니다. 그리고 물론 그것은 우선 순위가 관여한다는 것을 의미합니다. 때로는 누가 먼저 도착했는지 (예를 들어 리소스 앞에 명령 fifo가 있고 도착 순서대로 fifo up 요청이 있음) 예, 불필요하게 결정적이지 않습니다. ). 이와 같은 경우 DAC 또는 ADC와 같은 시간에 민감한 항목이 결정적인 타이밍을 갖도록 dma가 CPU보다 우선 순위를 갖기를 원할 수 있습니다. 그들이 구현하기로 선택한 방법에 따라 다릅니다.

사람들은 종종 dma가 자유 롭다는 잘못된 추측을합니다. CPU와 공유하는 경우 (CPU가 대화 할 수있는 리소스와 통신하는 경우) 여전히 CPU 및 / 또는 dma가 중단되어 여전히 버스 시간을 소비하지는 않습니다. 따라서 CPU는 여전히 일부를 기다려야합니다 시간, 일부 구현 (마이크로 컨트롤러가 아닐 수도 있음)에서 CPU는 dma가 완료 될 때까지 완전히 보류되고 CPU는 지속 시간 동안 중지됩니다. 구현에 따라 다릅니다. 그것의 무료 부분은 일부 이벤트가 데이터를 공급하기 위해 CPU가 지속적으로 중단되거나 폴링되거나 숨을 참을 필요가 없다는 것입니다. dma over 다음 버퍼를 만드는 데 시간이 걸릴 수 있습니다. dma 전송이 완료되고 처리되는 것을 지켜봐야하지만 모든 바이트 대신 여러 바이트, 데이터 블록입니다.

보편적 인 답변은 없습니다. "사용하는 특정 디자인에 따라 다릅니다." 하나의 칩 / 보드 / 시스템 디자인 내에서도 여러 개의 dma 엔진이있을 수 있으며 모두 동일한 방식으로 작동한다고 가정 할 이유가 없습니다. 모든 경우에 당신은 그것을 알아 내야하지만 불행히도 그들은 종종 그것을 문서화하지 않거나 충분히 문서화하지 않습니다. 따라서 문제가되는 경우 실험을 만들어야 할 수도 있습니다.


임베디드는 그것과 아무 관련이 없습니다. dma의 요점은 CPU에 대한 작업을 수행하여 성능을 얻는 것이므로 코드가 필요하지 않으며 일반적으로 사용하지 않는 버스 사이클을 활용하고 거기서 작업합니다. 또한 CPU 오버 헤드없이 적시에 적절한 시간에 데이터를 공급하는 문제에 대한 문제. 이러한 장점은 유용한 포함 여부입니다.
old_timer 2016 년

1

지금까지의 대답은 CPU가 작동 할 수있는 "속도"와 DMA가 어떻게 이점을 제공하는지에 대한 것입니다. 그러나 다른 고려 사항 인 power가 있습니다.

CPU가 느린 링크로 데이터 패킷을 보내려면 폴링이나 인터럽트를 사용하는 경우 대부분의 시간 동안 깨어 있어야하지만 DMA가 수행되는 동안 주 CPU가 절전 상태에있을 수 있습니다. .


0

STM32H7 시리즈와 같은 일부 프로세서에는 많은 RAM 옵션과 밀접하게 연결된 RAM 힙이 있습니다. 별도의 RAM 뱅크가 있으면 DMA가 하나의 RAM을 망치는 반면, 프로세서는 캐싱이 필요없고 DMA에 의해 망치지 않는 근접 결합 램에서 데이터를 처리합니다. 데이터를 이동하려면 MDMA를 사용할 수 있습니다. 이 중 하나를 사용하여 FMCW 레이더 세트를 만들었습니다. ADC는 두 개의 입력에서 하나의 SRAM으로 IQ 데이터를 얻습니다. 그런 다음 데이터를 스케일링하고 dtcm 램에서 부동 소수점 256 빈 복소수 fft를 수행합니다. 그런 다음 MDMA를 사용하여 결과를 AXI 램의 2d 배열로 FIFO합니다.

나는 속도 벡터에 대한 두 번째 fft 64 빈을 fifo를 가로 질러 가져갑니다. 그런 다음 복잡한 데이터의 크기를 조정하고 결과 데이터 128 & 64 부동 소수점 값을 12.5 MHz의 SPI를 사용하여 다른 H7로 보냅니다. 나는이 모든 것을 4ms 안에한다.

ADC의 샘플링 속도는 84kHz이며 오버 샘플링을 사용하면 약 18 비트 분해능을 얻습니다.

MHz 범위에서만 실행되고 외부 RAM이없는 범용 프로세서에는 나쁘지 않습니다.

또한이 장치의 큰 캐시는 dtcm 외부의 calc에 대한 성능을 향상 시켰습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.