Jaki jest sens DMA we wbudowanych procesorach?

17

Ostatnio robiłem projekt z mbedem (LPC1768), używając przetwornika cyfrowo-analogowego do generowania różnych fal. Przeczytałem części arkusza danych i mówiono o tym, jak ma DMA dla wielu urządzeń peryferyjnych. Wydawało się, że byłoby to przydatne, ale przy dalszym czytaniu odkryłem, że DMA używał tej samej magistrali danych co procesor (co, jak sądzę, jest normalne). Czy to oznacza, że ​​procesor nie może wchodzić w interakcje z żadną pamięcią, gdy DAC pobiera dane? Ponadto, ponieważ DAC nie miał bufora (o ile mogłem powiedzieć) i dlatego bardzo często musi mieć DMA, jaki jest sens DMA? Jeśli procesor nie może wykonywać transakcji pamięciowych, czy może coś zrobić?

BeB00
źródło
8
Sugeruję, abyś spojrzał na funkcje swojego procesora i czy może on zrobić coś innego niż dostęp do pamięci. Słyszałem o niektórych procesorach, które mogą wykonywać takie decyzje, jak obliczenia, nie jestem pewien, czy to w ogóle jest powszechne ..
PlasmaHH
Czy procesor powinien spędzać czas na przesyłaniu danych do portu we / wy, czy delegować zadanie na dedykowane urządzenie?
StainlessSteelRat
Tak, procesor może robić inne rzeczy, ale w systemie wbudowanym prawdopodobnie spędza dużo czasu na interfejsach z urządzeniami peryferyjnymi, zwłaszcza portami I / O. Czy nie byłoby sensowniej mieć dodatkową magistralę danych tylko dla DMA? Czy to zwykle nie jest konieczne? Sytuacja, w której chciałbyś mieć dodatkową magistralę, ma miejsce, gdy próbujesz przekroczyć granice swojego sprzętu, co, jak zakładam, ma miejsce, kiedy i tak chcesz użyć DMA w USA?
BeB00
1
Prosty przykład, powiedz, że chcesz zrobić dużo drukowania informacji na port szeregowy. Możesz albo usiąść i poczekać na wysłanie każdego bajtu (powoli), skopiować go do bufora, a następnie użyć przerwań procesora, aby wysłać każdy bajt, gdy port jest gotowy (dużo przełączania kontekstu = wolno), lub skopiować go do bufor i pozwól, aby kontroler DMA przekroczył limit czasu danych, gdy procesor jest zajęty robieniem innych rzeczy (może być szybszy).
Tom Carpenter,
2
Widziałem kiedyś okładkę EDN, która przedstawiała rysunek mężczyzny w ogromnym, trzy metrowym bucie i nagłówek: „Jeśli to but, noś go”. Chodziło o to, że jeśli część wykonuje dziesięć rzeczy, których nie potrzebujesz, i jedną rzecz, której potrzebujesz, a cena, ślad i budżet mocy są odpowiednie, to powinieneś po prostu z nich korzystać i nie marnować czasu na szukanie czegoś z mniejszą liczbą funkcji.
Solomon Slow

Odpowiedzi:

17

LPC1768 datasheet znalazłem ma następujące cytaty (podkreślenie moje):

Ośmiokanałowy kontroler DMA ogólnego zastosowania (GPDMA) na wielowarstwowej matrycy AHB, który może być używany z urządzeniami peryferyjnymi SSP, I2S-bus, UART, przetwornikami analogowo-cyfrowymi i cyfrowo-analogowymi, sygnałami dopasowania zegara i do pamięci -przeniesienia pamięci.

Rozdzielona magistrala APB pozwala na wysoką przepustowość z kilkoma opóźnieniami między procesorem a DMA

Schemat blokowy na stronie 6 pokazuje SRAM z wieloma kanałami między macierzą AHB, a następujący cytat potwierdza:

LPC17xx zawiera łącznie 64 kB statycznej pamięci RAM na chipie. Obejmuje to główną pamięć SRAM o pojemności 32 kB, dostępną dla procesora i kontrolera DMA na szybszej magistrali, oraz dwa dodatkowe 16 kB, każdy blok SRAM, umieszczony na osobnym porcie podrzędnym na macierzy wielowarstwowej AHB. Ta architektura pozwala na dostęp do procesora i DMA w trzech oddzielnych pamięciach RAM, do których można uzyskać dostęp jednocześnie

