Mikroprocesorski sistemi/Avgust 2022
Avgustovski ispit 2022. godine održan je 25. avgusta i na njemu je bila dostupna sva potrebna dokumentacija i prezentacije sa predavanja. Postavka roka nije dostupna sa stranice predmeta. Nije mnogo poznato o ovom roku, osim teorijskih pitanja navedenih ispod.
Teorija
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.
5. zadatak
Ukoliko neki od brojača tajmera kod mikrokontrolera STM32F103R6 broji naniže i vrednost Repetion Counter[sic] je 2, kada se dešava UEV (Update Event) tog tajmera?
- Svaki drugi put kada se desi Counter Overflow Event
- Svaki treći put kada se desi Counter Overflow Event
- Svaki drugi put kada se desi Counter Underflow Event
- Svaki treći put kada se desi Counter Underflow Event