Brak produktów
Mikrokontrolery XMEGA mają tak dużo peryferiów, że rdzeń procesora potrzebuje dwóch dodatkowych układów wspomagających, by móc je efektywnie wykorzystać. Pierwszy z nich to system zdarzeń, który poznaliśmy w poprzedniej części kursu. Służy on do przekazywania prostych sygnałów logicznych pomiędzy peryferiami. Drugi to układ DMA (Direct Memory Access), który służy do przesyłania danych bez udziału rdzenia procesora.
Ponieważ DMA nie występowało w starych układach ATtiny oraz ATmega i zapewne jest nowością dla wielu czytelników – omówię dokładnie jak wygląda przesyłanie danych w pamięci mikrokontrolera i w jaki sposób DMA poprawia efektywność tego procesu.
Układy AVR mają dwie oddzielne przestrzenie adresowe – osobną dla pamięci programu (tzw. ROM, choć tak naprawdę jest to pamięć Flash wielokrotnego zapisu) oraz oddzielną dla pamięci RAM i układów peryferyjnych. Mamy zatem dwie niezależne magistrale adresowe i dwie magistrale danych. Do pamięci programu podłączony jest jedynie dekoder instrukcji procesora i z tej pamięci procesor praktycznie non-stop pobiera instrukcje. Inaczej wygląda sytuacja z pamięcią danych – tutaj transfery zachodzą tylko wtedy, kiedy procesor chce uzyskać dostęp do jakiejś zmiennej lub rejestrów układów peryferyjnych. Są więc sytuacje, kiedy magistrala adresowa i magistrala danych pamięci RAM jest niewykorzystywana.
Jak wygląda operacja skopiowania komórki pamięci z jednego adresu pod inny adres? Każda komórka pamięci w procesorze ma swój unikalny adres, który w przypadku XMEGA może być 24-bitowy. Procesor na magistralę adresową wystawia adres komórki, która ma być odczytana i wysyła żądanie odczytu. Pamięć lub układ peryferyjny udostępnia żądany bajt informacji na magistrali danych. Procesor kopiuje ten bajt do jednego ze swoich rejestrów roboczych R0-R31. Następnie procesor na magistralę adresową wypisuje adres komórki, do której mają trafić dane. Na magistralę danych kopiuje wartość rejestru R0-R31, który przechowuje interesujące nas informacje, po czym wysyła sygnał zapisu. Adresy komórek źródłowych i docelowych również są przechowywane w rejestrach roboczych R0-R31.
Skomplikowane? Niekoniecznie. Jest to dość prosta operacja, ale ma dwie wady. Trwa dość długo i całkowicie pochłania rdzeń procesora, przez co nie może on wykonywać żadnych innych operacji. Kopiowanie dużych bloków pamięci może na długi czas zablokować procesor. W takiej sytuacji pomocny jest układ DMA.
DMA jest układem bardzo prostym w działaniu. Jego zadaniem jest skopiowanie określonej liczby bajtów z jednego miejsca w drugie miejsce. W tym czasie procesor może wykonywać inne operacje całkowicie bez utraty funkcjonalności. Co się stanie w sytuacji, kiedy procesor będzie chciał uzyskać dostęp do pamięci, w czasie kiedy DMA transferuje dane? Wówczas praca DMA zostanie automatycznie zawieszona, a kiedy procesor zakończy swoje działanie, DMA będzie kontynuować pracę.
Oprócz zastosowań trywialnych, jak kopiowanie danych z jednej tablicy do drugiej, DMA bardzo dobrze współpracuje z innymi układami peryferyjnymi. DMA potrafi przesyłać dane z tablicy do układu interfejsowego USART czy SPI, dzięki czemu całkowicie sprzętowo i bardzo szybko można przesłać duży blok danych pomiędzy urządzeniami. W podobny sposób istnieje możliwość odbierania danych z układów transmisyjnych. DMA równie dobrze współpracuje z przetwornikiem analogowo-cyfrowym i cyfrowo-analogowym. Na przykład, pomiar przetwornikiem może być inicjowany timerem w zadanych odstępach czasowych, a po zakończeniu pomiaru, DMA może kopiować wyniki pomiaru z przetwornika do tablicy, którą procesor przetwarza w czasie rzeczywistym. Przypomina to układ akwizycji z oscyloskopu? A jakże! Równie łatwo można zrobić generator DDS. Zastosowanie układu DMA ogranicza jedynie wyobraźnia programisty, a żeby tę wyobraźnię rozbudzić, warto przeczytać książki Tomasza Francuza, w których opisuje najróżniejsze zastosowania DMA w praktycznych przykładach.