R1 vs
Transkrypt
R1 vs
Procesory osadzone ETD 7211 W3 – 24.10.2016 Powtórka wiadomości • • • • • Architektura Potokowość Peryferia Tryb ARM i Thumb Rejestry ARM - produkt firmy Acorn RISC Machine Architektura: von Neumanna vs harwardzka von Neumann • • • • harwardzka Wspólna magistrala dla pamięci danych i pamięci programu Dane przechowywane są wspólnie z instrukcjami Pamięć składa się z ponumerowanych komórek Możliwość wprowadzenie programu przez urządzenia zewnętrzne Rdzeń ALU • • • Rozdzielona magistrala zapewniająca dostęp do pamięci programu i danych Możliwość równoczesnego pobierania danych i instrukcji W wypadku mikrokontrolerów dane programu zapisywane są najczęściej w pamięci ROM natomiast dane tymczasowe w pamięci RAM Pamięć Pamięć instrukcji 3 Układy we/wy Rdzeń Pamięć danych Potokowość (pipelining) • • • • podział zadania na odrębne części, 3 etapowe przetwarzanie potokowe każda instrukcja musi mieć te same fazy wykonania, jeśli dana instrukcja nie wykorzystuje wszystkich faz, procesor wykonuje puste cykle zegara dla tej instrukcji, w danym cyklu, procesor wykonuje jednocześnie kilka instrukcji, ale każda znajduje się w innym stopniu zaawansowania Instrukcja ADDS R0, R4, R8 Pobranie ADCS R1, R5, R9 ADDS R0, R4, R8 Dekodowanie Wykonanie Cykl zegara 4 N N+1 ORR ADCS R0, R0, #3 R3, R7, R1 ORR ADCS R1, R5, R9 R0, R0, #3 ADDS ADCS R0, R4, R8 R1, R5, R9 ADDS R0, R4, R8 N+2 N+3 ADCS R3, R7, R1 ORR R0, R0, #3 ADCS R1, R5, R9 N+4 ARM7TDMI (architektura ARMv4) 5 LPC2368, ARM7TDMI-S Rozkazy procesora Rdzeń procesora ARM może pracować w jednym z następujących trybów: ARM - 32-bitowe instrukcje, kod programu zostaje wyrównany do 4 bajtów, - szybszy nawet o 40% - Stosowany gdy wydajność jest parametrem krytyczny 6 Thumb Jazelle - zestaw 16-bitowych - tryb pozwalający na instrukcji, bezpośrednie - upakowanie kodu wykonywanie większe nawet do 70% instrukcji zgodnych w stosunku do ARM, ze specyfikacją - zużycie mniejszej języka Java, ilości - wszystkie instrukcje pamięci/zasobów są 8 bitowe, nawet do 30% - procesor odczytuje - Mniejsze zużycie zawsze 4 kolejne energii instrukcje Rejestry specjalne Rejestry podstawowe R0 R1 … R12 Rejestry ogólnego przeznaczenia ARM7TDMI – organizacja pamięci R13 (SP) Stack Pointer R14 (LR) Link Register R15 (PC) Program Counter PSR PRIMASK CONTROL Rejestry R0 – R12 – przeznaczenie ogólne R13 – SP – wskaźnik stosu R14 – LR – rejestr powrotny R15 – PC – licznik programu CPSR – (Current Program Status Register) rejestr statusowy Dane – pamięć RAM Stałe – pamięć Flash 6+1 trybów ochrony • 31 [16*] rejestrów ogólnego Program Status Reg. przeznaczenia, • 6 rejestrów statusu Primary Mask Reg. • W sumie 37 rejestrów CONTROL Register * Dostępnych jednocześnie R0…R15 Rejestr statusowy Rejestr statusowy CPSR – podaje aktualny stan w jakim znajduje się mikroprocesor. Rejestr ten podzielony jest na bity i pola bitowe. Znaczenie flag: – – – – 8 N = ujemny wynik operacji Z = wynik operacji =0 C = przeniesienie/pożyczka V = przepełnienie Znaczenie bitów: – I = wyłączenie przerwania IRQ – F = wyłączenie przerwania FIQ – T = tryb Thumb lub ARM Laboratorium – wiadomości istotne Na dobry początek - wyjaśnienie… OK, programator działa hmm… raczej spodziewalibyśmy się sygnatury 0x4Fxxxxxx Keil uVision - mapa pamięci Zmapowanie wg specyfikacji urządzenia…. • bardzo ważne aby zaznaczyć … 11 LPC2368 - mapa pamięci • • Wektory wyjątków i wektor resetu zajmują pierwsze 64 bajty przestrzeni adresowej przed uruchomieniem programu z pamięci Flash sprawdzana jest jego poprawność na podstawie unikalnej sygnatury, która jest umieszczona w nieużywanym wektorze 0x00000014. Sygnatura ta jest sumą kontrolną w uzupełnieniu do dwóch zawartości tablicy wektorów wyjątków. BOOT ROM AND FLASH 32 kB ON-CHIP STATIC RAM - w skrócie wewnętrzna pamięć RAM 512 kB ON-CHIP NON-VOLATILE MEMORY 12 - w skrócie wewnętrzna pamięć FLASH LPC2368 - mapa pamięci BOOT ROM AND FLASH ROM RAM 32 kB ON-CHIP STATIC RAM - w skrócie wewnętrzna pamięć RAM 512 kB ON-CHIP NON-VOLATILE MEMORY 13 - w skrócie wewnętrzna pamięć FLASH Jednak…. LPC2368 - mapa pamięci BOOT ROM AND FLASH ROM RAM 32 kB ON-CHIP STATIC RAM - w skrócie wewnętrzna pamięć RAM 512 kB ON-CHIP NON-VOLATILE MEMORY 15 - w skrócie wewnętrzna pamięć FLASH LPC2368 - wektory przerwań w pamięci 16 Wektor Przerwanie/wyjątek Uwagi 0x0 RESET po resecie lub włączeniu zasilania rdzeń rozpoczyna pracę w trybie SVC od adresu 0x0 0x4 UNDEF obsługa nieznanych/niezdefiniowanych rozkazów 0x8 SVC 0xC ABORT wyjątek wystąpił w trakcie pobierania rozkazu 0x10 ABORT wyjątek wystąpił podczas dostępu do danych 0x14 Zarezerwowane 0x18 IRQ obsługa przerwań z niskim priorytetem (może zostać przerwany przez FIQ) 0x1C FIQ tryb obsługujący przerwania i wyjątki o wysokich priorytetach (super szybki) tryb superużytkownika, zaraz po włączeniu zasilania sygnatura programu A co z zablokowanym procesorem? Programowanie szeregowe - RS232 – ISP, kasowanie pamięci 18 RX RS232 Linia P0.3 TX RS232 Linie P0.2 Flash Magic – bootloader - RS232 – ISP, kasowanie pamięci • • • • • 19 Linia P2.10 - w stan niski (zwarcie do GND) Power Off – Power On Kasujemy pamięć – Chip Erase Linia P2.10 – odłączona od GND Reset lub Power Off – Power On Wracając do wykładu… ARM7 – przetwarzanie danych ARM7 - typowa architektura Load and Store – co oznacza, że wszystkie operacje wykonywane są na rejestrach Brak rozkazów operujących bezpośrednio na pamięci - wyjątek stanowi: LOAD, STORE 21 ARM7TDMI • • • Rdzeń ARM7TDMI stanowi mózg systemu, kręgosłupem są poszczególne magistrale a kończynami peryferia. ARM7 - przesuwnik bitowy (ang. Barrel shifter) Barrel shifter – wielopozycyjny przesuwnik bitowy, wykonujący przesunięcia arytmetyczne, logiczne oraz rotacje użytego w rozkazie operandu. Co daje: • uzupełnia możliwości rdzenia o brakujące na liście rozkazów przesunięcia i rotacje, • służy do skalowania jednego z argumentów w rozkazach arytmetycznych i logicznych (operacje mnożenia/dzielenia przez potęgę liczby 2 bez potrzeby wykonywania osobnej operacji) Rd – rejestr przeznaczenia, Rn, Rm – rejestry źródłowe 23 http://www.davespace.co.uk/arm/introduction-to-arm/organisation.html ARM7 - przesuwnik bitowy (ang. Barrel shifter) Użycie przesuwnika bitowego – zdefiniowane jest w 2 operandzie, za pomocą dodatkowego mnemonika kodującego Rn Rm Słowo wejściowe: a3 a2 a1 a0 LSL przesunięcie logiczne w lewo a2 a1 a0 0 LSR przesunięcie logiczne w prawo 0 a3 a2 a1 ASR przesunięcie arytmetyczne w prawo 0 a3 a2 a1 ROR rotacja w prawo a0 a3 a2 a1 RRX Rotacja w prawo z uwzględnieniem flagi C, flaga C jest wsuwana do najstarszego bitu rejestru Rm, zaś najmłodszy bit rejestru Rm jest przesuwany do C SUB R4, R5, R6, ASR #2 24 5 – bitowa stała natychmiastowa, lub 8 – najmłodszych bitów rejestru specyfikującego ASR - przesunięcie operandu w rejestrze R6 MOV R4, #0 MOV R5, #100 MOV R6, #16 Jaka wartość zostanie umieszczona w rejestrze R4 ? ARM7 - przesuwnik bitowy (ang. Barrel shifter) SUB R4, R5, R6, ASR #2 ASR - przesunięcie operandu w rejestrze R6 MOV R4, #0 MOV R5, #100 MOV R6, #16 W rejestrze R4 zostanie umieszczona wartość ??? R4 0 0 0 0 0 0 0 0 0 R5 100 0 1 1 0 0 1 0 0 R6 16 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 … R6, ASR #2 R6 4 SUB R4, R5, R6 R4 25 60 R4 = R5 - R6 0 1 Asembler - składnia operand 1, np. wartość zapisana w rejestrze operand 2 rejestr docelowy (miejsce zapisu wyniku) <MNEMONIK> {<warunek>} {S} Rd, Rn, Operand kod operacji warunek wykonania instrukcji aktualizacja rejestru CPSR ADDEQS R0, R1, R3 26 Rozkazy standardowe, nie zawierające modyfikatora S domyślnie nie uaktualniają flag statusu w rejestrze CPSR, wyjątek: CMP, CMN, TST, TEQ Asembler - instrukcje warunkowe nieco inaczej Prawie każda instrukcja może zawierać warunek określający kiedy dana instrukcja powinna być wykonana (np. kombinacja flag) Mnemonik 27 Rozwinięcie mnemonika Warunek Stan flagi EQ equal równy Z=1 NE not equal nie równy Z=0 CS CARRY set ustawiona flaga przeniesienia CARRY; większy lub równy C=1 CC CARRY clear wyzerowana flaga przeniesienia CARRY, mniejszy C=0 MI minus/negative ujemny N=1 PL plus/positive or zero dodatni lub zerowy N=0 VS overflow set ustawiona flaga przepełnienia V=1 VC overflow clear wyzerowana flaga przepełnienia V=0 HI unsigned higher większy (liczby bez znaku) LS unsigned lower or same mniejszy lub równy (liczby bez znaku) GE signed greater than or equal większy lub równy LT signed less than mniejszy N≠V GT signed greater than większy Z=0 i (N=V) LE signed greater then or equal mniejszy lub równy Z=1 lub (N≠V) AL always zawsze (mnemonik można pominąć) bez znaczenia C=1 i Z=0 C=0 lub Z=1 N=V Asembler - instrukcje warunkowe nieco inaczej if (Z == 1) R1 = R2 + (R3*4) ADDEQ R1, R2, R3 LSL #2 Instrukcja warunkowa: add if equal Zostanie wykonana jeżeli wynik poprzedniej operacji uaktualniającej rejestr CPSR np. w operacji porównanie bądź arytmetycznej zwrócił zero W skrócie: jeżeli flaga „Z” w CPSR ustawiona na 1 wówczas R1 = … Litera „S” w mnemoniku rozkazu oznacza, że instrukcja modyfikuje bity warunkowe fachowo „S” – nazywany jest modyfikatorem uaktualniania rejestru CPSR Zalety instrukcji warunkowych: • wykonywanie instrukcji warunkowych pozwala na unikanie rozgałęzień 28 Asembler - ciekawsze instrukcje Jednostka mnożąca ALU rdzenia ARM7TDMI ma organizację 8*32 bity. Rozkazy mnożenia zależnie od wartości w rejestrze Rs wykonywane są w czasie od 1-4 cykli maszynowych. // mnożenie Rd=Rz*Rs // mnożenie z dodawaniem Rd=Rn+(Rz*Rs) MUL Rd, Rz, Rs MLA Rd, Rz, Rs, Rn !!! Powyższe rozkazy zachowuję tylko młodszą część 64-bitowego wyniku !!! MULEQ R0, R1, R2 MULS R0, R1, R2 //mnożenie będzie wykonane gdy Z=1 //nastąpi uaktualnienie flag stanu w rejestrze CPSR Rozkazy 64-bitowego mnożenie i mnożenia z dodawaniem mają następującą postać: UMULL RdLOW, RdHIGH, Rm, Rs UMLAL RdLOW, RdHIGH, Rm, Rs 29 // wynik < RdLOW, RdHIGH > = Rm*Rs // wynik < RdLOW, RdHIGH > = Rm*Rs Keil uVision5 - asembler i C Kod pisany w języku C/C++ bez problemu można wzbogacić fragmentami pisanymi w asemblerze: #include "LPC23xx.h" // miejsce na deklarację zmiennych // oraz funkcji int main (void){ while(1) { __asm { } ADD r1, a, #100 //ciało funkcji } 30 } Wstawka asemblerowa – możliwość kodowania funkcji, newralgicznych części systemu, należy jednak pamiętać, że nazwy rejestrów nie muszą oznaczać fizycznych, jawnych rejestrów Język C vs Asembler - przykład, implementacja pętli for prosty przykład w C i jego odpowiednik w asemblerze int total; int i; total = 0; for (i = 10; i > 0; i--) { total += i; } • etykiety: dalej, stop BNE - Branch if Not Equal – przeskok warunkowy MOV R0, #0 MOV R1, #10 ; wyzerowanie rejestru R0 ; zapisanie wartości 10 do R1 dalej: ADD R0, R0, R1 ; R0 - analogia zmiennej total SUBS R1, R1, #1 BNE dalej stop: 31 B stop ; pętla nieskończona Język C vs Asembler - przykład, implementacja pętli while a = 40; b = 25; while (a != b) { if (a > b) a -= b; else b -= a; } prosty przykład w C i jego odpowiednik w asemblerze dalej: CMP - Compare, wpływa na flagi N, Z, C, V; operacja (R0 – R1) CMN - Compare Negative; operacja (R0 + R1) BEQ - Branch if Equal (Z=1) 32 BLT - Branch if Less Than (N ≠ V) mniej: stop: MOV R0, #40 MOV R1, #25 ; R0 odpowiednik a ; R1 odpowiednik b CMP R0, R1 jeżeli Z=1, czyli R0=R1 BEQ stop BLT mniej SUB R0, R0, R1 B dalej SUB R1, R1, R0 B dalej B stop jeżeli N=1 Język C vs Asembler - implementacja pętli while ten sam przykład nieco inaczej a = 40; b = 25; while (a != b) { if (a > b) a -= b; else b -= a; } prosty przykład w C i jego odpowiednik w asemblerze SUBGT – Subtract if Greater Than Z=0 i (N=V) CMP - Compare, wpływa na flagi N, Z, C, V; operacja (R0 – R1) BNE - Branch if Not Equal (Z=0) MOV R0, #40 MOV R1, #25 dalej: CMP R0, R1 SUBGT R0, R0, R1 SUBLT R1, R1, R0 BNE dalej SUBLT – Subtract if Less Than N≠V stop: 33 ; R0 odpowiednik a ; R1 odpowiednik b B stop ARM – magistrale połączeniowe 35 Magistrala Local Bus – komunikacją z pamięcią operacyjną Magistrala AHB - Advanced High Performance Bus – komunikacja z urządzeniami peryferyjnymi jak: VIC, pamięć RAM portu USB, Ethernet Magistrala VBP - VLSI Peripheral Bus – komunikacja z pozostałymi urządzeniami peryferyjnymi, możliwość pracy z wolniejszymi urządzeniami LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 8 • • 36 Układów LPC2368 posiada 4 porty I/O, Każda z linii może spełniać jedną z wielu funkcji np.: http://www.nxp.com/documents/user_manual/UM10211.pdf LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 GPIO P0.0 RD1 00 P0.0/RD1/TXD3/SDA1 01 TXD3 10 SDA1 11 http://www.nxp.com/documents/user_manual/UM10211.pdf RESET 0x00000000 PINSEL0 bity Stany 37 1 s158 0 Opis funkcji 00 domyślnie, port GPIO 01 odbiornik linii CAN, RD1 10 nadajnik UART, TXD3 11 Linia danych I2C, SDA1 • • Za wybór odpowiedniej funkcji linii wyjściowej odpowiada odpowiedni rejestr PINSELx, a dokładniej bity 1 i 0 Po włączeniu zasilania i po każdym resetowaniu układu wszystkie linie I/O działają jako GPIO (General Purpose Input/Output) LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 P0.0/RD1/TXD3/SDA1 IODIR0 IOCLR0 IOSET0 • Każda linia I/O jest sterowana za pomocą bitów w rejestrach: • • IODIR – odpowiada za kierunek portu: 1 – wyjście, 0 - wejście IOPIN – pozwala odczytać stan linii portu skonfigurowanego jako wejście, zapis wartości powoduję zmianę stanu portu IOCLR – odpowiada za zerowanie stanu linii wyjściowej IOSET – odpowiada za ustawienie wartości 1 na linii wyjściowej • • 38 PORT P0 IOPIN0 LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 • • • • IODIR – odpowiada za kierunek portu: 1 – wyjście, 0 - wejście IOPIN – pozwala odczytać stan linii portu skonfigurowanego jako wejście IOCLR – odpowiada za zerowanie stanu linii wyjściowej IOSET – odpowiada za ustawienie wartości 1 na linii wyjściowej Sposób użycia w C: IODIR0=0x00FF0000; IOSET0=0x00F00000; IOCLR0=0x00F00000; • // linie 16 – 23 portu P0 ustawiono jako wyjście // linie 20 – 23 ustawiono w stan wysoki // linie 20 – 23 ustawiono w stan niski IOCLR, IOSET – zmieniają tylko i wyłącznie stan określonej linii bez modyfikacji pozostałych IOSET0=0xF1000081; 1 39 31 1 1 1 28 1 25 1 11 7 1 3 0 LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 • • Nieco inną odmianę wyjść GPIO stanowią szybie wyjścia FGPIO, (Fast General Purpose Input/Output), Szybkie linie/porty wyjściowe komunikują się z rdzeniem ARM za pośrednictwem szybkiej magistrali local bus. FIOnDIR – rejestr kierunku FIOnPIN – odczyt wartości panującej na porcie, zapis do tego rejestru zmienia stan portu FIOnSET – ustawienie wartości „1” na danym pinie portu FIOnCLR – ustawienie wartości „0” na danym pinie portu FIOnMASK – rejestr maski portu, pozwala na określenie, które linie portu mogą być zmienione, zapis i odczyt jest możliwy tylko do/z tych linii portu, które odpowiadają bitom rejestru o wartości „0” IOPIN0 = (IOPIN0 && 0xFFFF00FF) || 0x0000A500 FIO0MASK = 0xFFFF00FF; 40 FIO0PIN = 0x0000A500; LPC2368 - sterowanie portami wyjściowymi „pull up”, „pull down” …. • • • Podobnie jak w układach AVR, dla wyjść GPIO możliwe jest ustawienie rezystora podciągającego do VCC lub GND, Za ustawienie odpowiada rejestr PINMODE, a dokładniej każde jego 2 bity Pull-up/pull-down może być ustawiony dla każdej linii niezaleznie or realizowanej funkcji P0.15 pull-up P0.0 RESET 0x00000000 PINMODE0 31 41 30 bity 1 Stany Opis funkcji 00 domyślnie, na linii portu pull-up 01 wartość zarezerwowana 10 brak pull-up oraz pull-down 11 na linii portu pull-down 0 PINMODE0 PINMODE1 PINMODE2 PINMODE3 PINMODE4 PINMODE5 PINMODE6 … – – – – – – – P0.0 – P0.15 P0.16 – P0.26 P1.0 – P1.15 P1.16 – P1.31 P2.0 – P2.15 zarezerwowany P3.0 – P3.15 pull-down Programowanie układów ARM - plik Startup.s LPC2300.s • • • 1 Definicja stałych symbolicznych 2 Oprogramowanie wektorów przerwań • • Skoki do odpowiednich procedur obsługi Inicjalizacja adresów tych procedur 3 Oprogramowanie specyficznych urządzeń peryferyjnych • • • • Konfiguracja zegara PLL Wyłączenie układu watchdog Odblokowanie sygnału RESET Mapowanie pamięci 4 Inicjalizacja rdzenia ARM7TDMI • Inicjalizacja wskaźników stosu w poszczególnych trybach pracy układu • Wywołanie funkcji inicjalizującej zmienne i biblioteki języka C lub asembler 5 42 oprogramowanie wektora resetu oraz wektorów przerwań oprogramowanie kluczowych urządzeń peryferyjnych: kontroler pamięci, PLL alokacja miejsca na stosy oraz inicjalizacja wskaźników stosu Inicjalizacja bibliotek wymaganych przez kompilator oraz zmiennych globalnych lub skok do dalszej części programu Programowanie układów ARM - plik Startup.s LPC2300.s 1• Definicja stałych symbolicznych – określenie wartości bitów M4-M0 • Definicja stałych symbolicznych – rozmiar stosu w bajtach rozmiar stosów należy dostosować do wymagań docelowej aplikacji 43 A może sprawdzimy wiadomości … - z poprzedniego wykładu ? 1. Wymień dwie różnice w architekturze von Neumanna i Harwardzkiej. W jakiej architekturze wykonano układ LPC2368 2. Czego dotyczy little-endian i big-endian na przykładzie 0xFF nr_indeksu (6 ostatnich liczb) 3. Rozszyfruj skrót ARM 4. Ile rejestrów (wszystkich) posiada rdzeń ARM7, ile z tego może wykorzystać użytkownik 5. Jak jest zasadnicza różnica dla trybu ARM i THUMB? Dziękuję za uwagę http://geekandpoke.typepad.com/geekandpoke/2011/09/simply-explained-1.html