Микропроцесорски системи/Август 2022

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу

Августовски испит 2022. године одржан је 25. августа и на њему је била доступна сва потребна документација и презентације са предавања. Поставка рока није доступна са странице предмета. Није много познато о овом року, осим теоријских питања наведених испод.

Теорија

1. задатак

У наставку је дат део садржаја Intel HEX датотеке направљене за STM32F103R6 микроконтролер. На којој адреси се налази машинска инструкција коју микропроцесор Cortex-M3, унутар посматраног STM32F103R6 микроконтролера, прву извршава након ресета? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.

:020000040800F2
:1000000000280020C70A0008AF010008B1010008B0
:10001000B3010008B5010008B701000800000000A6
:10002000000000000000000000000000B90100080E
:10003000BB01000800000000BD010008BF0100086E
:10004000BD090008BD090008BD090008BD09000878
:10005000BD090008BD090008BD090008BD09000868
:10006000BD090008BD090008BD090008BD09000858

Одговор: 0x08000AC7

Објашњење: Фајл треба провући кроз истицање синтаксе како би било јасније о чему се ради. Свака линија почиње са две тачке и затим бројем бајтова података у тој линији, који за потребе задатка нису релевантни. Затим долази адреса на којој се налази поменути садржај па тип записа. У првој линији видимо да је тип записа 04, односно проширење адресе, па адреса тог записа није релевантна. Затим следе два бајта податка, 0800, који кажу да се наредни делови фајла налазе на адреси која почиње са 0x0800, односно налази се у флеш меморији контролера. У другој линији видимо запис типа 00, односно податак, са адресом 0000, односно 0x08000000 кад се дода горепоменуто проширење адресе. То је адреса на којој се налази иницијална вредност SP, и делић меморије 00280020 нам говори његову вредност. Пошто је садржај меморије у little-endian формату, то значи да је ова вредност 0x20002800. Наредна четири бајта, зато, представљају адресу прекидне рутине за ресет, односно иницијалну вредност PC након ресетовања микроконтролера. У меморији пише C70A0008 па је та адреса 0x08000AC7, и то је одговор на ово питање.

2. задатак

У наставку је описан један од изузетака Cortex-M3 процесора:

"Изузетак се јавља услед грешке директно повезане са извршавањем инструкције (недефинсана инструкција, недозвољени непоравнат приступ итд)."

О којем изузетку је реч?

  1. Reset
  2. Usage fault
  3. Bus fault
  4. NMI
  5. Hard fault

3. задатак

У наставку је приказан садржај две датотеке: (1) линкерска скрипта и (2) изворни асемблерски код програма.

Посматра се извршавање на STM32F103R6 микроконтролеру датог програма који је резултат линковања помоћу приказане линкерске скрипте.

Која вредност се налази у регистру R1 у тренутку када ток контроле стигне до адресе указане лабелом target? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.

Линкерска скрипта:

MEMORY
{
    FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
    SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
    .vector_table : { *(.vector_table) } > FLASH
    .text : { *(.text*) } > FLASH
}

Изворни асемблерски код програма:

.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

Одговор: 0x20001200

Објашњење: Иницијална вредност SP добија се из првог улаза вектор табеле. Пошто из линкерске скрипте видимо да је секција .vector_table мапирана на почетак флеш меморије, то значи да се у њој чувају подаци вектор табеле. Пошто је први податак у овој вектор табели 0x20001200, а у ресет рутини се R1 поставља на SP, то је и одговор на ово питање.

4. задатак

У наставку је приказан садржај две датотеке: (1) линкерска скрипта и (2) изворни асемблерски код програма. Посматра се извршавање датог програма који је резултат линковања помоћу приказане линкерске скрипте.

Која вредност се налази у регистру R0 у тренутку када ток контроле први пут стигне до адресе указане лабелом leave_default_handler? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.

Линкерска скрипта:

MEMORY
{
    FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
    SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
    .vector_table : { *(.vector_table) } > FLASH
    .text : { *(.text*) } > FLASH
}

Изворни асемблерски код програма:

.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

Одговор: 0x0000000E

Објашњење: Програм изнад почиње тако што у ресет рутини напише 0x10000000 у SCB_ICSR (односно меморијску адресу 0xE000ED04 која том регистру одговара). Ово значи да је на месту PENDSVSET бита уписана вредност 1, и да се активира прекид типа PendSV. У рутини за PendSV (као и многе друге изузетке) се у регистар R0 уписује вредност IPSR регистра, који у себи садржи само број прекидне рутине која се тренутно извршава. Пошто је број прекидне рутине за PendSV 14, одговор је 14 у хексадецималном бројном систему.

5. задатак

Уколико неки од бројача тајмера код микроконтролера STM32F103R6 броји наниже и вредност Repetion Counter[sic] је 2, када се дешава UEV (Update Event) тог тајмера?

  1. Сваки други пут када се деси Counter Overflow Event
  2. Сваки трећи пут када се деси Counter Overflow Event
  3. Сваки други пут када се деси Counter Underflow Event
  4. Сваки трећи пут када се деси Counter Underflow Event