Микропроцесорски системи/Теорија — разлика између измена

Извор: SI Wiki
Пређи на навигацију Пређи на претрагу
(Započeto prepisivanje pitalica iz PDF koji je `<@445839468503498752>` poslao (ne znam odakle su i nisam radio primer ispita na Moodle još))
 
м (Pomerena napomena van rešenja)
 
(Није приказано 7 међуизмена 2 корисника)
Ред 1: Ред 1:
{{tocright}}
{{tocright}}
'''Питалице''' долазе на теоријским деловима обе предиспитне обавезе и свих испита на предмету. Испод су скупљене неке од питалица које су долазиле или могу доћи на теоријским деловима.
'''Питалице''' долазе на теоријским деловима обе предиспитне обавезе и свих испита на предмету. Типови питања су јако слични између рокова, па су зато испод набројана типична питања која се могу појавити на теоријском делу испита, дати примери питања и набројани корисни ресурси одакле се може прочитати више о њима. Уколико објашњења дата овде нису довољно јасна, погледати примере задатака ради разјашњења.


== К1 ==
== Први блок ==
=== 1. задатак ===
=== Улазак и излазак из прекидне рутине ===
У наставку је дат део садржаја Intel HEX датотеке направљене за ''STM32F103R6'' микроконтролер. На којој адреси се налази машинска инструкција коју микропроцесор ''Cortex-M3'', унутар посматраног STM32F103R6 микроконтролера, прву извршава након ресета? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.
Код овог типа питања битно је разумети како функционише неколико механизама у ''Cortex-M3'' микропроцесору. Текст испод парафразиран је из ''Cortex-M3 Programming Manual'' са страница 37 и 38:
<pre>
* '''Stacking:''' операција чувања одређених регистара на стеку приликом уласка у прекидну рутину. На стеку се чувају следећи регистри (то се зове ''stack frame'') у редоследу који је дат:
:020000040800F2
** ''R0'', ''R1'', ''R2'', ''R3'' и ''R12''
:1000000000280020C70A0008AF010008B1010008B0
** Повратна адреса прекидне рутине (односно ''PC'' регистар)
:10001000B3010008B5010008B701000800000000A6
** Програмски статусни регистар (''PSR'')
:10002000000000000000000000000000B90100080E
** ''Link register'' (''LR'')
:10003000BB01000800000000BD010008BF0100086E
*: Након ''stacking'', ''SP'' показује на најнижу адресу у ''stack frame'' (односно на ''R0''). У ''CCR'' регистру бит ''STKALIGN'' може бити постављен на 1, у ком случају се дешава поравнање стека на дуплу реч.
:10004000BD090008BD090008BD090008BD09000878
*: За овај механизам углавном буде дат програм на асемблеру који са стека учита одређени податак, па се мора одредити која је вредност тог податка.
:10005000BD090008BD090008BD090008BD09000868
* '''Late-arriving:''' Паралелно са ''stacking'' се дохвата адреса руковаоца у IVT, па ако се до учитавања прве инструкције у прекидној рутини појави изузетак вишег групног приоритета прелази се на његово извршавање.
:10006000BD090008BD090008BD090008BD09000858
* '''Tail-chaining:''' ако након извршавања тренутне прекидне рутине постоји следећи прекид који испуњава услове извршавања, прелази се на његово извршавање без уклањања вредности из ''stack frame''.
</pre>
*: За овај механизам питања углавном буду бројање колико пута се десио ''tail-chaining'' под одређеним условима.
'''Одговор:''' <span class="spoiler" data-solution="text">0x08000AC7</span>