Potwierdza to następujący cytat:

GPDMA umożliwia transakcje z urządzeń peryferyjnych do pamięci, z pamięci na urządzenia peryferyjne, z urządzeń peryferyjnych na peryferia i z pamięci na pamięć.

Dlatego możesz przesyłać strumieniowo dane do DAC z jednego z oddzielnych bloków SRAM lub z innego urządzenia peryferyjnego, używając głównej pamięci SRAM do innych funkcji.

Ten rodzaj urządzeń peryferyjno-peryferyjnych DMA jest powszechny w mniejszych częściach, w których interfejs pamięci jest dość prosty (w porównaniu z nowoczesnym procesorem Intel).

David
źródło
Achh, dzięki, nie zdawałem sobie sprawy, że to możliwe, jestem całkiem nowy w DMA. Czy to oznacza, że ​​procesor może uzyskać dostęp do urządzeń peryferyjnych, podczas gdy DAC ma dostęp do oddzielnej pamięci SRAM?
BeB00
1
Tak - właśnie do tego służy macierz AHB. Pozwala różnym kontrolerom (CPU, DMA, niektórym urządzeniom peryferyjnym, takim jak Ethernet i USB) na dostęp do różnych rzeczy w tym samym czasie. Dlatego istnieje wiele „portów” do SRAM.
David
Tak, AHB w tych tanich Żyjątka dostarcza insane przepustowość pamięci z powodu równoległych banków pamięci: można mieć ethernet, USB2 i bieg wszystko na max przepustowości i CPU nie nawet zawiadomienie ...
peufeu
Również kod kciuka może umieścić 2 instrukcje w jednym 32-bitowym słowie, więc procesor może nie potrzebować dostępu do magistrali, gdy często wykonując matematykę lub operacje, które głównie obejmują rejestry ... Z drugiej strony, myślę, że M3 i M4 mogą zrobić kilka dostępów do pamięci na zegar (instrukcje i dane) z powodu posiadania kilku magistral.
peufeu
30

Długa i krótka polega na tym, że DMA pozwala procesorowi efektywnie zachowywać się z jego natywną prędkością, podczas gdy urządzenia peryferyjne mogą skutecznie zachowywać się z ich natywną prędkością. Większość liczb w tym przykładzie jest złożona.

Porównajmy dwie opcje okresowego zbierania danych z ADC:

  1. Możesz ustawić ADC jako część przerwania (okresowego lub innego)
  2. Możesz utworzyć bufor i powiedzieć DMA, aby przesłał odczyty ADC do bufora.

Prześlijmy 1000 próbek z ADC do RAM.

Korzystanie z opcji 1: dla każdej próbki istnieje

  • 12 cykli jest wydawanych na przerwanie
  • czytaj adc (s)
  • przechowywać w pamięci ram
  • Wydano 12 cykli wychodzących z przerwania

Udawajmy, że ta funkcja przerwania ma 76 instrukcji, cała procedura ma 100 instrukcji, przy założeniu wykonania pojedynczego cyklu (najlepszy przypadek). Oznacza to, że opcja 1 poświęci 100 000 cykli na wykonanie procesora.

Opcja 2: DMA jest skonfigurowany do pobierania 1000 próbek ADC. Załóżmy, że ADC ma wyzwalacz sprzętowy z licznika timera.

  • ADC i DMA przesyłają 1000 danych próbek do pamięci RAM
  • DMA przerywa procesor po 1000 próbkach
  • 12 cykli jest wydawanych na przerwanie
  • Kod się dzieje (powiedzmy, że nakazuje DMA zastąpienie pamięci RAM)
  • Wydano 12 cykli wychodzących z przerwania

Udawanie całego przerwania (z narzutem wejścia i wyjścia) to 100 instrukcji w jednym cyklu. Korzystając z DMA, wydajesz tylko 100 cykli, aby zapisać te same 1000 próbek.

