Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

PRZERWANIA, DMA, UART Orkiszewski Marcin Orkiszewski Marcin Koło Naukowe Układów Cyfrowych DEMAIN.

Podobne prezentacje


Prezentacja na temat: "PRZERWANIA, DMA, UART Orkiszewski Marcin Orkiszewski Marcin Koło Naukowe Układów Cyfrowych DEMAIN."— Zapis prezentacji:

1 PRZERWANIA, DMA, UART Orkiszewski Marcin Orkiszewski Marcin Koło Naukowe Układów Cyfrowych DEMAIN

2 Altera NIOS II 2 Wymagane oprogramowanie: Quartus II v. 9.0 Quartus II v. 9.0 Nios IDE v. 9.0 Nios IDE v. 9.0 Do pobrania na stronie

3 Uwaga! Katalogi, w których instalujemy oprogramowanie oraz w których zakładamy projekty: Katalogi, w których instalujemy oprogramowanie oraz w których zakładamy projekty: ! NIE MOGĄ zawierać spacji ! ! NIE MOGĄ zawierać spacji ! 3

4 Uwaga! Unikać powtarzania nazw: Unikać powtarzania nazw: - block diagram: _project - SOPC: _sopc - Nios IDE _soft W razie problemów W razie problemów 4

5 5 Założenie projektu

6 Otworzenie archiwum projektu: Quartus II Project Quartus II Project Restore Archived Project… 6 1. Otworzenie projektu

7 7

8 8

9 9 [CPU] – bez Data Cache

10 10 [Buttons] – generują przerwanie

11 11 [UART] – 8 bitowy

12 12 [SDRAM] – 16 bitowy !!

13 13 [PLL] 50 MHz 100 MHz (-65˚ dla SDRAM)

14 14 [RAM] – dwuportowa pamięć !

15 Processing Start compilation - Wykorzystanie komórek logicznych - Wykorzystanie bloków pamięci Kompilacja projektu

16 Tools Programmer - Hardware Setup USB-Blaster Program/Configure Program/Configure Start Start - Czasami przydatne bywa włączenie zasilania - - Czasami przydatne bywa włączenie zasilania Załadowanie obrazu do układu

17 17 Programowanie

18 File New Project… Nios II C/C++ Application Nios II C/C++ Application Założenie projektu (1/2)

19 Wskazanie obrazu systemu (.ptf): Select project template: Blank Project Name: szkolenie2_soft SOPC Builder System PTF File:../szkolenie2_sopc.ptf Finish Finish Założenie projektu (2/2)

20 - Prawy klawisz myszki na szkolenie2_soft_syslib -Properties System Library Reduced device drivers Reduced device drivers Small C library itp.. Small C library itp.. - Prawy klawisz myszki na szkolenie2_soft_syslib -Build Project Kompilacja biblioteki

21 21

22 - Prawy klawisz myszki na szkolenie2_soft -Import… General File System szkolenie2.h szkolenie2.h szkolenie2_1.c szkolenie2_1.c szkolenie2_2.c szkolenie2_2.c szkolenie2_3.c szkolenie2_3.c Dodanie plików źródłowych (C/C++) szkolenie2_4.c szkolenie2_4.c szkolenie2_5.c szkolenie2_5.c szkolenie2_6.c szkolenie2_6.c

23 Run Run… Nios II Hardware MainProject: szkolenie2_soft Target Connection: USB-Blaster Run Run Uruchomienie projektu

24 24

25 25 Program 1 (Buttons)

