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

Podobne dokumenty