Микропроцесорски системи/Август 2022
Августовски испит 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 процесора:
"Изузетак се јавља услед грешке директно повезане са извршавањем инструкције (недефинсана инструкција, недозвољени непоравнат приступ итд)."
О којем изузетку је реч?
- Reset
- Usage fault
- Bus fault
- NMI
- 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) тог тајмера?
- Сваки други пут када се деси Counter Overflow Event
- Сваки трећи пут када се деси Counter Overflow Event
- Сваки други пут када се деси Counter Underflow Event
- Сваки трећи пут када се деси Counter Underflow Event