🎯 Kolokwium z Mikroprocesorów
📖 Tematy z poprzedniego kolosa (sprzed 2 lat)
100% pytań było z sekcji 1 (Narzędzia) i 5 (ARM). Aktualny kurs ma wszystkie 5 sekcji — przygotuj się szeroko.
🔧 Narzędzia uruchomieniowe
Software
- Asembler / makro-asembler
- Kompilator
- Linker (konsolidator)
- Bibliotekarz
- Symulator
- Debugger
Hardware
- Płytka komputerowa
- Płytka uruchomieniowa (development board)
Hardware control
- Symulator pamięci programu (ROM)
- Program zdalnego ładowania
- Emulator wewnątrz-układowy (ICE)
Urządzenie zastępujące fizyczną pamięć ROM w prototypie. Podłączane w miejsce pamięci programu — zachowuje się jak ROM, ale jego zawartość można zmieniać przez interfejs (zwykle z PC).
Zalety:
- Szybkie przeładowanie programu bez wymiany ROM
- Eliminuje cykl programowania pamięci EPROM/FLASH
- Skraca czas debugowania (sekundy zamiast minut/godzin)
- Daje dostęp do podglądu wykonywanego kodu
Główna metoda przed pojawieniem się MCU z FLASH/JTAG.
Kod przesyłany z PC do mikrokomputera przez interfejs I/O. Program zdalnego ładowania (w ROM) odbiera kod i zapisuje do RAM (do przestrzeni programu).
Format INTELA (Intel HEX) — ⭐ Pyt. 4 z kolosa
Wiadomość tekstowa heks. Każdy rekord poprzedzony dwukropkiem ":". Struktura:
- 2 znaki — długość danych (w bajtach)
- 4 znaki — adres ładowania (load address)
- 2 znaki — typ rekordu
- N znaków = 2 × długość — same dane
- 2 znaki — suma kontrolna (checksum)
Ostatnia linia (EOF marker): :00000001FF
Organizacja pamięci 8051 przy zdalnym ładowaniu:
| Adres | CODE | XDATA | Sygnał |
|---|---|---|---|
| 0x0000–0x0FFF | ROM (program) | RAM (dane) | PSEN dla ROM, RD/WR dla RAM |
| 0x1000–0xFFFF | RAM | RAM | tylko RD/WR |
Niezastąpione narzędzie do debugowania systemów wbudowanych. Pozwala precyzyjnie monitorować, analizować i modyfikować przepływ danych na magistrali.
Magistrala mikrokomputera = 3 typy linii:
- Linie danych (data) — transportują dane między komponentami
- Linie adresowe (address) — wskazują miejsce docelowe danych
- Linie kontrolne (control) — sterują przepływem i sygnałami niemodyfikującymi pamięci
6-krokowy proces przechwytywania:
- Podłączenie — fizyczne podłączenie emulatora do magistrali przez złącze i interfejs
- Przechwytywanie danych — emulator monitoruje sygnały na liniach magistrali; gdy CPU lub inne urządzenie przesyła dane, ICE je przechwytuje
- Analiza danych — sprawdzenie poprawności, diagnoza błędów, monitorowanie transferów
- Modyfikowanie danych — ICE może wstrzykiwać zmiany na danych, adresach lub sygnałach kontrolnych
- Sterowanie przerwaniami — emulator zarządza sygnałami przenoszeń, symuluje zdarzenia
- Rejestrowanie danych — log wartości danych, adresów i sygnałów kontrolnych do późniejszej analizy
Standard interfejsu do komunikacji z emulatorem wewnątrz-układowym oraz do programowania pamięci. Wbudowany blok EmbeddedICE w procesorze daje pełen dostęp.
Sygnały TAP controller:
TMS— Test Mode Select (wybór trybu)TDI— Test Data InputTDO— Test Data OutputTCK— Test Clock (sygnał zegarowy)RTCK— Return TCK (zwrotny zegar)
Sygnały reset:
nSRST— System Reset (aktywny niski)nTRST— Test Reset
EmbeddedICE wewnątrz CPU:
DBGRQ— debug requestDBGACK— debug acknowledge
Zastosowania: boundary scan, debugowanie, programowanie flash, testowanie połączeń między układami.
📊 Analiza sygnatur
Metoda kompresji długich strumieni danych do krótkich "podpisów" (signature) w celu wykrywania błędów. Stosowana w testowaniu układów cyfrowych — porównuje się signature wzorcowy z otrzymanym po teście.
S(x) jest typowo 16-bitowy (4 znaki heksadecymalne). Algorytm wykorzystuje liniowy rejestr przesuwny ze sprzężeniem zwrotnym (LFSR) z określonym wielomianem charakterystycznym.
Reprezentacja bitowa współczynników (od x¹⁶ do x⁰):
Wielomian dualny (od końca, służy do analizy):
Signature jako reszta z dzielenia:
Kluczowe zmienne: n = długość rejestru (zwykle 16), m = długość strumienia danych.
Warunki błędu:
- m ≤ n: WSZYSTKIE niezerowe error series są wykrywane (Q(x)=0, więc R(x)=E(x)≠0)
- m > n: niektóre error series mogą dawać R(x)=0 (niewykryte): E(x) = Q(x)·2ⁿ·G(x)
Pe (prawdopodobieństwo błędu niewykrytego) dla n=16:
| m | Me (niewykryte) | M (wszystkie) | Pe | P (wykryte) |
|---|---|---|---|---|
| ≤ 16 | 0 | 2^m - 1 | 0 | 1.000000 |
| 17 | 1 | 131 071 | 0.000008 | 0.999992 |
| 18 | 3 | 262 143 | 0.000011 | 0.999989 |
| 20 | 15 | 1 048 575 | 0.000014 | 0.999986 |
| → ∞ | ~2^(m-n) | ~2^m | 1/2¹⁶ ≈ 0.000015 | ≈ 0.999985 |
Wpływ długości rejestru n (przy m → ∞):
| n | Pe | P |
|---|---|---|
| 16 | 1.5 · 10⁻⁵ | 0.999985 |
| 32 | 2.3 · 10⁻¹⁰ | 0.99999999977 |
| 48 | 3.6 · 10⁻¹⁵ | 0.9999999999999965 |
| 64 | 5.4 · 10⁻²⁰ | 0.999999999999999999946 |
Signature 16-bit = 4 znaki, ale alfabet różni się od standardowego heks. Użyto: 0–9, A, C, F, H, P, U zamiast 0–9, A–F.
Powód: lepsza czytelność na wyświetlaczu LED. Litery B, D, E mogą być mylone z 8, 0, 6.
| Bity Q3..Q0 | Znak | Bity Q3..Q0 | Znak |
|---|---|---|---|
| 0000 | 0 | 1000 | 8 |
| 0001 | 1 | 1001 | 9 |
| 0010 | 2 | 1010 | A |
| 0011 | 3 | 1011 | C |
| 0100 | 4 | 1100 | F |
| 0101 | 5 | 1101 | H |
| 0110 | 6 | 1110 | P |
| 0111 | 7 | 1111 | U |
Signature Analysis
LFSR z wielomianem G(x)
- ✓ Pe stałe ~ 2⁻ⁿ niezależnie od m
- ✓ Wykrywa 100% błędów pojedynczych
- ✓ P ≥ 99.998% nawet dla bardzo długich strumieni
Transition Counting
Licznik zmian stanu (0→1, 1→0)
- ✗ Gubi (m-1)/2^m błędów
- ✗ Dla dużych m → ~50% błędów
- ✗ Słaba detekcja podstawowych błędów
Wniosek: signature analysis znacznie lepsza, zwłaszcza dla długich strumieni. Wykres Pe wymaga skali logarytmicznej, żeby pokazać przewagę.
Tryby:
- Free-running (open loop) — pętla feedback CPU otwierana, instrukcje NOP wymuszane na CPU
- Program-driven — analyzer dołączony do działającego programu
Algorytmy implementacji:
- Serial — bit po bicie przez LFSR
- Parallel — bajtowa procedura:
temp = b ^ (l<<1) ^ (h<<7) ^ (l>>1) ^ (h<<4) ^ (l>>4) ^ h - Table — tablica precomputed dla l i h, najszybsza
⚖️ CISC vs RISC
Aby zmniejszyć czas wykonania, można zmniejszyć dowolny czynnik:
- RISC redukuje cykle/instrukcję (każda instrukcja prosta, 1 cykl)
- CISC redukuje instrukcje/program (jedna instrukcja robi więcej)
CISC
Complex Instruction Set Computing
- ALU ↔ pamięć lub rejestry (z zapisem zwrotnym)
- Wiele trybów adresowania danych
- Adresowanie: reg1 = reg1 op reg2
- Wykonanie szeregowe
- Mało rejestrów
- Dużo instrukcji (złożone)
- Złożona budowa
- Większy pobór mocy
- Większy koszt
- Mniejsza szybkość
RISC
Reduced Instruction Set Computing
- ALU ↔ tylko rejestry (load/store dla pamięci)
- Mało trybów adresowania
- Adresowanie: reg3 = reg1 op reg2
- Wykonanie potokowe
- Dużo rejestrów
- Mało instrukcji (proste, 1 cykl)
- Prosta budowa
- Mniejszy pobór mocy
- Mniejszy koszt
- Większa szybkość
CISC
┌───────┐
│ ALU │
└─┬───┬─┘
│ │
┌───┘ └───┐
┌──▼───┐ ┌────▼────┐
│Pamięć│ │Rejestry │
└──┬───┘ └────┬────┘
└──────────┘
ALU operuje i na pamięci, i na rejestrach
RISC
┌───────┐
│ ALU │
└───┬───┘
│
┌────▼────┐
│Rejestry │←─┐
└─────────┘ │
│ load/store
┌──▼───┐
│Pamięć│
└──────┘
ALU tylko na rejestrach, pamięć przez LDR/STR
| Cecha | ARM/MIPS (RISC) | Intel x86 (CISC) |
|---|---|---|
| Szybkość (CoreMark/MHz) | ~2.88 | ~3.19 (+4–8%) |
| Pobór mocy (mW/MHz) | ~0.4 (40–50% mniej) | ~0.56 |
| Powierzchnia krzemu | ~1.4 mm² (3–4× mniej) | ~6 mm² |
Szeregowe (CISC): każda instrukcja przechodzi wszystkie 5 faz zanim zacznie się następna.
Potokowe (RISC): 5 instrukcji jednocześnie (jedna na fazę) → ~5× wzrost przepustowości.
Fazy instrukcji:
FE— fetch (pobranie kodu operacji)DE— decode (dekodowanie)RD— read data (odczyt danych)PR— process (przetwarzanie)WR— write (zapis)
🎯 Mikrokomputer 8051
- 8-bitowy mikrokomputer, większość instrukcji 8-bit (niektóre 1- i 16-bit)
- Złożona lista rozkazów (CISC), 1-bajtowy kod operacji = 255 instrukcji
- Architektura Harvarda — oddzielne przestrzenie: pamięć programu i pamięć danych
- 16-bit szyna adresowa → 64 KB programu + 64 KB zewn. danych
- 128 lub 256 B wewn. pamięci danych
- 4 zestawy po 8 rejestrów 1-bajtowych (R0–R7), banki przełączane przez RS0/RS1 w PSW
- 8-bit ALU + akumulator, 1-bit LU + akumulator logiczny
- 8-bit szyna danych współdzielona z młodszym bajtem szyny adresowej
- Priorytetowy podsystem przerwań na 2 poziomach ⭐
- Mała zwłoka w obsłudze przerwań (kontekst w rejestrach + na stosie)
- 4 bajtowe 2-kierunkowe równoległe porty I/O
- Kanał szeregowy (UART) + 2 liczniki/czasomierze 16-bit
- 2 tryby oszczędności energii
Producenci: Infineon, Silicon Labs, Maxim Integrated, Microchip, Megawin, DCD i inni.
| Bit 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| C | AC | F0 | RS1 | RS0 | V | - | P |
- C — carry (przeniesienie)
- AC — auxiliary carry (przeniesienie pomocnicze, dla BCD)
- F0 — user flag (dostępna dla programu)
- RS1, RS0 — register select (wybór banku rejestrów: 00→0, 01→1, 10→2, 11→3)
- V — overflow
- P — parity
| Pamięć | Tryb | Przykład |
|---|---|---|
| Wewn. word | Domyślne | inc dptr |
| Wewn. word | Natychmiastowe | mov dptr, #data16 |
| Wewn. byte | Domyślne | clr a |
| Wewn. byte | Rejestrowe | inc Rn |
| Wewn. byte | Bezpośrednie | mov a, byte |
| Wewn. byte | Rejestr. pośrednie | mov a, @Ri |
| Wewn. byte | Natychmiastowe | mov a, #data |
| Zewn. byte | Rejestr. pośrednie | movx a, @dptr |
| Wewn. bit | Bezpośrednie | setb bit |
Oznaczenia operandów:
- bit — adres bitu (0÷127 RAM lub 128÷255 SFR)
- Rn — rejestr R0÷R7 w aktualnym banku
- byte — adres bajtu w wewn. pam. danych
- @Ri — pośrednie przez R0/R1
- #data, #data16 — stała 8/16-bit
| Procesor | Bramki | Razy szybszy | DMIPS | Pamięć kodu |
|---|---|---|---|---|
| 8051 (klasyk) | - | 1× | 0.094 | 64 KB |
| DQ8051 (FPGA) | 9 900 | 29× | 0.273 | 64 KB |
| DQ80251 (FPGA) | 13 500 | 75× | 0.706 | 8 MB |
DMIPS = Dhrystone MIPS, miara wydajności względem VAX 11/780 (1977). Ulepszone wersje IC mają max 50% szybkości DQ8051.
Warianty 8051 — sekcje 2.2-2.5 syllabusa
"Najwyższa wydajność wśród 8051-kompatybilnych" — drop-in replacement dla 8xC51.
- Wykonuje instrukcje do 12× szybciej niż klasyk przy tej samej f
- 1 MIPS/MHz, 33 MIPS przy 33 MHz
- Cykl maszynowy = 1 takt (zamiast 12 w klasyku)
- Czas instrukcji od 30 ns
- INC dptr aż 24× szybsza
- 256 B direct RAM + 1 kB MOVX RAM
- 3 × 16-bit timer/counter, 2 full-duplex serial
- Liczniki domyślnie w trybie 12 taktów (zgodność), ale każdy programowo w 1 takt
- Dual data pointer — usuwa zbędne instrukcje przy kopiowaniu pamięci
"Wysokowydajne i energooszczędne mikrokontrolery Flash" — rdzeń 8051 z pojedynczym cyklem maszynowym.
- Klasyk: 12 taktów/bajt; AT89LP: 1 takt/bajt (12× przepustowości)
- Instrukcje wykonują się w 1–4 taktach
- 70% instrukcji: liczba taktów = liczba pobieranych bajtów
- 20 MIPS przy 20 MHz (klasyk: <2 MIPS)
- Vcc do 2,0 V
- Pobór: 1.1 mA @ 3.6V/1MHz aktywnie; <1 µA power-down
Modernizowany rdzeń 8051 z potokiem dla mixed-signal MCU.
- Architektura CIP-51 — pipeline Fetch / Decode / Execute
- Zachowuje zgodność kodu z oryginalnym Intelem
- Bazowa architektura niemal identyczna z 8051 (kompatybilność wsteczna)
- Operacje logiczne mogą być wykonywane na rejestrach (nie tylko przez ALU) — szybsza obsługa I/O
- Sterowanie portami I/O w 2 cyklach (test linii + zapis stanu)
- Bankowane 32 rejestry dla wielowątkowości i szybkiej obsługi przerwań
Implementacje rdzenia 8051 / 80251 jako IP core w FPGA.
| Rdzeń | Bramki | Szybciej niż 8051 | DMIPS | Kod | Instrukcje |
|---|---|---|---|---|---|
| DQ8051 | 9 900 | 29× | 0.237 | 64 KB | 8051 |
| DQ80251 | 13 500 | 75× | 0.706 | 8 MB | 8051+80251 |
Kluczowa cecha: oba zawierają wbudowany emulator wewnątrz-układowy (ICE).
🦅 AVR ATmega32A
- 8-bit RISC Microchip/Atmel
- 131 instrukcji, większość w 1 cyklu zegarowym
- 32 × 8-bit rejestry GP (R0–R31)
- Do 16 MIPS przy 16 MHz (1 MIPS/MHz)
- Multiplier 2-cycle on-chip
- 32 KB Flash, 1 KB EEPROM, 2 KB SRAM
- 10 000 cykli zapisu Flash, 100 000 EEPROM
- 4 PWM channels, 10-bit ADC (8 kanałów)
- JTAG (boundary scan + debug + programowanie)
- 32 programowalne linie I/O
- Vcc: 2.7–5.5 V, 0–16 MHz
- Harvard (oddzielne pamięć programu i danych)
- 32 rejestry → 4 schematy I/O: 1×8→1×8, 2×8→1×8, 2×8→1×16, 1×16→1×16
- R26-R31 → wskaźniki adresowe (16-bit) dla adresowania pośredniego:
- X = R27:R26
- Y = R29:R28
- Z = R31:R30
- Stack rośnie w dół (od high → low). Stack Pointer = SPH:SPL w I/O space, PUSH dekrementuje SP
- Instrukcje 16 lub 32-bit → Flash organizowany jako 16K × 16
| Bit 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|
| I | T | H | S | V | N | Z | C |
- I — Global Interrupt Enable
- T — Bit storage (Transfer)
- H — Half Carry (dla BCD)
- S — Sign (N⊕V)
- V — Overflow, N — Negative, Z — Zero, C — Carry
- Direct — bezpośredni adres
- Indirect — przez wskaźnik X, Y lub Z
- Indirect with Displacement — Y/Z + offset (max 63)
- Indirect with Pre-decrement — najpierw zmniejsz wskaźnik, potem dostęp
- Indirect with Post-increment — najpierw dostęp, potem zwiększ wskaźnik
W 8051 trzeba ręcznie INC dptr.
Wejście: SE=1 w MCUCR + instrukcja SLEEP. Wybór trybu: bity SM2/SM1/SM0.
- Idle — CPU stop, peryferia działają
- ADC Noise Reduction — minimalizuje zakłócenia ADC
- Power-down — wszystko stop, tylko external IRQ wybudza
- Power-save — power-down + asynchroniczny timer
- Standby — power-down + oscillator running (szybki wakeup)
- Extended Standby — Standby + asynchroniczny timer
| Rodzina | Flash | Pinout | Charakterystyka |
|---|---|---|---|
| tinyAVR | 1–16 KB | 8–32 pin | Najmniejsze, GP |
| megaAVR | 4–256 KB | 28–100 pin | Hardware multiplier, ATmega |
| AVR XMEGA | 16–384 KB | 44–100 pin | DMA, Event System, 16-bit |
| AVR32 UC3 | 16–512 KB | 48–144 pin | 32-bit (deprecated) |
⚖️ AVR vs 8051 — kluczowe porównanie
✓ Zalety AVR
- Cykl = 1 takt (8051: 12) → wielokrotnie szybsze instrukcje
- EEPROM — 8051 nie ma
- Wewn. RC + POR — komputer bez zewn. elementów
- Watchdog — niezawodność
- Obie zmiany IRQ (8051: tylko opadająca)
- Zoptymalizowany pod programowanie w C
✗ Wady AVR
- Większy kod (RISC) — 20–50% więcej pamięci niż 8051
- 1 poziom IRQ (8051: 2 poziomy)
- Trudna obsługa IRQ — ręczny SREG na stos (8 B)
- Tylko 3 wskaźniki pamięci (X,Y,Z); 8051: 9 (DPTR + R0/R1×4)
- Brak instrukcji wymiany bez wyłączania IRQ (8051: JBC, XCH)
- Mniejszy podział wstępny UART (28 vs 217)
Większość niedogodności AVR można skompensować dodatkowym oprogramowaniem.
- Wyprowadzenia kompatybilne: AT89C2051 → ATtiny2313A; AT89C51/52 → ATmega8515
- Dostępne z pamięcią FLASH (łatwa i tania programistyka)
- Wyjątek: aktywny poziom logiczny RESET (rozwiązywalny przez POR)
💻 Zaawansowane programowanie 8051
Program w asemblerze:
Edytor → Asembler → Kod obiektowy → Linker → Executable → MCU
Program w języku C:
Edytor → Kompilator → Kod obiektowy → Linker → Executable → MCU
Program hybrydowy:
.c → Kompilator ─┐
├→ Linker → Executable → MCU
.s03 → Asembler ─┘
Dodatkowe narzędzie: Bibliotekarz zarządza bibliotekami kodu obiektowego.
| Metoda | Zalety | Wady |
|---|---|---|
| 1. Rejestry | Szybka i prosta | Ograniczona liczba rejestrów |
| 2. Zmienne globalne | Nieograniczona liczba param. | Rezerwacja pamięci, złożona init |
| 3. Tablica sterująca | Wiele param. przez 1 wskaźnik | Rezerwacja pamięci |
| 4. Stos | Pozwala na rekurencję | Większy narzut na stos |
| 5. In-line code | Param. tuż za CALL | Wymaga przesunięcia PC |
Metody zwracania wyników — takie same minus in-line code (nie ma sensu dla return).
name PROG ; nagłówek modułu extern _R ; symbole zewnętrzne equ buflen 16 ; stałe rseg CODE ; segment pamięci programu mov PSW, #_R ; ustawienie banku rejestrów mov SP, #BSTACK-1 ; init stosu ... dw 12H, 34H ; dane stałe db 'ABCD', 0 rseg ISTACK ; segment dla stosu (internal data) BSTACK: ds 16 rseg BYTES ; bajtowe dane (internal) buf: ds buflen end
Kluczowe segmenty:
- CODE — pamięć programu
- ISTACK — internal stack
- BYTES — bajtowe dane wewnętrzne
- XDATA — bajtowe dane zewnętrzne
Model pamięci określa sposób wykorzystania zasobów pamięci. Trade-off: szybkość vs rozmiar pamięci danych.
| Model | Pamięć danych | Adresowanie | Rozmiar | Szybkość |
|---|---|---|---|---|
| tiny | internal direct | bezpośrednie | 128 B | szybkie |
| small | internal indirect | @Ri | 256 B | średnie |
| large | external XDATA | DPTR | 64 KB | wolne |
Porównanie kosztów dostępu (8051):
| Tryb | Przykład | Bajtów | Cykli |
|---|---|---|---|
| Bezp. wewn. | mov a, 20 | 2 | 1 |
| Pośr. wewn. | mov r0, #20; mov a, @r0 | 3 | 2 |
| Zewn. (XDATA) | mov dptr, #20; movx a, @dptr | 4 | 4 |
cstartup.s03 — moduł asemblerowy wykonywany przed wywołaniem funkcji main(). Łączy świat asemblera (gdzie wszystko trzeba zrobić ręcznie) ze światem C (gdzie main() oczekuje gotowego środowiska).
Co robi cstartup:
- Inicjalizacja stosu C (CSTACK) — do LCALL i tymczasowych danych
- Inicjalizacja stosu asemblerowego (ISTACK) — do RET
- Ustawienie banku rejestrów (RS1/RS0 w PSW)
- Skok z reset interrupt vector do init
- Wywołanie
main()przez LCALL - Po powrocie: skok do
?C_EXIT
NAME CSTARTUP $defmodel.inc EXTERN ?C_EXIT, _R, main RSEG CSTACK stack_begin: DS 30 ; rezerwacja stosu C RSEG ISTACK istack: DS 16 RSEG RCODE mov PSW, #_R ; bank rejestrów mov SP, #istack-1 mov sp_C, #stack_begin LCALL main ; wywołanie main() LJMP ?C_EXIT END
Funkcja w asemblerze wywoływana z C:
// w pliku C extern int my_asm_func(int x, int y);
Asm musi:
- Zachować konwencje wywołania kompilatora (rejestry/stos)
- Zwrócić wynik przez konwencję (np. R6/R7 = LSB/MSB w IAR)
- Mieć nazwę z prefiksem
_(zwykle) - Być w segmencie zgodnym z modelem pamięci wywołującego programu
Kategorie dyrektyw asemblera 8051:
- Module control: NAME, MODULE, ENDMOD, END
- Symbol control: PUBLIC, EXTERN, EQU, SET
- Segment control: RSEG, CSEG, DSEG, BSEG, XSEG
- Conditional assembly: IF, ELSE, ENDIF
- Data definition: DB (byte), DW (word), DS (storage)
- Assembler control: ORG, USING
🦾 Architektura ARM
- Load/Store — jedyne instrukcje komunikujące rejestry z pamięcią (LDR/STR). ALU operuje tylko na rejestrach.
- Wyrównanie pamięci — słowo na adresie ÷4, półsłowo ÷2, bajt dowolnie
- 16 rejestrów 32-bitowych (R0–R15), jednolity zestaw
- Stała długość instrukcji = 32 bity → ułatwia dekodowanie i pipeline (kosztem gęstości kodu)
- Większość instrukcji wykonuje się w 1 cyklu maszynowym
- Przetwarzanie potokowe — ARM7: 3-stop (FE/DE/EX), ARM9: 5-stop
Stała długość ułatwia procesor, ale obniża gęstość kodu. Dodano:
- Wykonanie warunkowe niemal każdej instrukcji → redukuje skoki (brak kary za branch prediction)
- Sufiks S — flagi CPSR aktualizowane tylko gdy potrzeba:
ADDS R2,R1,R0 - Barrel shifter 32-bit — wbudowany w większości instrukcji arytm./logicznych:
ADD R2,R1,R0,LSL 2 - Rozbudowane tryby adresowania indeksowego
- Link Register R14/LR — szybkie wywołania funkcji
- 2-poziomowy podsystem przerwań z bankowanymi rejestrami
| Rejestr | Nazwa | Funkcja |
|---|---|---|
| R0–R12 | GPR | Ogólnego przeznaczenia |
| R13 | SP | Stack Pointer — wskaźnik stosu |
| R14 | LR | Link Register — adres powrotu (BL/BLX) |
| R15 | PC | Program Counter — następna instrukcja |
| CPSR | — | Current PSR — flagi N,Z,C,V + tryb pracy |
| SPSR | — | Saved PSR — kopia CPSR przy wyjątku |
Łącznie 37 fizycznych rejestrów 32-bit (31 GPR + 6 statusowych), częściowo bankowanych wg trybu pracy.
| Tryb | Opis | Wejście |
|---|---|---|
| User | Normalny program | — |
| System | Uprzywilejowane OS | Modyfikacja CPSR |
| FIQ | Szybkie przerwanie (banked R8–R14) | Sygnał FIQ |
| IRQ | Ogólne przerwanie | Sygnał IRQ |
| SVC | Tryb nadzorcy OS | Instrukcja SWI |
| ABT | Błąd pamięci (Abort) | Błąd prefetch/data |
| UND | Niezdefiniowana instrukcja | Brak instrukcji |
Wejście w wyjątek — 5 kroków:
- Zapisz
PC → LR (R14)— adres powrotu - Zapisz
CPSR → SPSRnowego trybu - Ustaw bity trybu w CPSR odpowiadające wyjątkowi
- Wyłącz przerwania niższego priorytetu
- Załaduj wektor wyjątku do PC
Wektory wyjątków (ARM7TDMI):
| Priorytet | Wyjątek | Adres wektora |
|---|---|---|
| 1 (najwyższy) | Reset | 0x00000000 |
| 2 | Data Abort | 0x00000010 |
| 3 | FIQ | 0x0000001C |
| 4 | IRQ | 0x00000018 |
| 5 | Prefetch Abort | 0x0000000C |
| 6 (najniższy) | Undefined / SWI | 0x00000004 / 0x00000008 |
Arytmetyczne
ADD ADC SUB SBC RSB RSC CMP CMN
Logiczne
AND BIC OR EOR TST TEQ
Mnożenia
MUL MLA UMULL SMULL UMLAL SMLAL
Skoki
B BL BX
BL zapisuje adres powrotu w LR; BX przełącza ARM↔Thumb
Przesłania
MOV MVN LDR STR LDM STM SWP
System
MRS MSR SWI MRC MCR LDC STC CDP
Wykonanie warunkowe — sufiks 2-literowy:
EQ Z=1 NE Z=0 MI N=1 PL N=0 CS C=1 CC C=0
GE N=V LT N≠V GT Z=0,N=V LE Z=1 lub N≠V
ADDEQ R2,R1,R0 ; R2 = R1+R0 tylko gdy Z=1 STRGT R0,[R1] ; zapisz tylko gdy GT
| Wersja | Kluczowe nowości |
|---|---|
| ARMv4 | Baseline: 32-bit, mnożenie, JTAG (D), ICE (I), AMBA |
| ARMv4T | + Thumb (16-bit): 65% rozm. ARM, 160% wyd. na 16-bit pam. |
| ARMv5 | + DSP (32×16, 16×16 w 1 cyklu), VFPv2 (IEEE 754), Jazelle (8× Java) |
| ARMv6 | + unaligned access, SIMD multimedia (4× kodeki), Thumb-2, TrustZone |
| ARMv7 | + rodzina Cortex (M/R/A), Thumb-2 wszędzie, VFPv3, NEON (400% DSP) |
| ARMv8-A | + AArch64 (64-bit), 31 GPR × 64-bit, A64 ISA |
- Instrukcje 32-bitowe dodane do zestawu Thumb dla:
- obsługi wyjątków w stanie Thumb
- dostępu do koprocesorów
- instrukcji DSP i multimediów
- wydajności gdy 16-bit instrukcja jest bottleneckiem
- Instrukcja IT (If-Then) — 16-bit: warunkowe wykonanie bloku 1–4 instrukcji Thumb
- CBZ/CBNZ — 16-bit Compare and Branch on Zero/NonZero: zastępuje 2 instrukcje jedną
Wynik: 31% mniej pamięci niż ARM, 38% więcej wydajności niż Thumb
| ARM | Thumb | Thumb-2 | |
|---|---|---|---|
| Szerokość instrukcji | 32-bit | 16-bit | 16+32 mixed |
| Gęstość kodu | niska | wysoka | średnio-wysoka |
| Wydajność | wysoka | niższa | blisko ARM |
| Wykonanie warunkowe | prawie wszystko | tylko skoki | blok IT |
| Rodzina | Profil | Zastosowanie |
|---|---|---|
| Cortex-M | M (Microcontroller) | Najbardziej energooszczędne MCU (IoT, sensory). Thumb-only. |
| Cortex-R | R (Real-time) | Real-time, safety-critical (automotive, storage). ARM + Thumb. |
| Cortex-A | A (Application OS) | Linux/Windows. ARM + Thumb + Thumb-2. 32 i 64-bit. |
| Neoverse | — | Skalowalna infrastruktura (chmura → edge) |
| SecurCore | — | Bezpieczeństwo fizyczne (smart cards, payment) |
| Ethos | — | ML inference (neural processing) |
Cortex-M — sub-warianty:
| Model | Architektura | Charakterystyka |
|---|---|---|
| M0 / M0+ | ARMv6-M | Najmniejszy gate count, ultra-low power, IoT |
| M1 | ARMv6-M | Dla FPGA |
| M3 | ARMv7-M | Low latency IRQ, automotive/industrial |
| M4 (F) | ARMv7E-M | DSP + opcjonalne FPU |
| M7 | ARMv7E-M | Najwyższa wydajność, SIMD DSP |
| M23 / M33 | ARMv8-M | + TrustZone (M33 też + DSP) |
| M55 | ARMv8.1-M | AI/ML, technologia Helium |
Wszystkie Cortex-M kompatybilne w górę — software reuse między generacjami.
🃏 Fiszki z całego materiału
Kliknij kartę żeby zobaczyć odpowiedź
0 / 24 kart odkrytych