Mikroprocesory — Notatki

⚡ Jutro · Poniedziałek 04.05

🎯 Kolokwium z Mikroprocesorów

📅 04.05.2026 (jutro)
👨‍🏫 dr inż. Andrzej Kalicki
📝 Pytania otwarte
🚫 Bez materiałów
📊 30 pkt
📚 Pełny syllabus kursu (1DR1621-A)
1
Sprzęt i oprogramowanie wspomagające uruchamianie programów (~4h)
1.1 Symulator pamięci programu · 1.2 Program zdalnego ładowania · 1.3 Emulator wewnątrz-układowy (ICE) · 1.4 Łącze JTAG · 1.5 Analiza sygnatur
2
Mikrokomputery 8-bitowe 8051 (~2h)
2.1 Własności 8051 · 2.2 DS80C450 (Maxim) · 2.3 AT89LP (Atmel) · 2.4 C8051 (Silicon Labs) · 2.5 DQ8051 (DCD)
3
Mikrokomputery 8-bitowe ATMega (~2h)
AVR ATmega32A, RISC, AVR vs 8051
4
Zaawansowane programowanie 8051 (~2h)
Przekazywanie parametrów · Asm/C/hybryda · Modele pamięci · cstartup · Segmenty
5
Mikrokomputery 32 i 64-bitowe ARM (~4h)
Cechy ARM · Wersje v4-v8 · Thumb/Thumb-2 · Rodziny Cortex

📖 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.

Nr 3
Przechwytywanie danych z magistrali (ICE) — 6 kroków
→ zakładka Narzędzia
Nr 4
Zdalne ładowanie kodu — format INTELA, JTAG diagram, PSEN
→ zakładka Narzędzia
Nr 5
Porównanie CISC i RISC — schemat, równanie, tabela
→ zakładka CISC vs RISC
Nr 6
Lista cech architektury ARM ⭐
→ zakładka ARM (sekcja 6 cech)
Nr 7
Thumb i Thumb-2 — lista ulepszeń
→ zakładka ARM
Nr 8
Rodziny ARM Cortex i ich zastosowania
→ zakładka ARM
💡 Strategia: Zacznij od ARM (60% prawdopodobieństwo trafienia bo z poprzedniego kolosa) → potem analiza sygnatur (sekcja syllabusa nieobecna na poprzednim kolosie — może się pojawić) → potem 8051 i AVR. Programowanie 8051 to długie pytania ale technika jest powtarzalna.

🔧 Narzędzia uruchomieniowe

Klasyfikacja narzędzi

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)
1.1 Symulator pamięci programu (ROM simulator)

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.

1.2 Program zdalnego ładowania kodu wykonywalnego

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:

AdresCODEXDATASygnał
0x0000–0x0FFFROM (program)RAM (dane)PSEN dla ROM, RD/WR dla RAM
0x1000–0xFFFFRAMRAMtylko RD/WR
PSEN (Program Store Enable) = sygnał odczytu z zewnętrznej pamięci programu (ROM). Aktywny gdy CPU pobiera instrukcję. Powyżej 0x1000 program leży w RAM (załadowany z zewnątrz) i jest dostępny przez RD/WR.
1.3 ICE — In-Circuit Emulator ⭐ Pyt. 3 z kolosa

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:

  1. Podłączenie — fizyczne podłączenie emulatora do magistrali przez złącze i interfejs
  2. Przechwytywanie danych — emulator monitoruje sygnały na liniach magistrali; gdy CPU lub inne urządzenie przesyła dane, ICE je przechwytuje
  3. Analiza danych — sprawdzenie poprawności, diagnoza błędów, monitorowanie transferów
  4. Modyfikowanie danych — ICE może wstrzykiwać zmiany na danych, adresach lub sygnałach kontrolnych
  5. Sterowanie przerwaniami — emulator zarządza sygnałami przenoszeń, symuluje zdarzenia
  6. Rejestrowanie danych — log wartości danych, adresów i sygnałów kontrolnych do późniejszej analizy