'''Објашњење:''' <span class="spoiler" data-solution="explanation">Фајл треба провући кроз истицање синтаксе како би било јасније о чему се ради. Свака линија почиње са две тачке и затим бројем бајтова података у тој линији, који за потребе задатка нису релевантни. Затим долази адреса на којој се налази поменути садржај па тип записа. У првој линији видимо да је тип записа <code>04</code>, односно проширење адресе, па адреса тог записа није релевантна. Затим следе два бајта податка, <code>0800</code>, који кажу да се наредни делови фајла налазе на адреси која почиње са <code>0x0800</code>, односно налази се у флеш меморији контролера. У другој линији видимо запис типа <code>00</code>, односно податак, са адресом <code>0000</code>, односно <code>0x08000000</code> кад се дода горепоменуто проширење адресе. То је адреса на којој се налази иницијална вредност SP, и делић меморије <code>00280020</code> нам говори његову вредност. Пошто је садржај меморије у ''little-endian'' формату, то значи да је ова вредност <code>0x20002800</code>. Наредна четири бајта, зато, представљају адресу прекидне рутине за ресет, односно иницијалну вредност PC након ресетовања микроконтролера. У меморији пише <code>C70A0008</code> па је та адреса <code>0x08000AC7</code>, и то је одговор на ово питање.</span>
'''Примери питања:'''
* ''Stacking:'' [[Микропроцесорски системи/К1 2022#3. задатак|3. задатак, К1 2022]]
* ''Tail-chaining:'' [[Микропроцесорски системи/К1 2022#2. задатак|2. задатак, К1 2022]]


=== 2. задатак ===
=== Почетна инструкција програма ===
У наставку је описан један од изузетака ''Cortex-M3'' процесора:
Адреса адресе прве инструкције програма јесте 0x00000004, тако да је адреса прве инструкције програма штагод да пише у меморији на адреси 0x00000004. Ова једноставна питалица може често да се појави на различитим роковима и одговор на њу може се наћи на страни 15 од ''Cortex-M3 Programming Manual''.


"Изузетак се јавља услед грешке директно повезане са извршавањем инструкције (недефинсана инструкција, недозвољени непоравнат приступ итд)."
'''Примери питања:'''
* [[Микропроцесорски системи/Јул 2022#1. задатак|1. задатак, јул 2022]], 1. задатак, јануар 2023


О којем изузетку је реч?
=== Условно извршавање инструкција ===
<div class="abc-list" data-solution="single">
Овај механизам објашњен је на страни 56 у ''Cortex-M3 Programming Manual'', у одељку 3.3.7 ''Conditional execution''. Питања из ове области обично садрже барем једну <code>it</code> инструкцију и неке комбинације <code>add</code>, <code>sub</code>, <code>cmp</code> и <code>mov</code> инструкција са суфиксом <code>s</code> (ажурира програмски статусни регистар!) или без њега (не ажурира програмски статусни регистар!), а на крају се тражи вредност у неком од коришћених регистара. Треба нагласити да <code>cmp</code> инструкција увек ажурира програмски статусни регистар.
# Reset
# <span class="solution">Usage fault</span>
# Bus fault
# NMI
# Hard fault
</div>


=== 3. задатак ===
'''Примери питања:'''
У наставку је приказан садржај две датотеке: (1) линкерска скрипта и (2) изворни асемблерски код програма.
* [[Микропроцесорски системи/Пробни тест 2022#Задатак 1|1. задатак, пробни тест 2022]]
* [[Микропроцесорски системи/Јул 2022#2. задатак|2. задатак, јул 2022]], 2. задатак, јануар 2023
* (''извршавање инструкција генерално'') [[Микропроцесорски системи/К1 2022#1. задатак|1. задатак, К1 2022]]
* [[#Питање 1|Некатегорисано питање 1]]
* [[#Питање 2|Некатегорисано питање 2]]
* Примери из документације


Посматра се извршавање на ''STM32F103R6'' микроконтролеру датог програма који је резултат линковања помоћу приказане линкерске скрипте.
=== ''Bit-band alias'' ===
У овом типу задатка тражи се да се за неки бит у SRAM одреди ''bit-band alias'' адреса. На страни 27 ''Cortex-M3 Programming Manual'' објашњен је овај механизам и наведене следеће формуле:
* <code>bit_word_offset = (byte_offset x 32) + (bit_number x 4)</code>
* <code>bit_word_addr = bit_band_base + bit_word_offset</code>
где је:
* <code>byte_offset</code> померај неког бајта од почетка SRAM (SRAM почиње на 0x20000000),
* <code>bit_number</code> број бита који се тражи (дат у задатку)
* <code>bit_band_base</code> почетак ''bit-band alias'' региона (почиње на 0x22000000)
'''Примери питања:'''
* [[Микропроцесорски системи/Пробни тест 2022#Задатак 2|2. задатак, пробни тест 2022]]


Која вредност се налази у регистру R1 у тренутку када ток контроле стигне до адресе указане лабелом <code>target</code>? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.
=== Режими рада ===
Иако нема примера овог питања, може да дође питање у ком режиму се налази процесор приликом извршавања прекидне рутине (''handler mode''), а у ком приликом главног програма (''thread mode''). Овај податак се може наћи на страни 13 у ''Cortex-M3 Programming Manual'', у одељку 2.1.1 ''Processor mode and privilege levels for software execution''.


Линкерска скрипта:
=== ''Intel HEX'' формат ===
<pre>
У оваквом задатку потребно је растумачити шта пише у једној ''Intel HEX'' датотеци за коју је дат садржај и истакнута синтакса. Опис овог формата може са наћи на [[wikipedia:Intel HEX|Википедији]], али такође и на [https://developer.arm.com/documentation/ka003292/latest ''ARM''-овом] и [https://www.intel.com/content/www/us/en/support/programmable/articles/000076770.html ''Intel''-овом] сајту.
MEMORY
 
{
'''Примери питања:'''
    FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
* [[Микропроцесорски системи/Август 2022#1. задатак|1. задатак, август 2022]]
    SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
* [[Микропроцесорски системи/Фебруар 2023#1. задатак|1. задатак, фебруар 2023]]
}
 
SECTIONS
=== Иницијална вредност ''SP'' ===
{
Регистар ''SP'' своју иницијалну вредност добија са адресе 0x00000000. У овом типу задатка буде један асемблерски програм у коме се ради формирање IVT (чији је нулти улаз заправо вредност ''SP''), а затим се у програму негде та вредност користи, и резултат извршавања зависи од те вредности. Главна идеја је прочитати вредност ''SP'' са прве локације у вектор табели из асемблерског програма.
    .vector_table : { *(.vector_table) } > FLASH
 
    .text : { *(.text*) } > FLASH
'''Примери питања:'''
}
* [[Микропроцесорски системи/Август 2022#3. задатак|3. задатак, август 2022]], 4. задатак, К1 2022, 3. задатак, фебруар 2023
</pre>
 
Изворни асемблерски код програма:
=== Тренутна прекидна рутина ===
<syntaxhighlight lang="asm">
Још један чест задатак јесте асемблерски програм у којем се изазове одређени прекид на неки начин, а затим се у прекидној рутини у одређени регистар упише вредност IPSR и пита која је вредност уписана. Овај тип задатка није превише шаблонски у делу где се изазива прекид, али када се сазна који је прекид изазван његов број се лако може сазнати из ''Cortex-M3 Programming Manual'', страна 32, 2.3.2 ''Exception types''.
.cpu cortex-m3
 
.fpu softvfp
'''Примери питања:'''
.syntax unified
* [[Микропроцесорски системи/Август 2022#4. задатак|4. задатак, август 2022]]
.thumb
* [[Микропроцесорски системи/Фебруар 2023#4. задатак|4. задатак, фебруар 2023]]
 
=== Одређивање изузетка на основу описа ===
У овом типу задатка дат је опис једног типа изузетка у ''Cortex-M3'' процесору, практично преведен из ''Cortex-M3 Programming Manual'', са стране 32, 2.3.2 ''Exception types'', и дато је више назива изузетака за бирање.
 
'''Примери питања:'''
* [[Микропроцесорски системи/Август 2022#2. задатак|2. задатак, август 2022]]
* [[Микропроцесорски системи/Фебруар 2023#2. задатак|2. задатак, фебруар 2023]]
 
== Други блок ==
=== Пинови за активацију тајмера ===
У овом типу питања траже се пинови чија одговарајућа промена окида односно стартује бројање на одређеном тајмеру микроконтролера. На фигурама са страна 294 и 367 из ''STM32F103 Reference Manual'' можемо видети да у сигналу TRGI учествују <code>TIMx_ETR</code>, <code>TIMx_CH1</code> (преко TI1FP1) и <code>TIMx_CH2</code> (преко TI2FP2), а на странама 178 и 179 можемо пронаћи одговарајућа мапирања пинова за те канале микроконтролера. У теорији, у том сигналу би могао да учествује и сигнал <code>TIMx_CH3</code> (преко XOR кола које улази у TI1) али ово никада није означено као тачан одговор.
 
'''Примери питања:'''
* [[Микропроцесорски системи/Пробни тест 2022#Задатак 3|3. задатак, пробни тест 2022]] (''TIM2'')
* [[Микропроцесорски системи/К2 2022#3. задатак|3. задатак, К2 2022]], 4. задатак, јул 2022 (''TIM1''), 4. задатак, јануар 2023
 
=== Фреквенција HCLK ===
Постоји неколико варијанти овог питања где је дата фреквенција интерних или екстерних осцилатора а пита се за максималну радну фреквенцију (HCLK). Одговор на ово питање се увек може наћи на фигури 8 са стране 93 од ''STM32F103 Reference Manual'', где ти сигнали такта обично пролазе кроз PLL и евентуално се одсецају на одговарајуће максимуме као што је прописано шемом. Обратити пажњу и на текст испод фигуре!
 
'''Примери питања:'''
* [[Микропроцесорски системи/Пробни тест 2022#Задатак 4|4. задатак, пробни тест 2022]]
* [[Микропроцесорски системи/Јул 2022#3. задатак|3. задатак, јул 2022]], 3. задатак, јануар 2023
* [[#Питање 3|Некатегорисано питање 3]]
 
=== Број догађаја пред UEV ===
Овај тип питања пита колико пута се којих догађаја мора десити како би се десио ''Update Event'' (UEV) неког тајмера. Одговор је суштински да треба да се деси за један више пута него што је вредност ''repetition counter'', при бројању навише се дешава ''counter overflow'', док се при бројању наниже дешава ''counter underflow''.
 
'''Примери питања:'''
* [[Микропроцесорски системи/Август 2022#5. задатак|5. задатак, август 2022]]
* [[Микропроцесорски системи/Фебруар 2023#5. задатак|5. задатак, фебруар 2022]]
 
=== Начин бројања тајмера ===
Иако нема забележеног тачног текста овог питања, може да дође питање да се означи на који начин може да броји тајмер, и на то је потребно одговорити:
# навише,
# наниже, и
# комбиновано.


.section .vector_table, "a"
=== Активирање EXTI преко RTSR ===
.word 0x20001200
Питање пита за вредност EXTI_RTSR регистра која мора бити уписана како би се омогућили прекиди на датим пиновима. На страни 212. од ''STM32F103 Reference Manual'' можемо видети да за сваку ''EXTI'' линију постоји по један бит у ''RTSR'' регистру, док на страни 210. можемо видети да пиновима са индексом 0 одговара линија 0, пиновима са индексом 1 одговара линија 1, и тако даље. На основу тога, поставимо одговарајуће битове броја на основу датих пинова, и то је тражени одговор.
.word reset_handler
.word 0x20001300
.word 0x20001400
.word 0x20001500


.section .text.reset_handler
'''Примери питања:'''
.type reset_handler, %function
* [[Микропроцесорски системи/К2 2022#1. задатак|1. задатак, К2 2022]]
reset_handler:
    mov r1, sp
    nop
    nop
    nop
target:
.end
</syntaxhighlight>
'''Одговор:''' <span class="spoiler" data-solution="text">0x20001200</span>


'''Објашњење:''' <span class="spoiler" data-solution="explanation">Иницијална вредност SP добија се из првог улаза вектор табеле. Пошто из линкерске скрипте видимо да је секција <code>.vector_table</code> мапирана на почетак флеш меморије, то значи да се у њој чувају подаци вектор табеле. Пошто је први податак у овој вектор табели <code>0x20001200</code>, а у ресет рутини се R1 поставља на SP, то је и одговор на ово питање.</span>
=== ''Auto-reload'' регистар ===
Често умеју да дођу питања где су фигуре 59, 60, 70 или 71 исечене на неком делу и студенти се питају за одговарајуће вредности након исеченог дела. За овакво питање је потребно пронаћи одговарајућу фигуру из документације и видети на који начин измена ''Auto-reload preload'' регистра утиче на ''shadow'' регистар.


=== 4. задатак ===
'''Примери питања:'''
У наставку је приказан садржај две датотеке: (1) линкерска скрипта и (2) изворни асемблерски код програма. Посматра се извршавање датог програма који је резултат линковања помоћу приказане линкерске скрипте.
* [[Микропроцесорски системи/К2 2022#4. задатак|4. задатак, К2 2022]]


Која вредност се налази у регистру R0 у тренутку када ток контроле први пут стигне до адресе указане лабелом <code>leave_default_handler</code>? Одговор унети према формату неозначених хексадецималних литерала у C програмском језику ширине 32 бита.
=== Магистрале за периферије ===
Могу да дођу питања која питају на којој се магистрали налази одређена периферија. Ова информација се може наћи на неколико места у ''STM32F103 Reference Manual'', а најбоље на страни 50, 3.3 ''Memory map''.


Линкерска скрипта:
'''Примери питања:'''
<pre>
* [[Микропроцесорски системи/К2 2022#2. задатак|2. задатак, К2 2022]]
MEMORY
{
    FLASH(rx) : ORIGIN = 0x08000000, LENGTH = 32K
    SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 10K
}
SECTIONS
{
    .vector_table : { *(.vector_table) } > FLASH
    .text : { *(.text*) } > FLASH
}
</pre>
Изворни асемблерски код програма:
<syntaxhighlight lang="asm">
.cpu cortex-m3
.fpu softvfp
.syntax unified
.thumb


.section .vector_table, "a"
== Трећи блок ==
.word 0x20000064
=== ''USART'' грешке ===
.word reset_handler
Као једино често теоријско питање из овог блока може се издвојити питање о грешкама приликом спровођења ''USART'' протокола. ''USART'' комуникација изгледа тако што се магистрала држи на вредности 1 док по њој нема комуникације, затим почетни бит поруке има вредност 0 (''start bit''), после њега долази одређен број битова података (дат у задатку) у који је (опционо) укључен и бит парности (последњи међу битовима података), и на крају долази ''stop bit'' који мора имати вредност 1. Овде су могуће две грешке протокола:
.rept 15
* '''Parity error:''' у задатку је дато да ли се ради о парној парности или непарној парности, тако да ако је збир битова података (укључујући и бит парности) паран приликом непарне парности, или непаран приликом парне парности, дошло је до ове грешке.
.word default_handler
* '''Framing error:''' ова грешка се десила уколико на месту где треба да стоји ''stop bit'' не стоји вредност 1.
.endr


.equ SCB_ICSR, 0xE000ED04
'''Примери питања:'''
* [[Микропроцесорски системи/Јул 2022#5. задатак|5. задатак, јул 2022]], 5. задатак, јануар 2023


.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
=== Питање 1 ===
.type default_handler, %function
Која вредност се налази у регистру ''R1'' након извршавања дате секвенце асемблерских инструкција? Одговор унети према формату неозначених хексадецималних литерала у ''C'' програмском језику ширине 32 бита.
default_handler:
<syntaxhighlight lang="asm">
    mrs r0, ipsr
mov r0, 6
leave_default_handler:
mov r1, 9
    bx lr
cmp r1, r0
.end
itttt gt
subsgt r1, r1, r0
subsgt r1, r1, 5
addgt r1, r1, r0
subgt r1, r1, #4
</syntaxhighlight>
</syntaxhighlight>
'''Одговор:''' <span class="spoiler" data-solution="text">0x0000000E</span>
Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:
0x00000001
'''Одговор:''' <span class="spoiler" data-solution="text">0xFFFFFFFE</span>


'''Објашњење:''' <span class="spoiler" data-solution="explanation">Програм изнад почиње тако што у ресет рутини напише <code>0x10000000</code> у <code>SCB_ICSR</code> (односно меморијску адресу <code>0xE000ED04</code> која том регистру одговара). Ово значи да је на месту <code>PENDSVSET</code> бита уписана вредност 1, и да се активира прекид типа ''PendSV''. У рутини за ''PendSV'' (као и многе друге изузетке) се у регистар R0 уписује вредност IPSR регистра, који у себи садржи само број прекидне рутине која се тренутно извршава. Пошто је број прекидне рутине за ''PendSV'' 14, одговор је 14 у хексадецималном бројном систему.</span>
=== Питање 2 ===
 
Која вредност се налази у регистру ''R1'' након извршавања дате секвенце асемблерских инструкција? Одговор унети према формату неозначених хексадецималних литерала у ''C'' програмском језику ширине 32 бита.
==== Варијанта ====
Исти као задатак изнад, али <code>reset_handler</code> изгледа овако:
<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
reset_handler:
mov r0, 5
    nop
mov r1, 7
    nop
cmp r1, r0
    svc 0
ittet gt
    nop
subsgt r1, r1, r0
infinite_loop:
subsgt r1, r1, 3
    b infinite_loop
addle r1, r1, r0
subgt r1, r1, 2
</syntaxhighlight>
</syntaxhighlight>
'''Одговор:''' <span class="spoiler" data-solution="text">0x0000000B</span>
Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:
0x00000001
'''Одговор:''' <span class="spoiler" data-solution="text">0x00000004</span>
 
'''Напомена:''' <span class="spoiler" data-solution="explanation">на страни 58 у ''Cortex-M3 Programming Manual'', у одељку 3.3.7 ''Conditional execution'', лоше је написан услов за LE суфикс, исправан услов је "Z = 1 or N != V" уместо "Z = 1 and N != V" како је написано у документацији.</span>
 
=== Питање 3 ===
Колика је максимална радна фреквенција (''HCLK'') микроконтролера ''STM32F103R6'' уколико се користи ''HSE'' осцилатор који на свом излазу производи сигнал такта фреквенције 8MHz? Одговор унети у мегахерцима без навођења ознаке јединице.
 
'''Одговор:''' <span class="spoiler" data-solution="text">72</span>


'''Објашњење:''' <span class="spoiler" data-solution="explanation">Слично као горе, само што се овде окине изузетак типа ''SVCall'' позивом инструкције <code>svc</code>, и број тог изузетка је 11.</span>
'''Објашњење:''' <span class="spoiler" data-solution="explanation">Као што пише на фигури са стране 93 од ''STM32F103 Reference Manual'', ''HSE'' такт може проћи кроз PLL који може да његову фреквенцију помножи до 16 пута, али је максимална фреквенција ''HCLK'' 72MHz, што је мање од 128MHz колико би иначе могло да буде.</span>


[[Категорија:Рокови]]
[[Категорија:Рокови]]
[[Категорија:Микропроцесорски системи]]
[[Категорија:Микропроцесорски системи]]

Тренутна верзија на датум 18. септембар 2024. у 21:35

Питалице долазе на теоријским деловима обе предиспитне обавезе и свих испита на предмету. Типови питања су јако слични између рокова, па су зато испод набројана типична питања која се могу појавити на теоријском делу испита, дати примери питања и набројани корисни ресурси одакле се може прочитати више о њима. Уколико објашњења дата овде нису довољно јасна, погледати примере задатака ради разјашњења.

Први блок

Улазак и излазак из прекидне рутине

Код овог типа питања битно је разумети како функционише неколико механизама у Cortex-M3 микропроцесору. Текст испод парафразиран је из Cortex-M3 Programming Manual са страница 37 и 38:

  • Stacking: операција чувања одређених регистара на стеку приликом уласка у прекидну рутину. На стеку се чувају следећи регистри (то се зове stack frame) у редоследу који је дат:
    • R0, R1, R2, R3 и R12
    • Повратна адреса прекидне рутине (односно PC регистар)
    • Програмски статусни регистар (PSR)
    • Link register (LR)
    Након stacking, SP показује на најнижу адресу у stack frame (односно на R0). У CCR регистру бит STKALIGN може бити постављен на 1, у ком случају се дешава поравнање стека на дуплу реч.
    За овај механизам углавном буде дат програм на асемблеру који са стека учита одређени податак, па се мора одредити која је вредност тог податка.
  • Late-arriving: Паралелно са stacking се дохвата адреса руковаоца у IVT, па ако се до учитавања прве инструкције у прекидној рутини појави изузетак вишег групног приоритета прелази се на његово извршавање.
  • Tail-chaining: ако након извршавања тренутне прекидне рутине постоји следећи прекид који испуњава услове извршавања, прелази се на његово извршавање без уклањања вредности из stack frame.
    За овај механизам питања углавном буду бројање колико пута се десио tail-chaining под одређеним условима.

Примери питања:

Почетна инструкција програма

Адреса адресе прве инструкције програма јесте 0x00000004, тако да је адреса прве инструкције програма штагод да пише у меморији на адреси 0x00000004. Ова једноставна питалица може често да се појави на различитим роковима и одговор на њу може се наћи на страни 15 од Cortex-M3 Programming Manual.

Примери питања:

Условно извршавање инструкција

Овај механизам објашњен је на страни 56 у Cortex-M3 Programming Manual, у одељку 3.3.7 Conditional execution. Питања из ове области обично садрже барем једну it инструкцију и неке комбинације add, sub, cmp и mov инструкција са суфиксом s (ажурира програмски статусни регистар!) или без њега (не ажурира програмски статусни регистар!), а на крају се тражи вредност у неком од коришћених регистара. Треба нагласити да cmp инструкција увек ажурира програмски статусни регистар.

Примери питања:

Bit-band alias

У овом типу задатка тражи се да се за неки бит у SRAM одреди bit-band alias адреса. На страни 27 Cortex-M3 Programming Manual објашњен је овај механизам и наведене следеће формуле:

  • bit_word_offset = (byte_offset x 32) + (bit_number x 4)
  • bit_word_addr = bit_band_base + bit_word_offset

где је:

  • byte_offset померај неког бајта од почетка SRAM (SRAM почиње на 0x20000000),
  • bit_number број бита који се тражи (дат у задатку)
  • bit_band_base почетак bit-band alias региона (почиње на 0x22000000)

Примери питања:

Режими рада

Иако нема примера овог питања, може да дође питање у ком режиму се налази процесор приликом извршавања прекидне рутине (handler mode), а у ком приликом главног програма (thread mode). Овај податак се може наћи на страни 13 у Cortex-M3 Programming Manual, у одељку 2.1.1 Processor mode and privilege levels for software execution.

Intel HEX формат

У оваквом задатку потребно је растумачити шта пише у једној Intel HEX датотеци за коју је дат садржај и истакнута синтакса. Опис овог формата може са наћи на Википедији, али такође и на ARM-овом и Intel-овом сајту.

Примери питања:

Иницијална вредност SP

Регистар SP своју иницијалну вредност добија са адресе 0x00000000. У овом типу задатка буде један асемблерски програм у коме се ради формирање IVT (чији је нулти улаз заправо вредност SP), а затим се у програму негде та вредност користи, и резултат извршавања зависи од те вредности. Главна идеја је прочитати вредност SP са прве локације у вектор табели из асемблерског програма.

Примери питања:

Тренутна прекидна рутина

Још један чест задатак јесте асемблерски програм у којем се изазове одређени прекид на неки начин, а затим се у прекидној рутини у одређени регистар упише вредност IPSR и пита која је вредност уписана. Овај тип задатка није превише шаблонски у делу где се изазива прекид, али када се сазна који је прекид изазван његов број се лако може сазнати из Cortex-M3 Programming Manual, страна 32, 2.3.2 Exception types.

Примери питања:

Одређивање изузетка на основу описа

У овом типу задатка дат је опис једног типа изузетка у Cortex-M3 процесору, практично преведен из Cortex-M3 Programming Manual, са стране 32, 2.3.2 Exception types, и дато је више назива изузетака за бирање.

Примери питања:

Други блок

Пинови за активацију тајмера

У овом типу питања траже се пинови чија одговарајућа промена окида односно стартује бројање на одређеном тајмеру микроконтролера. На фигурама са страна 294 и 367 из STM32F103 Reference Manual можемо видети да у сигналу TRGI учествују TIMx_ETR, TIMx_CH1 (преко TI1FP1) и TIMx_CH2 (преко TI2FP2), а на странама 178 и 179 можемо пронаћи одговарајућа мапирања пинова за те канале микроконтролера. У теорији, у том сигналу би могао да учествује и сигнал TIMx_CH3 (преко XOR кола које улази у TI1) али ово никада није означено као тачан одговор.

Примери питања:

Фреквенција HCLK

Постоји неколико варијанти овог питања где је дата фреквенција интерних или екстерних осцилатора а пита се за максималну радну фреквенцију (HCLK). Одговор на ово питање се увек може наћи на фигури 8 са стране 93 од STM32F103 Reference Manual, где ти сигнали такта обично пролазе кроз PLL и евентуално се одсецају на одговарајуће максимуме као што је прописано шемом. Обратити пажњу и на текст испод фигуре!

Примери питања:

Број догађаја пред UEV

Овај тип питања пита колико пута се којих догађаја мора десити како би се десио Update Event (UEV) неког тајмера. Одговор је суштински да треба да се деси за један више пута него што је вредност repetition counter, при бројању навише се дешава counter overflow, док се при бројању наниже дешава counter underflow.

Примери питања:

Начин бројања тајмера

Иако нема забележеног тачног текста овог питања, може да дође питање да се означи на који начин може да броји тајмер, и на то је потребно одговорити:

  1. навише,
  2. наниже, и
  3. комбиновано.

Активирање EXTI преко RTSR

Питање пита за вредност EXTI_RTSR регистра која мора бити уписана како би се омогућили прекиди на датим пиновима. На страни 212. од STM32F103 Reference Manual можемо видети да за сваку EXTI линију постоји по један бит у RTSR регистру, док на страни 210. можемо видети да пиновима са индексом 0 одговара линија 0, пиновима са индексом 1 одговара линија 1, и тако даље. На основу тога, поставимо одговарајуће битове броја на основу датих пинова, и то је тражени одговор.

Примери питања:

Auto-reload регистар

Често умеју да дођу питања где су фигуре 59, 60, 70 или 71 исечене на неком делу и студенти се питају за одговарајуће вредности након исеченог дела. За овакво питање је потребно пронаћи одговарајућу фигуру из документације и видети на који начин измена Auto-reload preload регистра утиче на shadow регистар.

Примери питања:

Магистрале за периферије

Могу да дођу питања која питају на којој се магистрали налази одређена периферија. Ова информација се може наћи на неколико места у STM32F103 Reference Manual, а најбоље на страни 50, 3.3 Memory map.

Примери питања:

Трећи блок

USART грешке

Као једино често теоријско питање из овог блока може се издвојити питање о грешкама приликом спровођења USART протокола. USART комуникација изгледа тако што се магистрала држи на вредности 1 док по њој нема комуникације, затим почетни бит поруке има вредност 0 (start bit), после њега долази одређен број битова података (дат у задатку) у који је (опционо) укључен и бит парности (последњи међу битовима података), и на крају долази stop bit који мора имати вредност 1. Овде су могуће две грешке протокола:

  • Parity error: у задатку је дато да ли се ради о парној парности или непарној парности, тако да ако је збир битова података (укључујући и бит парности) паран приликом непарне парности, или непаран приликом парне парности, дошло је до ове грешке.
  • Framing error: ова грешка се десила уколико на месту где треба да стоји stop bit не стоји вредност 1.

Примери питања:

Некатегорисана питања

Следећа питања не припадају ниједном року, али спадају у једну од категорија питања изнад.

Питање 1

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

mov r0, 6
mov r1, 9
cmp r1, r0
itttt gt
subsgt r1, r1, r0
subsgt r1, r1, 5
addgt r1, r1, r0
subgt r1, r1, #4

Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:

0x00000001

Одговор: 0xFFFFFFFE

Питање 2

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

mov r0, 5
mov r1, 7
cmp r1, r0
ittet gt
subsgt r1, r1, r0
subsgt r1, r1, 3
addle r1, r1, r0
subgt r1, r1, 2

Приказ очекиваног формата одговора за произвољно одабрану вредност 1 јесте:

0x00000001

Одговор: 0x00000004

Напомена: на страни 58 у Cortex-M3 Programming Manual, у одељку 3.3.7 Conditional execution, лоше је написан услов за LE суфикс, исправан услов је "Z = 1 or N != V" уместо "Z = 1 and N != V" како је написано у документацији.

Питање 3

Колика је максимална радна фреквенција (HCLK) микроконтролера STM32F103R6 уколико се користи HSE осцилатор који на свом излазу производи сигнал такта фреквенције 8MHz? Одговор унети у мегахерцима без навођења ознаке јединице.

Одговор: 72

Објашњење: Као што пише на фигури са стране 93 од STM32F103 Reference Manual, HSE такт може проћи кроз PLL који може да његову фреквенцију помножи до 16 пута, али је максимална фреквенција HCLK 72MHz, што је мање од 128MHz колико би иначе могло да буде.