26 26 int main() { // init while(1) { ;// ? } return 0; } Program 1

27 Przerwanie Asynchroniczne sprzętowe zgłoszenie się komponentu. Przerywa obecnie wykonywany kod (skok do funkcji przerwania + zachowanie stanu procesora na stosie). Przerywa obecnie wykonywany kod (skok do funkcji przerwania + zachowanie stanu procesora na stosie). Wymaga odblokowania dla każdego z komponentów Wymaga odblokowania dla każdego z komponentów (oraz potwierdzenia !). Przerwanie o wysokim priorytecie przerywa przerwanie o niskim priorytecie (możliwość zagnieżdżania przerwań). Przerwanie o wysokim priorytecie przerywa przerwanie o niskim priorytecie (możliwość zagnieżdżania przerwań). 27

28 vs. Pooling Przegląd urządzeń (czy nie potrzebują obsługi) Wyżeramy 100% mocy procesora nic nie robiąc Wyżeramy 100% mocy procesora nic nie robiąc (tzw. aktywne oczekiwanie), nieprzerywalność operacji obsługi (np. nie możemy odbierać danych, bo akurat coś liczymy, przegapiamy wciśnięcie przycisku, itp..), nieprzerywalność operacji obsługi (np. nie możemy odbierać danych, bo akurat coś liczymy, przegapiamy wciśnięcie przycisku, itp..), nie możemy ustalić priorytetów. nie możemy ustalić priorytetów. Technicznie chałowe w najwyższym stopniu. Technicznie chałowe w najwyższym stopniu. Dr inż. Jerzy Chrząszcz (Techniki Mikroprocesorowe) Dr inż. Jerzy Chrząszcz (Techniki Mikroprocesorowe) 28

29 Jak używać ? Wykonywać tylko to, co musi być zrobione natychmiast ! Wykonywać tylko to, co musi być zrobione natychmiast ! Resztę operacji dokończyć w pętli głównej programu (poprzez ustawienie odpowiednich znaczników – zmiennych globalnych). Pamiętać o kasowaniu znaczników przerwania ! Pamiętać o kasowaniu znaczników przerwania ! Unikać zagnieżdżania przerwań. Unikać zagnieżdżania przerwań. Unikać tworzenia zmiennych lokalnych, nie wywoływać funkcji printf. Unikać tworzenia zmiennych lokalnych, nie wywoływać funkcji printf. Używać rozsądnie – zbyt częste lub zbyt rozbudowane przerwania skutecznie paraliżują procesor. Używać rozsądnie – zbyt częste lub zbyt rozbudowane przerwania skutecznie paraliżują procesor. 29

30 30 #include void BUTTONS_ISR( void *context, unsigned long id ) { //… } int main() { alt_irq_register( BUTTONS_IRQ, 0, BUTTONS_ISR ); } // Zarejestrowanie funkcji przerwania Program 1

31 31 Komponent PIO – mapa rejestrów IOWR_ALTERA_AVALON_PIO_IRQ_MASK( BUTTONS_BASE, 0xFF );

32 32 volatile alt_u8 buttons;// zmienna globalna volatile void BUTTONS_ISR( void *context, unsigned long id ) { buttons = IORD_ALTERA_AVALON_PIO_DATA( BUTTONS_BASE ); IOWR_ALTERA_AVALON_PIO_DATA( LED_G_BASE, buttons ); // potwierdzenie przerwania IOWR_ALTERA_AVALON_PIO_EDGE_CAP( BUTTONS_BASE, 0 ); } Program 1

33 33 Program 2 (Timer)

34 34 volatile alt_u8 irq_flag = 0; void TIMER_ISR( void *context, unsigned long id ) { irq_flag = 1; IOWR_ALTERA_AVALON_TIMER_STATUS( TIMER_BASE, 0 ); // potwierdzenie } int main() { alt_irq_register( TIMER_IRQ, 0, TIMER_ISR ); } Program 2

35 35 // Obsługa w pętli głównej programu int main() { IOWR_ALTERA_AVALON_TIMER_PERIODH( TIMER_BASE, 0x05F5 ); // 100 MHz IOWR_ALTERA_AVALON_TIMER_PERIODL( TIMER_BASE, 0xE100 ); IOWR_ALTERA_AVALON_TIMER_CONTROL( TIMER_BASE, 0x01 | 0x02 | 0x04 ); while(1) { if( irq_flag ) { // obsługa przerwania irq_flag = 0; } Program 2

36 36 Program 3 (DMA)

37 #include system.h alt_u16 * pointer = SDRAM_BASE; Odczyt i zapis do SDRAM realizowany jest przez sprzętowy kontroler pamięci. Aby operować na tej pamięci wystarczy posłużyć się zwykłym wskaźnikiem! 37 SDRAM

38 38 DMA (Direct Memory Access) Idea – szybkie kopiowanie danych (o rozmiarze LENGTH) spod adresu READADDRESS pod adres WRITEADDRESS

39 39 DMA - inicjalizacja #include altera_avalon_dma_regs.h // alt_u16 data[10] – tablica danych IOWR_ALTERA_AVALON_DMA_RADDRESS( DMA_BASE, data ); // adres docelowy IOWR_ALTERA_AVALON_DMA_WADDRESS( DMA_BASE, SDRAM_BASE ); // 16-bit, DMA aktywne, kopiuj określoną liczbę danych IOWR_ALTERA_AVALON_DMA_CONTROL( DMA_BASE, 0x02 | 0x08 | 0x80 ); // start IOWR_ALTERA_AVALON_DMA_LENGTH( DMA_BASE, 20 ); DMA skopiuje 20 BAJTÓW !

40 40 DMA - koniec transferu // oczekiwanie na koniec transferu danych while( IORD_ALTERA_AVALON_DMA_STATUS( DMA_BASE ) & 0x11 != 0x11 ) ; 0x11 = 10001

41 41 DMA - ustawienia główne 0x00010x00020x0004 0x włączenie DMA 0x przerwanie 0x00200x0040 0x warunek stopu 0x stały adres odczytu 0x stały adres zapisu 0x04000x08000x1000

42 42 1.Kopiowanie tablicy alt_u16 data[10] do SDRAM (10 x 16 bitów = 20 bajtów) IOWR_ALTERA_AVALON_DMA_STATUS( DMA_SDRAM_BASE, 0 ); IOWR_ALTERA_AVALON_DMA_RADDRESS( DMA_SDRAM_BASE, data ); IOWR_ALTERA_AVALON_DMA_WADDRESS( DMA_SDRAM_BASE, SDRAM_BASE ); IOWR_ALTERA_AVALON_DMA_CONTROL( DMA_SDRAM_BASE, (0x02 | 0x08 | 0x80 ) ); IOWR_ALTERA_AVALON_DMA_LENGTH( DMA_SDRAM_BASE, 20 ); while ( (IORD_ALTERA_AVALON_DMA_STATUS( DMA_SDRAM_BASE ) & 0x11 ) != 0x11 ) ; Program 3

43 43 2.Kopiowanie wartości do SDRAM IOWR_ALTERA_AVALON_DMA_STATUS( DMA_SDRAM_BASE, 0 ); IOWR_ALTERA_AVALON_DMA_RADDRESS( DMA_SDRAM_BASE, &data[6] ); IOWR_ALTERA_AVALON_DMA_WADDRESS( DMA_SDRAM_BASE, SDRAM_BASE ); IOWR_ALTERA_AVALON_DMA_CONTROL( DMA_SDRAM_BASE, 0x02 | 0x08 | 0x80 |0x100 ); IOWR_ALTERA_AVALON_DMA_LENGTH( DMA_SDRAM_BASE, 20 ); while ( (IORD_ALTERA_AVALON_DMA_STATUS( DMA_SDRAM_BASE ) & 0x11 ) != 0x11 ) ; Program 3

44 44 DMA - informacje Maksymalną liczbę danych jaką może kopiować DMA określamy w SoPC Wartość w rejestrze LENGTH musi być wielokrotnością danego typu (np. dla słów 32 bitowych możemy ustawiać tylko wielokrotność 4) Przed ponownym uruchomieniem DMA musimy ponownie określić adresy docelowe, chyba że zostały one oznaczone jako niezmienne W każdej chwili można sprawdzić, ile bajtów DMA już skopiowało (poprzez odczyt rejestru LENGTH) Należy znać adresy komponentów podłączanych do DMA, które nie znajdują się w przestrzeni adresowej mikroprocesora (nie ma ich w system.h).

45 45 DMA - konfiguracja

46 46 Program 4 (test DMA)

47 47 Program 4 - wydajność DMA Ile danych w ciągu 1 sekundy skopiuje do SDRAM: 1.Mikroprocesor ? 2.DMA ? Timer po 1 sekundzie przerywa zapis danych i sprawdza ile MB udało się skopiować DMA, a ile mikroprocesorowi.

48 48 Program 5 (UART)

49 49 UART () UART (Universal Asynchronous Receiver and Transmitter) Idea – zarządzanie transmisją danych np. RS-232, RS-485 lub między komponentami !

50 50 #include altera_avalon_uart_regs.h int main() { alt_u8 data; while(1) { if( IORD_ALTERA_AVALON_UART_STATUS( UART_BASE ) & 0x80 ) { data = IORD_ALTERA_AVALON_UART_RXDATA( UART_BASE ); IOWR_ALTERA_AVALON_UART_TXDATA( UART_BASE, data ); } return 0; } Program 5 - echo

51 51 UART - koniec transferu // czy otrzymano dane ? if( IORD_ALTERA_AVALON_UART_STATUS( UART_BASE ) & 0x80 ) // czy dane wysłane ? while( ! (IORD_ALTERA_AVALON_UART_STATUS( DMA_BASE ) & 0x40) ) ; 0x40 0x80

52 52 Program 6 (UART + DMA)

53 53 Podłączenie UART pod DMA – nasłuch: volatile alt_u8 data_recv[5]; IOWR_ALTERA_AVALON_DMA_STATUS( DMA_RS_READ_BASE, 0 ); IOWR_ALTERA_AVALON_DMA_RADDRESS( DMA_RS_READ_BASE, UART_BASE ); IOWR_ALTERA_AVALON_DMA_WADDRESS( DMA_RS_READ_BASE, data_recv ); IOWR_ALTERA_AVALON_DMA_CONTROL( DMA_RS_READ_BASE, (0x01 | 0x08 | 0x10 | 0x80 | 0x100) ); // 8bit & GO & IRQ & LEEN & RCONST // nasłuch 5 bajtów IOWR_ALTERA_AVALON_DMA_LENGTH( DMA_RS_READ_BASE, 5 ); Program 6

54 54 Podłączenie UART pod DMA – nadawanie: volatile alt_u8 data_recv[5]; IOWR_ALTERA_AVALON_DMA_STATUS( DMA_RS_WRITE_BASE, 0 ); IOWR_ALTERA_AVALON_DMA_RADDRESS( DMA_RS_WRITE_BASE, data_recv ); IOWR_ALTERA_AVALON_DMA_WADDRESS( DMA_RS_WRITE_BASE, (UART_BASE+1) ); IOWR_ALTERA_AVALON_DMA_CONTROL( DMA_RS_WRITE_BASE, (0x01 | 0x08 | 0x80 | 0x200) ); // 8bit & GO & LEEN & WCONST Program 6

55 55 1.DMA_READ ustawiane na odbiór 5 bajtów. 2.Po odebraniu 5 bajtów, DMA_READ zgłasza przerwanie. 3.W funkcji przerwania uruchamiane jest DMA_WRITE, które odpowiada 5 bajtami odebranymi. 4.W funkcji przerwania ustawiana jest flaga do obsłużenia w pętli głównej programu. 5.W pętli głównej sprawdzane jest, czy DMA_WRITE zakończyło nadawanie. 6.W pętli głównej DMA_READ jest ponownie ustawiane odbiór 5 bajtów. Program 6 - echo

56 24 XI 2009 Materiały dostępne na stronie Koła Publikacje


Pobierz ppt "PRZERWANIA, DMA, UART Orkiszewski Marcin Orkiszewski Marcin Koło Naukowe Układów Cyfrowych DEMAIN."

Podobne prezentacje


Reklamy Google