Teraz, za każdym razem, gdy DMA uzyskuje dostęp do magistrali, tak, może istnieć spór między CPU a DMA. Procesor może być nawet zmuszony do oczekiwania na zakończenie DMA. Ale oczekiwanie na zakończenie DMA jest znacznie krótsze niż zablokowanie procesora w celu obsługi ADC. Jeśli zegar rdzenia procesora ma 2x zegar magistrali, procesor może marnować kilka cykli rdzenia, czekając na zakończenie DMA. Oznacza to, że efektywny czas realizacji transferu wynosi od 1000 (zakładając, że procesor nigdy nie czeka) i 9000 cykli. Nadal WIELE lepszy niż 100 000 cykli.

pgvoorhees
źródło
2
Należy pamiętać, że pamięć RAM nie jest jedynym miejscem, w którym procesor może przechowywać dane. Ogólnie procesor ładuje dane z pamięci RAM do rejestrów przed przystąpieniem do pracy.
Aron
Tak, absolutnie poprawne. Mój przykład jest jedynie szorstkim szkicem.
pgvoorhees
Wiele mikrokontrolerów ma również szynę wielowarstwową, więc możliwe są jednoczesne operacje. Np .: adc-> ram i flash-> zarejestruj się w tym samym czasie. Ponadto wiele instrukcji jest dłuższych niż 1 zegar, więc jest dużo czasu na DMA.
Jeroen3
9

Jeśli w danym cyklu procesor i kontroler DMA będą musiały uzyskać dostęp do tej samej magistrali, jeden lub drugi będzie musiał poczekać. Wiele systemów zawiera jednak wiele obszarów pamięci z osobnymi magistralami wraz z „mostem” magistrali, który pozwoli CPU uzyskać dostęp do jednej pamięci, podczas gdy kontroler DMA uzyskuje dostęp do innej.

Ponadto wiele procesorów może nie wymagać dostępu do urządzenia pamięci w każdym cyklu. Jeśli procesor normalnie musiałby mieć dostęp do pamięci tylko w dwóch z trzech cykli, urządzenie DMA o niskim priorytecie może być w stanie wykorzystać cykle, gdy magistrala pamięci w innym przypadku byłaby bezczynna.

Jednak nawet w przypadkach, w których każdy cykl DMA spowodowałby zatrzymanie procesora w danym cyklu, DMA może być nadal bardzo pomocny, jeśli dane docierają z prędkością, która jest na tyle wolna, że ​​procesor powinien być w stanie wykonywać inne czynności między przychodzącymi elementami danych , ale wystarczająco szybko, aby narzut na element musiał zostać zminimalizowany. Jeśli na przykład port SPI podaje dane do urządzenia z szybkością jednego bajta na 16 cykli procesora, na przykład przerwanie procesora dla każdego transferu prawdopodobnie spowoduje, że będzie on spędzał prawie cały czas na wchodzeniu i powracaniu z rutynowej usługi przerwań i żaden wykonując jakąkolwiek rzeczywistą pracę. Jednak przy użyciu DMA narzut można zmniejszyć do 13%, nawet jeśli każdy transfer DMA spowodowałby zatrzymanie procesora na dwa cykle.

Wreszcie, niektóre procesory pozwalają na wykonanie DMA, gdy procesor śpi. Korzystanie z transferu opartego na przerwaniu wymagałoby, aby system wybudził się całkowicie dla każdej przesyłanej jednostki danych. Jednak przy użyciu DMA kontroler uśpienia może podawać kontrolerowi pamięci kilka zegarów za każdym razem, gdy pojawia się bajt, ale pozostawia całą sen, co zmniejsza zużycie energii.

supercat
źródło
1
Części Cortex-M, takie jak LPC1768, mają odrębną ścieżkę pamięci od flasha do dekodera instrukcji, więc w rzeczywistości operacje rejestr-rejestr mogą oznaczać, że CPU może wykonywać wiele instrukcji między czasami, gdy potrzebuje dostępu do pamięci danych.
Chris Stratton,
5

