Mikroprocesorski sistemi/Avgust 2022

Izvor: SI Wiki
Pređi na navigaciju Pređi na pretragu

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č?

  1. Reset
  2. Usage fault
  3. Bus fault
  4. NMI
  5. 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?

  1. Svaki drugi put kada se desi Counter Overflow Event
  2. Svaki treći put kada se desi Counter Overflow Event
  3. Svaki drugi put kada se desi Counter Underflow Event
  4. Svaki treći put kada se desi Counter Underflow Event