1. Pytania na kartkówkę POLITECHNIKA WROCŁAWSKA WYDZIAŁ ELEKTRONIKI MIKROSYSTEMÓW I FOTONIKI\ LABORATORIUM PROCESORÓW SYGNAŁOWYCH UKŁAD EDMA I MODULACJA AMPLITUDOWA zadeklarować odpowiednie zmienne globalne i napisać funkcję obsługi przerwania służącą do generacji efektu echa zadeklarować odpowiednie zmienne globalne i napisać funkcję obsługi przerwania do filtracji SOI zadeklarować odpowiednie zmienne globalne i napisać funkcję obsługi przerwania do filtracji NOI wymienić po kolei instrukcje biblioteki csl, niezbędne do uruchomienia portu szeregowego (podać typ przyjmowanych parametrów i zwracanych wartości) wymienić po kolei instrukcje biblioteki csl niezbędne do konfiguracji układu licznika (podać typ przyjmowanych parametrów i zwracanych wartości) wymienić po kolei instrukcje niezbędne do konfiguracji układu przerwań (podać typ przyjmowanych parametrów i zwracanych wartości) 2. Opis zadania do wykonania Celem laboratorium jest napisanie programu wykonującego modulację amplitudową sygnału mowy pochodzącego z mikrofonu. Modulacja amplitudowa jest jednym z najprostszych sposobów modulacji sygnału. Polega ona na przemnożeniu sygnału modulowanego przez funkcję sinusoidalną o zadanej częstotliwości, nazywanej częstotliwością modulacji. W pierwszym krokiem do osiągnięcia tego celu jest napisanie programu, który wykorzystując bufor kołowy, będzie generował sygnał sinusoidalny, który należy zaobserwować na oscyloskopie. Następnym krokiem będzie modulacja sygnału mowy generowaną funkcją sinusoidalną. Ostatnim elementem będzie oprogramowanie układu licznika, który będzie źródłem sygnału synchronizacji dla zmian częstotliwości modulacji. Program ramowy jest do pobrania na stronie internetowej przedmiotu. W komentarzach są podane instrukcje w jaki sposób modyfikować pobranych kod. Sygnał wyjściowy do portu szeregowego, będzie generowany przez układ bezpośredniego dostępu do pamięci EDMA. W tym celu należy skonfigurować układ EDMA, tak aby pobierał dane z bufora kołowego i kopiował je do rejestru zapisu portu szeregowego. Konieczne jest uruchomienie mechanizmu transferów łączonych (ang. link transfer), aby po zakończeniu transmisji całej zawartości bufora, układ rozpoczął ponowne kopiowanie danych od początku.
2. Układ EDMA Układ EDMA jest to układ tzw. bezpośredniego dostępu do pamięci. Bezpośredniość ta polega na tym, że do kopiowania danych z jednego miejsca pamięci do drugiego nie jest w najmniejszym nawet stopniu wykorzystywany rdzeń procesora. Dane przesyłane są po magistrali danych z jednego miejsca pamięci do drugiego. W klasycznym kopiowaniu danych natomiast dana jest pobierana do rejestru mikroprocesora i za pomocą drugiego rozkazu zapisywana z rejestru do pamięci. Przepływ danych zatem odbywa się poprzez mikroprocesor. Przesyłanie danych za pomocą układu DMA jest efektywne wtedy, gdy mikroprocesor w tym samym czasie realizuje inne zadania. Typową sytuacją, w której wykorzystywany jest układ DMA jest akwizycja danych z przetworników analogowo cyfrowych i wysyłanie przetworzonych danych do przetworników cyfrowo analogowych. Zaangażowanie układu DMA do odbierania i nadawania danych jest w takiej sytuacji niezwykle efektywne, ponieważ procesor, pracujący zwykle z częstotliwością wielokrotnie większą niż układy przetworników, nie musi czekać aż przetwornik będzie gotowy do odebrania nadawanej danej. Zamiast tego umieszcza on przetworzoną próbkę w specjalnym buforze obsługiwanym przez układ DMA i zaczyna kolejny cykl przetwarzania, pozostawiając zadanie wysłania próbki układowi DMA. Jeszcze bardziej efektywnym sposobem wykorzystania układu DMA jest zastosowanie podwójnego buforowania albo inaczej buforowania typu ping pong. Metoda ta polega na takim oprogramowaniu układu DMA, aby zapisywał dane naprzemiennie do dwóch buforów bufora ping i bufora pong. Wówczas układ DMA synchronizuje się procesorem po przesłaniu całego jednego bufora. W czasie gdy układ DMA zapisuje lub odczytuje dane z bufora ping, mikroprocesor przetwarza bufor pong, a potem odwrotnie. W tej metodzie układ DMA pracuje najefektywniej, dlatego jest ona wykorzystywana do przetwarzania sygnałów VIDEO. Dla każdego kanału DMA w danym momencie wykorzystywana jest tylko jedna konfiguracja, która jest zapisana w specjalnej tablicy w pamięci parametrów układu DMA(ang. parameters RAM). Jest to obszar pamięci, który dzieli się na dwie części. Pierwsza z nich jest wykorzystywana przez aktualnie wykonywany transfer do zapisu bieżących stanów rejestrów. W drugiej części są zapisywane parametry(konfiguracje) do przeładowania po zakończeniu transferu i tego obszaru układ DMA nie może modyfikować. W momencie gdy Array/Frame count i Element count są równe odpowiednio 0 i 1, następuje zakończenie transferu, załadowanie następnej konfiguracji spod adresu wskazanego w rejestrze Link address oraz wywołanie przerwania. Oczywiście, jeżeli nie jest to potrzebne, linkowanie może nie być wykonane(gdy Link address=0000h) oraz przerwanie nie musi być wykonane.
BUFOROWANIE TYPU PING-PONG 0180h, PING 01B0h, PONG KONFIGURACJE TRANSFERÓW Options (LINK=1) Source (SRC) addresss Array/Frame count Destination (DST) address = &Bufor_ping Array/Frame index reload Options (LINK=1) Element index Link address = 01B0h Source (SRC) addresss Array/Frame count Destination (DST) address = &Bufor_pong Array/Frame index reload Element index Link address = 0180h KANAŁY 0 DSPINT 1 TINT0 2 TINT1 3 SD_INT 4 EXT_INT4 5 EXT_INT5 6 EXT_INT6 8 EDMA_TCC8 9 EDMA_TCC9 10 EDMA_TCC10 11 EDMA_TCC11 12 XEVT0 13 REVT0 14 XEVT1 15 REVT1 Rys. 1 Buforowanie typu ping pong W obsłudze przerwania od układu DMA należy sprawdzać, dla którego kanału został zakończony transfer. Aby to sprawdzić, należy użyć funkcji EDMA_intTest(Uint32 tccintnum) która sprawdza, czy dla podanego argumentu został ustawiony odpowiadający mu bit w rejestrze CIPR(Complete Interrupt Pending Register) czyli czy został już zakończony transfer. Po sprawdzeniu, należy koniecznie wyzerować ten bit używając funkcji EDMA_intClear(Uint32 tccintnum). Jest to niezbędne, gdyż zapobiega ponownemu wywołaniu przerwania dla obsłużonego już transferu. Numer bitu odpowiada przetłumaczonemu TCC(Transfer Complete Code) na kod 1 z 16. TCC jest to 4-bitowy kod przydzielany każdemu transferowi i jest on jego identyfikatorem. Na przykład indeksowi 12 (w rejestrze CIPR) odpowiada TCC równe 1100b w systemie binarnym. Aby nastąpiło wywołanie przerwania muszą być ustawione następujące bity: ustawiony bit CIEn w rejestrze CIER ustawiony bit TCINT w rejestrze OPT TCC ustawione na wartość n
Przykładowo, jeżeli TCC = 1100b, a bit CIPR[12] jest ustawiony na 1 po zakończeniu transferu, to procesor wykona przerwanie tylko gdy CIER[12] = 1. Tab. 1 Opcje transferu zawatość pola OPT parametrów transferu Bity field symval Wartość Opis 31 29 PRI 0 7h Priorytety dla zdarzeń DMA. 0 Zarezerwowane dla żądań od pamięci cache L2. HIGH 1h Wysoki priorytet. LOW 2h Niski priorytet. 3h 7h Zarezerwowane. 28 27 ESIZE 0 3h Rozmiar elementu. 32BIT 0 32-bity. 16BIT 1h 16-bitów 8BIT 2h 8-bitów. 3h Zarezerwowane. 26 2DS Bit wymiaru źródła NO 0 1-wymiarowe źrodło. YES 1 2-wymiarowe źródło. 25 24 SUM 0 3h Aktualizacja adresu źródła NONE 0 Tryb stałego adresu. Adres źródła nie jest zmieniany. INC 1h Inkrementacja adresu źródła zależna od bitów 2DS i FS. DEC 2h Dekrementacja adresu źródła zależna od bitów 2DS i FS. IDX 3h Adres źródła modyfikowany przez index/frame index zależny od bitów 2DS i FS. 23 2DD Wymiary NO 0 Przeznaczenie 1-wymiarowe YES 1 Przeznaczenie 2-wymiarowe 22 21 DUM 0 3h Aktualizacja adresu prze. NONE 0 Tryb stałego adresu. Adres prze nie jest zmieniany. INC 1h Inkrementacja adresu prze zależna od bitów 2DS i FS. DEC 2h Dekrementacja adresu prze zależna od bitów 2DS i FS. IDX 3h Adres prze modyfikowany przez index/frame index zależny od bitów 2DS i FS. 20 TCINT Bit Transfer complete interrupt NO 0 Transfer complete indication jest wyłączone. Bity w rejestrze CIPR nie będą ustawiane po zakończeniu transferu. YES 1 Rejestr CIPR jest ustawiony według kodu TCC. 19 16 TCC OF(value) 0 Fh Kod TCC używany jako identyfikator kanału. 15 2 Reserved 0 Zarezerwowane. Odczyt zawsze da w wyniku 0, natomiast zapis również da 0 niezależnie od argumentu. 1 LINK Łączenie transferów. NO 0 Łączenie transferów wyłączone. YES 1 Łączenie transferów włączone. Po zakończeniu transferu konfiguracja kanału zostaje przeładowana przez konfigurację spod Link w rejestrze RLD. 0 FS Synchronizacja ramki NO 0 Kanał jest zsynchronizowany z elementem/tablicą YES 1 Kanał jest zsynchronizowany z ramką. field i symval są nazwami używanymi przez bibliotekę CSL.
Tab. 2 Znaczenie bitów SUM/DUM (ang. source/destination update mode) SUM/DUM Modyfikacja adresów Transfer 1-wymiarowy Transfer 2-wymiarowy 00 brak Wszystkie elementy są pod tym samym adresem 01 inkrementacja Elementy następują po sobie w sposób ciągły, a każdy kolejny element jest pod wyższym adresem 10 dektrementacja Elementy następują po sobie w sposób ciągły, a każdy kolejny element jest pod niższym adresem 11 przesunięcie (offset) Wszystkie elementy w ramce są oddalone od siebie o ELEIDX. Wszystkie ramki są oddalone od siebie o FRMIDX Wszystkie elementy w tablicy są pod tym samym adresem Elementy w ramce następują po sobie w sposób ciągły, a każdy kolejny element jest pod wyższym adresem. Ramki są oddalone od siebie o wartość FRMIDX. Elementy w ramce następują po sobie w sposób ciągły, a każdy kolejny element jest pod niższym adresem. Ramki są oddalone od siebie o wartość FRMIDX. Zarezerwowane a) Parametry początkowe transferu Array/Frame count = 0002h = reload = b) Parametry po przesłaniu jednego elementu Array/Frame count = 0002h = 0003h reload = c) Parametry po przesłaniu całej ramki Array/Frame count = 0001h = reload = d) Parametry końcowe transferu Array/Frame count = 0000h = 0001h reload = Rys. 2 Przykład transferu 1D-1D 3 ramek po 4 elementy (SUM 00, DUM 01, FS 0)
Z rys. 2 wynika, że mamy do czynienia z transferem ze źródła o stałym adresie (np. portu szeregowego) do jednowymiarowej tablicy prze. reload wpisywany jest do po zakończeniu każdej ramki i informuje ile przypada na nią elementów, a Element count ile jeszcze zostało do przesłania. Natomiast Array/Frame count mówi, ile tablic/ramek zostało do przesłania. Należy zwrócić uwagę, że dla liczenie zaczyna się od 4 i kończy na 1, a dla Array/Frame count zaczyna się od 2 i kończy na 0. Osiągnięcie końcowych wartości powoduje wywołanie przerwania, pod warunkiem że ustawione są odpowiednie bity (patrz tabelka wyżej). Opis funkcji do konfiguracji układu EDMA hedma_handle EDMA_open(int chanum, Uint32 flags) Aktywowanie miejsca w pamięci do przechowywania parametrów aktualnie wykonywanego transferu. hedma_handle EDMA_allocTable(int tablenum); Alokuje miejsce dla konfiguracji, która będzie przeładowywana po wykonaniu transferu. Aby wybrać pierwsze wolne miejsce, należy wywołać funkcję z argumentem -1. Układ DMA nie może modyfikować zawartości tej tablicy. gedmaconfigxmt.dst = MCBSP_getXmtAddr(hMcbsp1); pobiera adres rejstru nadajnika portu szeregowego i wpisuje go do adresu prze dla DMA. int EDMA_intAlloc(int tcc); Alokuje Transfer Completion Code. Jest to kod zgłaszany po zakończeniu transferu i jest indywidualny dla każdego kanału DMA. Aby wybrać pierwszy wolny kod należy użyć argumentu -1. gedmaconfigxmt.opt = EDMA_FMK(OPT,TCC,gXmtChan); Zapisanie kodu TCC dla kanału nadawczego. EDMA_config(EDMA_Handle hedma, EDMA_Config *config); Wpisanie konfiguracji pod wskazany adres. gedmaconfigxmt.src= EDMA_SRC_OF(gBufferXmtPong); Wskazanie źródła(buforu), z którego kopiowane są dane.
EDMA_link(EDMA_Handle parent,edma_handle child); Linkowanie konfiguracji(transferów). Pierwszy argument funkcji to rodzic, a drugi to dziecko. Najpierw należy użyć wskaźnika który był używany z EDMA_open, aby przypisać go do konkretnego urządzenia(czyli McBSP1). Następnie wpisujemy konfiguracje do tablicy parameters RAM. Do konfiguracji Pong linkowana jest struktura Ping, a Ping jest łączone z Pong, czyli wracamy następuje zapętlenie. W późniejszej fazie wzajemne linkowanie następuje tylko dla transferów zainicjowanych funkcją EDMA_allocTable. Należy również zwrócić uwagę na zamianę miejsc pomiędzy parent i child w następnych linkowaniach. EDMA_intEnable(intNum); Aktywuje przerwanie dla wybranego kodu TCC poprzez modyfikację rejestru CIER. EDMA_enableChannel(EDMA_Handle hedma); Musi nastąpić jawne aktywowanie kanału. Przyjmuje tylko uchwyty od EDMA_open.