Jako programista DMA jest opcją przesyłania danych do iz urządzeń peryferyjnych, które ją obsługują. Dla klasycznego przykładu przesunięcia dużego bufora przez szeregowe urządzenie peryferyjne, takie jak SPI lub UART, lub pobrania kilku próbek z ADC, masz trzy metody przenoszenia tych danych:

  1. Metoda odpytywania. Tutaj czekasz na flagi rejestrów, aby umożliwić przejście do następnego / następnego bajtu. Problem polega na tym, że wstrzymujesz cały procesor podczas oczekiwania na to. Lub, jeśli musisz dzielić czas procesora w systemie operacyjnym, wtedy transfer zostanie drastycznie spowolniony.

  2. Metoda przerwania. W tym miejscu zapisujesz procedurę obsługi przerwań (ISR), która jest wykonywana przy każdym przesyłaniu bajtów, a kod ISR zarządza przesyłaniem. Jest to bardziej wydajne, ponieważ procesor obsłuży twój ISR tylko w razie potrzeby. Jest bezpłatny do użytku przez cały czas, z wyjątkiem ISR. ISR jest również jedną z szybszych opcji wykonania przelewu pod względem szybkości transferu.

  3. DMA. Konfigurujesz DMA ze wskaźnikami źródłowymi / docelowymi, liczbą transferów i poza tym. Będzie kradł cykle magistrali i czas procesora, aby wykonać transfer, a procesor może robić inne rzeczy w międzyczasie. Możesz skonfigurować flagę lub przerwanie, aby wskazać, kiedy transfer zostanie zakończony. Zazwyczaj jest to dotyk szybszy niż ISR i zazwyczaj jest to najszybsza opcja transferu.

Jako programista wolę DMA, ponieważ jest najłatwiejszy do kodowania i jest zasadniczo najszybszą techniką wykonania transferu. Zwykle wystarczy skonfigurować kilka rejestrów dla wskaźników źródłowych / docelowych oraz liczbę transferów, które należy wykonać i wyłączyć. Spędzam znacznie więcej godzin pracując w kodzie ISR niż w kodzie przyspieszonym DMA, ponieważ kod ISR wymaga krytycznych umiejętności projektowych i musi być kodowany, testowany, weryfikowany itp. Kod DMA jest znacznie mniejszy, a kod muszę napisać sam jest względnie trywialny, a ja uzyskuję maksymalną prędkość transferu w okazyjnej cenie.

Z mojego doświadczenia wynika, że ​​ostatnio z procesorami Atmel SAM3 / 4 DMA działa szybciej niż skuteczny ISR mojego własnego rzemiosła. Miałem aplikację, która co 5 ms odczytywała stos plików SPI. Wiele zadań zmiennoprzecinkowych występowało w zadaniach w tle, więc chciałem, aby procesor był dla nich jak najbardziej wolny. Pierwszą implementacją był ISR, a następnie przeniosłem się do DMA, aby porównać i spróbować kupić trochę więcej czasu procesora między próbkami. Przyrost prędkości transferu został nieznacznie poprawiony, ale tylko nieznacznie. Było to ledwie mierzalne w zakresie lunety.

Jest tak, ponieważ na ostatnich mikroprocesorach, które widziałem, ISR i DMA działają prawie w taki sam sposób - biorą cykle procesora zgodnie z wymaganiami, a DMA wykonuje zasadniczo takie same operacje z procesorem, jakbym kodował w wydajnym ISR .

W rzadkich przypadkach widziałem urządzenia peryferyjne z własnym obszarem RAM, który był dostępny TYLKO przez DMA. To było na Ethernet MAC lub USB.

Kowal
źródło
3

Najprawdopodobniej DMA jest tutaj używane, aby DAC mógł mieć pewne regularne taktowanie, generować kształt fali zmieniając wyjście analogowe w znanym odstępie czasu.

Tak, jeśli jest to wspólna magistrala, to ... musisz się dzielić.

Procesor nie zawsze korzysta z magistrali, dlatego czasem dobrym pomysłem jest udostępnienie go silnikowi DMA. I oczywiście oznacza to, że włączają się priorytety, czasem to właśnie ten, kto tam dotarł pierwszy (na przykład, ma polecenie fifo przed zasobem i żądania kwitu w górę, w kolejności ich przybycia, tak, to niekoniecznie deterministyczne ). W takim przypadku możesz chcieć, aby dma miała priorytet nad jednostką centralną, aby rzeczy wrażliwe na czas, takie jak przetworniki DAC lub ADC, miały deterministyczne czasy. Zależy od tego, jak zdecydowali się go wdrożyć.