1.4 JTAG — Łącze diagnostyczne (IEEE 1149.1)

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 Input
  • TDO — Test Data Output
  • TCK — 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 request
  • DBGACK — debug acknowledge

Zastosowania: boundary scan, debugowanie, programowanie flash, testowanie połączeń między układami.

📊 Analiza sygnatur

Idea — Co to jest?

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.

strumień t(x) → LFSR (rejestr przesuwny + XOR feedback) → po m taktach: signature S(x)

S(x) jest typowo 16-bitowy (4 znaki heksadecymalne). Algorytm wykorzystuje liniowy rejestr przesuwny ze sprzężeniem zwrotnym (LFSR) z określonym wielomianem charakterystycznym.

Wielomian charakterystyczny (16-bit)
G(x) = x¹⁶ + x¹² + x⁹ + x⁷ + 1

Reprezentacja bitowa współczynników (od x¹⁶ do x⁰):

16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0

Wielomian dualny (od końca, służy do analizy):

Ψ(x) = x¹⁶ · G(1/x) = x¹⁶ + x⁹ + x⁷ + x⁴ + 1

Signature jako reszta z dzielenia:

S(x) = rem( t(x) / G(x) )
Jakość detekcji błędów

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:

mMe (niewykryte)M (wszystkie)PeP (wykryte)
≤ 1602^m - 101.000000
171131 0710.0000080.999992
183262 1430.0000110.999989
20151 048 5750.0000140.999986
→ ∞~2^(m-n)~2^m1/2¹⁶ ≈ 0.000015≈ 0.999985

Wpływ długości rejestru n (przy m → ∞):

nPeP
161.5 · 10⁻⁵0.999985
322.3 · 10⁻¹⁰0.99999999977
483.6 · 10⁻¹⁵0.9999999999999965
645.4 · 10⁻²⁰0.999999999999999999946
Kluczowy wniosek: dla rejestru 16-bit prawdopodobieństwo wykrycia błędu zawsze ≥ 99.998%, niezależnie od długości strumienia. Pojedyncze błędy bitowe są ZAWSZE wykrywane.
Wyświetlanie signature na 7-segmencie

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..Q0ZnakBity Q3..Q0Znak
0000010008
0001110019
001021010A
001131011C
010041100F
010151101H
011061110P
011171111U
Porównanie z transition counting

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 pracy i algorytmy

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

⭐ Pyt. 5 z poprzedniego kolosa
czas/program = (czas/cykl) × (cykle/instrukcja) × (instrukcje/program)

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ść
Schemat blokowy

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

Benchmark — ARM/MIPS vs x86
CechaARM/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²
Dlaczego x86 ma większy pobór mocy? Procesory CISC wewnętrznie przekodowują instrukcje na RISC micro-ops — ta dodatkowa logika dekodująca podnosi pobór mocy.
Pipeline (potok) — wizualizacja

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)
Instr. 1
FE
DE
RD
PR
WR
Instr. 2
FE
DE
RD
PR
WR
Instr. 3
FE
DE
RD
PR
WR
Instr. 4
FE
DE
RD
PR
WR

🎯 Mikrokomputer 8051

Własności 8051 (Intel oryginał)
  • 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.

Słowo stanu PSW (adres D0H)
Bit 76543210
CACF0RS1RS0V-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
Adresowanie danych — sposoby
PamięćTrybPrzykład
Wewn. wordDomyślneinc dptr
Wewn. wordNatychmiastowemov dptr, #data16
Wewn. byteDomyślneclr a
Wewn. byteRejestroweinc Rn
Wewn. byteBezpośredniemov a, byte
Wewn. byteRejestr. pośredniemov a, @Ri
Wewn. byteNatychmiastowemov a, #data
Zewn. byteRejestr. pośredniemovx a, @dptr
Wewn. bitBezpośredniesetb 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
Klasyczny 8051 vs nowoczesne implementacje (DMIPS)
ProcesorBramkiRazy szybszyDMIPSPamięć kodu
8051 (klasyk)-0.09464 KB
DQ8051 (FPGA)9 90029×0.27364 KB
DQ80251 (FPGA)13 50075×0.7068 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

