Mikroprocesorski sistemi/Teorija
Pitalice dolaze na teorijskim delovima obe predispitne obaveze i svih ispita na predmetu. Ispod su skupljene neke od pitalica koje su dolazile ili mogu doći na teorijskim delovima.
K1
1. zadatak
U nastavku je dat deo sadržaja Intel HEX datoteke napravljene za STM32F103R6 mikrokontroler. Na kojoj adresi se nalazi mašinska instrukcija koju mikroprocesor Cortex-M3, unutar posmatranog STM32F103R6 mikrokontrolera, prvu izvršava nakon reseta? Odgovor uneti prema formatu neoznačenih heksadecimalnih literala u C programskom jeziku širine 32 bita.
:020000040800F2 :1000000000280020C70A0008AF010008B1010008B0 :10001000B3010008B5010008B701000800000000A6 :10002000000000000000000000000000B90100080E :10003000BB01000800000000BD010008BF0100086E :10004000BD090008BD090008BD090008BD09000878 :10005000BD090008BD090008BD090008BD09000868 :10006000BD090008BD090008BD090008BD09000858
Odgovor: 0x08000AC7
Objašnjenje: Fajl treba provući kroz isticanje sintakse kako bi bilo jasnije o čemu se radi. Svaka linija počinje sa dve tačke i zatim brojem bajtova podataka u toj liniji, koji za potrebe zadatka nisu relevantni. Zatim dolazi adresa na kojoj se nalazi pomenuti sadržaj pa tip zapisa. U prvoj liniji vidimo da je tip zapisa 04, odnosno proširenje adrese, pa adresa tog zapisa nije relevantna. Zatim slede dva bajta podatka, 0800, koji kažu da se naredni delovi fajla nalaze na adresi koja počinje sa 0x0800, odnosno nalazi se u fleš memoriji kontrolera. U drugoj liniji vidimo zapis tipa 00, odnosno podatak, sa adresom 0000, odnosno 0x08000000 kad se doda gorepomenuto proširenje adrese. To je adresa na kojoj se nalazi inicijalna vrednost SP, i delić memorije 00280020 nam govori njegovu vrednost. Pošto je sadržaj memorije u little-endian formatu, to znači da je ova vrednost 0x20002800. Naredna četiri bajta, zato, predstavljaju adresu prekidne rutine za reset, odnosno inicijalnu vrednost PC nakon resetovanja mikrokontrolera. U memoriji piše C70A0008 pa je ta adresa 0x08000AC7, i to je odgovor na ovo pitanje.
2. zadatak
U nastavku je opisan jedan od izuzetaka Cortex-M3 procesora:
"Izuzetak se javlja usled greške direktno povezane sa izvršavanjem instrukcije (nedefinsana instrukcija, nedozvoljeni neporavnat pristup itd)."
O kojem izuzetku je reč?
- Reset
- Usage fault
- Bus fault
- NMI
- Hard fault
3. zadatak
U nastavku je prikazan sadržaj dve datoteke: (1) linkerska skripta i (2) izvorni asemblerski kod programa.
Posmatra se izvršavanje na STM32F103R6 mikrokontroleru datog programa koji je rezultat linkovanja pomoću prikazane linkerske skripte.
Koja vrednost se nalazi u registru R1 u trenutku kada tok kontrole stigne do adrese ukazane labelom target? Odgovor uneti prema formatu neoznačenih heksadecimalnih literala u C programskom jeziku širine 32 bita.
Linkerska skripta:
MEMORY
{
FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
.vector_table : { *(.vector_table) } > FLASH
.text : { *(.text*) } > FLASH
}
Izvorni asemblerski kod programa:
.cpu cortex-m3
.fpu softvfp
.syntax unified
.thumb
.section .vector_table, "a"
.word 0x20001200
.word reset_handler
.word 0x20001300
.word 0x20001400
.word 0x20001500
.section .text.reset_handler
.type reset_handler, %function
reset_handler:
mov r1, sp
nop
nop
nop
target:
.end
Odgovor: 0x20001200
Objašnjenje: Inicijalna vrednost SP dobija se iz prvog ulaza vektor tabele. Pošto iz linkerske skripte vidimo da je sekcija .vector_table mapirana na početak fleš memorije, to znači da se u njoj čuvaju podaci vektor tabele. Pošto je prvi podatak u ovoj vektor tabeli 0x20001200, a u reset rutini se R1 postavlja na SP, to je i odgovor na ovo pitanje.
4. zadatak
U nastavku je prikazan sadržaj dve datoteke: (1) linkerska skripta i (2) izvorni asemblerski kod programa. Posmatra se izvršavanje datog programa koji je rezultat linkovanja pomoću prikazane linkerske skripte.
Koja vrednost se nalazi u registru R0 u trenutku kada tok kontrole prvi put stigne do adrese ukazane labelom leave_default_handler? Odgovor uneti prema formatu neoznačenih heksadecimalnih literala u C programskom jeziku širine 32 bita.
Linkerska skripta:
MEMORY
{
FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
.vector_table : { *(.vector_table) } > FLASH
.text : { *(.text*) } > FLASH
}
Izvorni asemblerski kod programa:
.cpu cortex-m3
.fpu softvfp
.syntax unified
.thumb
.section .vector_table, "a"
.word 0x20000064
.word reset_handler
.rept 15
.word default_handler
.endr
.equ SCB_ICSR, 0xE000ED04
.section .text.reset_handler
.type reset_handler, %function
reset_handler:
ldr r0, =SCB_ICSR
ldr r1, =0x10000000
str r1, [r0]
nop
infinite_loop:
b infinite_loop
.section .text.default_handler
.type default_handler, %function
default_handler:
mrs r0, ipsr
leave_default_handler:
bx lr
.end
Odgovor: 0x0000000E
Objašnjenje: Program iznad počinje tako što u reset rutini napiše 0x10000000 u SCB_ICSR (odnosno memorijsku adresu 0xE000ED04 koja tom registru odgovara). Ovo znači da je na mestu PENDSVSET bita upisana vrednost 1, i da se aktivira prekid tipa PendSV. U rutini za PendSV (kao i mnoge druge izuzetke) se u registar R0 upisuje vrednost IPSR registra, koji u sebi sadrži samo broj prekidne rutine koja se trenutno izvršava. Pošto je broj prekidne rutine za PendSV 14, odgovor je 14 u heksadecimalnom brojnom sistemu.
Varijanta
Isti kao zadatak iznad, ali reset_handler izgleda ovako:
reset_handler:
nop
nop
svc 0
nop
infinite_loop:
b infinite_loop
Odgovor: 0x0000000B
Objašnjenje: Slično kao gore, samo što se ovde okine izuzetak tipa SVCall pozivom instrukcije svc, i broj tog izuzetka je 11.