Ludzie często mają błędne założenie, że dma jest bezpłatne. Nie zajmuje to nadal czasu magistrali, jeśli współużytkowane z jednostką centralną (która ostatecznie jest, ponieważ komunikuje się z zasobem, z którym jednostka centralna może rozmawiać), wówczas jednostka centralna i / lub dma są wstrzymywane, więc jednostka centralna musi jeszcze poczekać czasem, w niektórych implementacjach (prawdopodobnie nie w twoim mikrokontrolerze) jednostka centralna jest całkowicie wstrzymywana aż do zakończenia dma, jednostka centralna jest zatrzymywana na czas trwania. Tylko zależy od implementacji. Wolne jest to, że procesor nie musi być ciągle przerywany, odpytywany lub wstrzymywany, aby jakieś zdarzenie mogło dostarczyć dane. Utworzenie kolejnego bufora dla dma może zająć trochę czasu. Musi uważać, aby transfer dma się zakończył i sobie z tym poradził, ale zamiast powiedzieć, że każdy bajt to teraz wiele bajtów, jakiś blok danych.

Nie ma jednej uniwersalnej odpowiedzi. „To zależy” ... od konkretnego projektu konkretnej rzeczy, której używasz. Nawet w ramach jednej konstrukcji układu / płyty / systemu może istnieć wiele silników DMA i nie ma powodu, aby zakładać, że wszystkie działają w ten sam sposób. W każdym przypadku musisz to rozgryźć i niestety często nie dokumentują tego ani nie dokumentują wystarczająco dobrze. Może to wymagać wykonania eksperymentów, jeśli jest to problem.

old_timer
źródło
uwaga osadzona nie ma z tym nic wspólnego. chodzi o to, aby uzyskać wydajność, wykonując pracę dla procesora, więc nie musi on mieć kodu, i korzystać z normalnie nieużywanych cykli magistrali i tam pracować. Również do rzeczy takich, jak w kwestii karmienia danych we właściwym czasie, idealnie bez obciążenia procesora. zalety te są użyteczne osadzone lub nie.
old_timer
1

Dotychczasowe odpowiedzi mówią o „szybkości”, jaką może wykonać procesor i jakie korzyści daje DMA. Istnieje jednak inna uwaga, moc .

Jeśli procesor chciałby wysłać pakiet danych za pomocą wolnego łącza, musiałby być przebudzony przez większość czasu, jeśli używasz odpytywania lub przerwań, jednak główny procesor może być w stanie uśpienia podczas wykonywania DMA .

Ian Ringrose
źródło
0

Niektóre procesory, takie jak seria STM32H7, mają wiele opcji pamięci RAM i mnóstwo pamięci RAM o bliskim sprzężeniu. Posiadanie oddzielnych banków pamięci RAM pozwala DMA na wbijanie jednej partii pamięci RAM, podczas gdy procesor przetwarza dane w sprzężonym pamięci RAM, który nie wymaga buforowania i nie zostaje wbity przez DMA. Aby przenosić dane, możesz użyć MDMA. Zbudowałem zestaw radarowy FMCW za pomocą jednego z nich. ADC pobiera dane IQ z dwóch wejść do jednego SRAM. Następnie skaluję dane i wykonuję zmiennoprzecinkowy złożony kompleks 256 bin w dtcm ram. Następnie FIFO wynik do tablicy 2d w AXI ram za pomocą MDMA.

Biorę drugi bin FFT 64 w poprzek fifo dla wektora prędkości. Następnie robię wielkość złożonych danych i wysyłam wynikowe wartości zmiennoprzecinkowe danych 128 i 64 do innego H7 przy użyciu SPI przy 12,5 MHz w celu wykrycia. Robię to wszystko w 4 ms.

Częstotliwość próbkowania przetworników ADC wynosi 84 kHz, a dzięki nadpróbkowaniu uzyskuję rozdzielczość około 18 bitów.

Nieźle jak na procesor ogólnego przeznaczenia działający tylko w zakresie MHz i bez zewnętrznej pamięci RAM.

Pomagają również duże pamięci podręczne tego urządzenia, które poprawiły wydajność dla cieląt poza dtcm.

Rob Garnett
źródło