Procesory osadzone ETD 7211 W3 22.10.2018
Oscylator kwarcowy Częstotliwość: 32 768 Hz Temperatura pracy: 25 28 C Dokładność pomiaru: 0.035 ppm/ C 2 (±1) 2 0,035 ppm = 0,035 ppm 1 C : 1,1 s/rok 10 C : 110 s/rok https://en.wikipedia.org/wiki/quartz_clock
Agenda Organizacja pamięci Obsługa programatora Ratowanie makiety Assembler i układy architektury ARM Obsługa wejść i wyjść ARM - Acorn RISC Machine do 1990 r. ARM - Advanced RISC Machine od 1990 r.
Odczyt Rej Shift ALu Zapis do Rej Potokowość (pipelining) - rozwiniecie Instrukcja Pobranie Dekodowanie Wykonanie ADDS R0, R4, R8 ADCS R1, R5, R9 ADDS R0, R4, R8 ORR R0, R0, #3 ADCS R1, R5, R9 ADDS R0, R4, R8 ADCS R3, R7, R1 ORR R0, R0, #3 ADCS R1, R5, R9 ADDS R0, R4, R8 ADCS R3, R7, R1 ORR R0, R0, #3 ADCS R1, R5, R9 Cykl zegara N N+1 N+2 N+3 N+4 Pobranie instrukcji Zamiana instrukcji Thumb -> ARM Dekodowanie Wybór rejestrów
Rozkazy procesora Rdzeń procesora ARM może pracować w jednym z następujących trybów: ARM Thumb Jazelle - 32-bitowe instrukcje, kod programu zostaje wyrównany do 4 bajtów, - szybszy nawet o 40% - Stosowany gdy wydajność jest parametrem krytyczny - zestaw 16-bitowych instrukcji, - upakowanie kodu większe nawet do 70% w stosunku do ARM, - zużycie mniejszej ilości pamięci/zasobów nawet do 30% - Mniejsze zużycie energii - tryb pozwalający na bezpośrednie wykonywanie instrukcji zgodnych ze specyfikacją języka Java, - wszystkie instrukcje są 8 bitowe, - procesor odczytuje zawsze 4 kolejne instrukcje 6
Rejestry specjalne Rejestry podstawowe Rejestry ogólnego przeznaczenia ARM7TDMI organizacja pamięci R0 R1 R12 R13 (SP) R14 (LR) R15 (PC) PSR PRIMASK CONTROL Stack Pointer Link Register Program Counter Program Status Reg. Primary Mask Reg. CONTROL Register 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 przeznaczenia, 6 rejestrów statusu W sumie 37 rejestrów * 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: 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 8
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 12 512 kb ON-CHIP NON-VOLATILE MEMORY - 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 13 512 kb ON-CHIP NON-VOLATILE MEMORY - 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 15 512 kb ON-CHIP NON-VOLATILE MEMORY - w skrócie wewnętrzna pamięć FLASH
LPC2368 - wektory przerwań w pamięci 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 tryb superużytkownika, zaraz po włączeniu zasilania 0xC ABORT wyjątek wystąpił w trakcie pobierania rozkazu 0x10 ABORT wyjątek wystąpił podczas dostępu do danych 0x14 Zarezerwowane sygnatura programu 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) 16
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 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 19
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 Słowo wejściowe: a 3 a 2 a 1 a 0 Rn Rm LSL LSR ASR przesunięcie logiczne w lewo a 2 a 1 a 0 0 przesunięcie logiczne w prawo 0 a 3 a 2 a 1 przesunięcie arytmetyczne w prawo 0 a 3 a 2 a 1 5 bitowa stała natychmiastowa, lub 8 najmłodszych bitów rejestru specyfikującego ROR rotacja w prawo a 0 a 3 a 2 a 1 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 24 SUB R4, R5, R6, ASR #2 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 R5 R6 0 100 16 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 R6, ASR #2 25 R6 4 SUB R4, R5, R6 R4 60 0 0 0 0 0 1 0 0 R4 = R5 - R6 0 1 1 0 0 0 0 0
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
Assembler 27 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihdafai.htm
Assembler - instrukcje http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.kui0100a/armasm_cihdafai.htm
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 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) C=1 i Z=0 LS unsigned lower or same mniejszy lub równy (liczby bez znaku) C=0 lub Z=1 GE signed greater than or equal większy lub równy N=V LT signed less than mniejszy N V GT signed greater than większy Z=0 i (N=V) 29 LE signed greater then or equal mniejszy lub równy Z=1 lub (N V) AL always zawsze (mnemonik można pominąć) bez znaczenia
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 30 Zalety instrukcji warunkowych: wykonywanie instrukcji warunkowych pozwala na unikanie rozgałęzień
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. MUL Rd, Rz, Rs MLA Rd, Rz, Rs, Rn // mnożenie Rd=Rz*Rs // mnożenie z dodawaniem Rd=Rn+(Rz*Rs)!!! Powyższe rozkazy zachowuję tylko młodszą część 64-bitowego wyniku!!! MULEQ R0, R1, R2 //mnożenie będzie wykonane gdy Z=1 MULS R0, R1, R2 //nastąpi uaktualnienie flag stanu w rejestrze CPSR Rozkazy 64-bitowego mnożenie i mnożenia z dodawaniem mają następującą postać: UMULL Rd LOW, Rd HIGH, Rm, Rs UMLAL Rd LOW, Rd HIGH, Rm, Rs // wynik < Rd LOW, Rd HIGH > = Rm*Rs // wynik < Rd LOW, Rd HIGH > = Rm*Rs 31
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) { //ciało funkcji asm { } ADD r1, a, #100 32 } } 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 int total; int i; total = 0; for (i = 10; i > 0; i--) { total += i; } prosty przykład w C i jego odpowiednik w asemblerze BNE - Branch if Not Equal przeskok warunkowy 33 etykiety: dalej, stop dalej: stop: MOV R0, #0 MOV R1, #10 ; wyzerowanie rejestru R0 ; zapisanie wartości 10 do R1 ADD R0, R0, R1 ; R0 - analogia zmiennej total SUBS R1, R1, #1 BNE dalej B stop ; pętla nieskończona
Język C vs Asembler - przykład, implementacja pętli while 34 a = 40; b = 25; while (a!= b) { if (a > b) a -= b; else b -= a; } 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) BLT - Branch if Less Than (N V) prosty przykład w C i jego odpowiednik w asemblerze MOV R0, #40 MOV R1, #25 ; R0 odpowiednik a ; R1 odpowiednik b dalej: CMP R0, R1 jeżeli Z=1, czyli R0=R1 BEQ stop BLT mniej SUB R0, R0, R1 B dalej mniej: SUB R1, R1, R0 jeżeli N=1 B dalej stop: B stop
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 CMP - Compare, wpływa na flagi N, Z, C, V; operacja (R0 R1) BNE - Branch if Not Equal (Z=0) 35 SUBGT Subtract if Greater Than Z=0 i (N=V) SUBLT Subtract if Less Than N V dalej: stop: MOV R0, #40 MOV R1, #25 CMP R0, R1 SUBGT R0, R0, R1 SUBLT R1, R1, R0 BNE dalej B stop ; R0 odpowiednik a ; R1 odpowiednik b
Struktura osadzona Kod pisany w języku C Instrukcje asemblera 5 instrukcji 5 lub 6 cykli zegarowych 36
ARM magistrale połączeniowe 37 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 Układów LPC2368 posiada 4 porty I/O, Każda z linii może spełniać jedną z wielu funkcji np.: 38 http://www.nxp.com/documents/user_manual/um10211.pdf
LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 GPIO P0.0 RD1 TXD3 SDA1 00 01 10 11 P0.0/RD1/TXD3/SDA1 PINSEL0 bity 1 0 RESET 0x00000000 http://www.nxp.com/documents/user_manual/um10211.pdf s158 39 Stany 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)
PORT P0 LPC2368 - sterowanie portami wyjściowymi - UM10211 Chapter 9 IOPIN0 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 40
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 1 1 1 1 1 1 41 31 28 25 11 7 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; FIO0PIN = 0x0000A500; 42
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 P0.0 pull-up pull-down 31 30 PINMODE0 bity 1 0 RESET 0x00000000 43 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 PINMODE0 P0.0 P0.15 PINMODE1 P0.16 P0.26 PINMODE2 P1.0 P1.15 PINMODE3 P1.16 P1.31 PINMODE4 P2.0 P2.15 PINMODE5 zarezerwowany PINMODE6 P3.0 P3.15
Programowanie układów ARM - plik Startup.s LPC2300.s 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 1 2 3 Definicja stałych symbolicznych Oprogramowanie wektorów przerwań Oprogramowanie specyficznych urządzeń peryferyjnych Skoki do odpowiednich procedur obsługi Inicjalizacja adresów tych procedur 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 44 5 Inicjalizacja bibliotek wymaganych przez kompilator oraz zmiennych globalnych lub skok do dalszej części programu Wywołanie funkcji inicjalizującej zmienne i biblioteki języka C lub asembler
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 45
Dziękuję za uwagę http://geekandpoke.typepad.com/geekandpoke/2011/09/simply-explained-1.html