2.2 DS89C430/DS89C450 (Maxim Integrated)

"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
2.3 AT89LP (Atmel/Microchip)

"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
2.4 C8051 / CIP-51 (Silicon Laboratories)

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ń
2.5 DQ8051 / DQ80251 (Digital Core Design — DCD)

Implementacje rdzenia 8051 / 80251 jako IP core w FPGA.

RdzeńBramkiSzybciej niż 8051DMIPSKodInstrukcje
DQ80519 90029×0.23764 KB8051
DQ8025113 50075×0.7068 MB8051+80251

Kluczowa cecha: oba zawierają wbudowany emulator wewnątrz-układowy (ICE).

Argument biznesowy DCD: 8-bit FPGA może wykonać te same funkcje co 32-bit przy mniejszym poborze i mniejszej powierzchni ASIC.

🦅 AVR ATmega32A

Kluczowe parametry
  • 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
Architektura AVR
  • 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
Status Register (SREG) — 8-bit
Bit 76543210
ITHSVNZC
  • 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
5 trybów adresowania pamięci danych
  1. Direct — bezpośredni adres
  2. Indirect — przez wskaźnik X, Y lub Z
  3. Indirect with Displacement — Y/Z + offset (max 63)
  4. Indirect with Pre-decrement — najpierw zmniejsz wskaźnik, potem dostęp
  5. Indirect with Post-increment — najpierw dostęp, potem zwiększ wskaźnik
Pre-/post-increment jest charakterystyczne dla AVR i ułatwia iterację po tablicach.
W 8051 trzeba ręcznie INC dptr.
6 trybów uśpienia (sleep modes)

Wejście: SE=1 w MCUCR + instrukcja SLEEP. Wybór trybu: bity SM2/SM1/SM0.

  1. Idle — CPU stop, peryferia działają
  2. ADC Noise Reduction — minimalizuje zakłócenia ADC
  3. Power-down — wszystko stop, tylko external IRQ wybudza
  4. Power-save — power-down + asynchroniczny timer
  5. Standby — power-down + oscillator running (szybki wakeup)
  6. Extended Standby — Standby + asynchroniczny timer
Rodziny AVR
RodzinaFlashPinoutCharakterystyka
tinyAVR1–16 KB8–32 pinNajmniejsze, GP
megaAVR4–256 KB28–100 pinHardware multiplier, ATmega
AVR XMEGA16–384 KB44–100 pinDMA, Event System, 16-bit
AVR32 UC316–512 KB48–144 pin32-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)
Wniosek: AVR potrzebuje 20–50% więcej pamięci programu, ale daje 5–10× większą szybkość. Generalna zasada: "binarny program RISC jest większy niż CISC".
Większość niedogodności AVR można skompensować dodatkowym oprogramowaniem.
Wspólne cechy AVR i 8051
  • 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

Łańcuch tworzenia oprogramowania

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.

Metody przekazywania parametrów do podprogramów
MetodaZaletyWady
1. RejestrySzybka i prostaOgraniczona liczba rejestrów
2. Zmienne globalneNieograniczona liczba param.Rezerwacja pamięci, złożona init
3. Tablica sterującaWiele param. przez 1 wskaźnikRezerwacja pamięci
4. StosPozwala na rekurencjęWiększy narzut na stos
5. In-line codeParam. tuż za CALLWymaga przesunięcia PC

Metody zwracania wyników — takie same minus in-line code (nie ma sensu dla return).

Segmenty dla programu w asemblerze 8051
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
Modele pamięci dla programu w języku C

Model pamięci określa sposób wykorzystania zasobów pamięci. Trade-off: szybkość vs rozmiar pamięci danych.

