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ć?
microcontroller
mbed
dma
BeB00
źródło
źródło
Odpowiedzi:
LPC1768 datasheet znalazłem ma następujące cytaty (podkreślenie moje):
Schemat blokowy na stronie 6 pokazuje SRAM z wieloma kanałami między macierzą AHB, a następujący cytat potwierdza:
Potwierdza to następujący cytat:
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).
źródło
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:
Prześlijmy 1000 próbek z ADC do RAM.
Korzystanie z opcji 1: dla każdej próbki istnieje
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.
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.
źródło
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.
źródło
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:
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.
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.
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.
źródło
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.
źródło
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 .
źródło
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.
źródło