ModelPamięć danychAdresowanieRozmiarSzybkość
tinyinternal directbezpośrednie128 Bszybkie
smallinternal indirect@Ri256 Bśrednie
largeexternal XDATADPTR64 KBwolne

Porównanie kosztów dostępu (8051):

TrybPrzykładBajtówCykli
Bezp. wewn.mov a, 2021
Pośr. wewn.mov r0, #20; mov a, @r032
Zewn. (XDATA)mov dptr, #20; movx a, @dptr44
Moduł cstartup dla programu w języku C

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:

  1. Inicjalizacja stosu C (CSTACK) — do LCALL i tymczasowych danych
  2. Inicjalizacja stosu asemblerowego (ISTACK) — do RET
  3. Ustawienie banku rejestrów (RS1/RS0 w PSW)
  4. Skok z reset interrupt vector do init
  5. Wywołanie main() przez LCALL
  6. 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
Programowanie hybrydowe C + ASM

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

⭐ 6 podstawowych cech ARM (Pyt. 6 z kolosa)
  1. Load/Store — jedyne instrukcje komunikujące rejestry z pamięcią (LDR/STR). ALU operuje tylko na rejestrach.
  2. Wyrównanie pamięci — słowo na adresie ÷4, półsłowo ÷2, bajt dowolnie
  3. 16 rejestrów 32-bitowych (R0–R15), jednolity zestaw
  4. Stała długość instrukcji = 32 bity → ułatwia dekodowanie i pipeline (kosztem gęstości kodu)
  5. Większość instrukcji wykonuje się w 1 cyklu maszynowym
  6. Przetwarzanie potokowe — ARM7: 3-stop (FE/DE/EX), ARM9: 5-stop
Kompensacja stałej długości 32-bit

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
Rejestry ARM
RejestrNazwaFunkcja
R0–R12GPROgólnego przeznaczenia
R13SPStack Pointer — wskaźnik stosu
R14LRLink Register — adres powrotu (BL/BLX)
R15PCProgram Counter — następna instrukcja
CPSRCurrent PSR — flagi N,Z,C,V + tryb pracy
SPSRSaved PSR — kopia CPSR przy wyjątku

Łącznie 37 fizycznych rejestrów 32-bit (31 GPR + 6 statusowych), częściowo bankowanych wg trybu pracy.

Tryby pracy procesora ARM
TrybOpisWejście
UserNormalny program
SystemUprzywilejowane OSModyfikacja CPSR
FIQSzybkie przerwanie (banked R8–R14)Sygnał FIQ
IRQOgólne przerwanieSygnał IRQ
SVCTryb nadzorcy OSInstrukcja SWI
ABTBłąd pamięci (Abort)Błąd prefetch/data
UNDNiezdefiniowana instrukcjaBrak instrukcji

Wejście w wyjątek — 5 kroków:

  1. Zapisz PC → LR (R14) — adres powrotu
  2. Zapisz CPSR → SPSR nowego trybu
  3. Ustaw bity trybu w CPSR odpowiadające wyjątkowi
  4. Wyłącz przerwania niższego priorytetu
  5. Załaduj wektor wyjątku do PC

Wektory wyjątków (ARM7TDMI):

PriorytetWyjątekAdres wektora
1 (najwyższy)Reset0x00000000
2Data Abort0x00000010
3FIQ0x0000001C
4IRQ0x00000018
5Prefetch Abort0x0000000C
6 (najniższy)Undefined / SWI0x00000004 / 0x00000008
Instrukcje ARM (mnemoniki)

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
Wersje architektury ARMv4 → v8
WersjaKluczowe nowości
ARMv4Baseline: 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
⭐ Thumb-2 — kluczowe ulepszenia (Pyt. 7 z kolosa)
  1. 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
  2. Instrukcja IT (If-Then) — 16-bit: warunkowe wykonanie bloku 1–4 instrukcji Thumb
  3. 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

ARMThumbThumb-2
Szerokość instrukcji32-bit16-bit16+32 mixed
Gęstość koduniskawysokaśrednio-wysoka
Wydajnośćwysokaniższablisko ARM
Wykonanie warunkoweprawie wszystkotylko skokiblok IT
⭐ Rodziny ARM Cortex (Pyt. 8 z kolosa)
RodzinaProfilZastosowanie
Cortex-MM (Microcontroller)Najbardziej energooszczędne MCU (IoT, sensory). Thumb-only.
Cortex-RR (Real-time)Real-time, safety-critical (automotive, storage). ARM + Thumb.
Cortex-AA (Application OS)Linux/Windows. ARM + Thumb + Thumb-2. 32 i 64-bit.
NeoverseSkalowalna infrastruktura (chmura → edge)
SecurCoreBezpieczeństwo fizyczne (smart cards, payment)
EthosML inference (neural processing)

Cortex-M — sub-warianty:

ModelArchitekturaCharakterystyka
M0 / M0+ARMv6-MNajmniejszy gate count, ultra-low power, IoT
M1ARMv6-MDla FPGA
M3ARMv7-MLow latency IRQ, automotive/industrial
M4 (F)ARMv7E-MDSP + opcjonalne FPU
M7ARMv7E-MNajwyższa wydajność, SIMD DSP
M23 / M33ARMv8-M+ TrustZone (M33 też + DSP)
M55ARMv8.1-MAI/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

Narzędzia
Co to jest Load/Store w ARM?
Kliknij
Odpowiedź
Tylko instrukcje LDR i STR mogą komunikować się między rejestrami a pamięcią. ALU operuje wyłącznie na rejestrach.
Narzędzia
Wymień 6 sygnałów JTAG
Kliknij
Odpowiedź
TMS (mode), TDI (data in), TDO (data out), TCK (clock), RTCK (return clock), nSRST (system reset), nTRST (test reset). EmbeddedICE: DBGRQ/DBGACK.
Narzędzia
Co oznacza PSEN w 8051?
Kliknij
Odpowiedź
Program Store Enable — sygnał odczytu z zewn. pamięci programu (ROM). Aktywny gdy CPU pobiera instrukcję z ROM.
Sygnatury
Wielomian charakterystyczny analizy sygnatur (16-bit)
Kliknij
Odpowiedź
G(x) = x¹⁶ + x¹² + x⁹ + x⁷ + 1. Dualny: Ψ(x) = x¹⁶ + x⁹ + x⁷ + x⁴ + 1. Signature S(x) = rem(t(x)/G(x)).
Sygnatury
Pe dla n=16, m→∞?
Kliknij
Odpowiedź
Pe ≈ 1/2¹⁶ ≈ 0,000015. P ≈ 99,998%. Dla m ≤ n: Pe = 0 (wszystkie wykrywane). Pojedyncze błędy: zawsze wykrywane.
Sygnatury
Dlaczego A,C,F,H,P,U a nie A-F na wyświetlaczu?
Kliknij
Odpowiedź
Lepsza czytelność na 7-segmentowym wyświetlaczu LED. B/D/E mogą być mylone z 8/0/6.
CISC vs RISC
Wzór czasu wykonania programu
Kliknij
Odpowiedź
t/prog = (t/cykl) × (cykle/instr) × (instr/prog). RISC redukuje środkowy, CISC redukuje prawy.
CISC vs RISC
Pobór mocy ARM vs x86
Kliknij
Odpowiedź
ARM/MIPS: 40-50% mniej mocy/MHz, 3-4× mniejsza pow. niż x86. x86: +4-8% wyd./MHz. Dlaczego x86 więcej mocy: wewn. translacja CISC→RISC micro-ops.
8051
Architektura 8051
Kliknij
Odpowiedź
8-bit CISC, Harvard. 64KB programu + 64KB ext. danych. 4 banki × 8 rej. 2 poziomy IRQ priority. ALU 8-bit + LU 1-bit.
8051
Bity RS1/RS0 w PSW
Kliknij
Odpowiedź
Wybór banku rejestrów: 00→bank 0, 01→bank 1, 10→bank 2, 11→bank 3. Każdy bank = R0–R7. PSW @ adres D0H.
8051
Co wyróżnia DS89C450 od klasyka?
Kliknij
Odpowiedź
12× szybszy przy tej samej f. Cykl masz. = 1 takt (zamiast 12). 1 MIPS/MHz, 33 MIPS @ 33 MHz. Drop-in dla 8xC51.
8051
Czym jest CIP-51?
Kliknij
Odpowiedź
Rdzeń 8051 firmy Silicon Labs z potokiem Fetch/Decode/Execute. Mixed-signal MCU. Zachowuje zgodność kodu z Intelem. Op. logiczne na rejestrach (nie tylko ALU).
8051
DQ8051/DQ80251 firmy DCD?
Kliknij
Odpowiedź
IP core w FPGA. DQ8051: 9.9k bramek, 29× szybszy. DQ80251: 13.5k bramek, 75× szybszy. Mają wbudowany ICE.
AVR
Ile rejestrów ma ATmega32A?
Kliknij
Odpowiedź
32 × 8-bit GP (R0-R31). R26-R31 to pary X (R27:R26), Y (R29:R28), Z (R31:R30) — 16-bit wskaźniki adresowe.
AVR
Wymień 5 trybów adresowania AVR
Kliknij
Odpowiedź
1. Direct, 2. Indirect (X/Y/Z), 3. Indirect+Displacement (Y/Z+offset, max 63), 4. Pre-decrement, 5. Post-increment.
AVR
3 zalety AVR vs 8051
Kliknij
Odpowiedź
1. Cykl = 1 takt (8051: 12), 2. EEPROM (8051 nie ma), 3. Wewn. RC + POR + Watchdog. + Obie zmiany IRQ.
Programowanie
5 metod przekazywania parametrów
Kliknij
Odpowiedź
1. Rejestry, 2. Globalne, 3. Tablica sterująca, 4. Stos, 5. In-line code. Dla return: 1-4 (in-line nie ma sensu).
Programowanie
Modele pamięci C dla 8051
Kliknij
Odpowiedź
tiny: internal direct (128B) — szybko. small: internal indirect (256B) — średnio. large: external XDATA (64KB) — wolno.
Programowanie
Co robi cstartup?
Kliknij
Odpowiedź
Init przed main(): stos C (CSTACK), stos asm (ISTACK), bank rej., skok z reset vector, LCALL main, LJMP ?C_EXIT.
ARM
6 cech ARM (kluczowe!)
Kliknij
Odpowiedź
1. Load/store, 2. Wyrównanie ÷4/÷2, 3. 16 rej. × 32-bit, 4. Stała dł. instr. = 32-bit, 5. Większość = 1 cykl, 6. Pipeline (ARM7: 3-stop, ARM9: 5-stop).
ARM
3 ulepszenia Thumb-2 vs Thumb
Kliknij
Odpowiedź
1. Instr. 32-bit (DSP, wyjątki, koproc.). 2. IT (If-Then) blok 1-4 instr. 3. CBZ/CBNZ. Wynik: 31% mniej RAM niż ARM, 38% szybciej niż Thumb.
ARM
6 rodzin ARM Cortex
Kliknij
Odpowiedź
Cortex-M (MCU/IoT), Cortex-R (real-time), Cortex-A (Linux/Android). Plus: Neoverse (chmura), SecurCore (bezpiecz.), Ethos (ML).
ARM
5 kroków wejścia w wyjątek ARM
Kliknij
Odpowiedź
1. PC→LR. 2. CPSR→SPSR. 3. Bity trybu w CPSR. 4. Wyłącz niższe IRQ. 5. PC ← wektor wyjątku.
ARM
Co dodała ARMv4T?
Kliknij
Odpowiedź
Thumb (16-bit). Kod ~65% rozmiaru ARM, 160% wydajności na 16-bit pamięci. T = Thumb.