Avbrott

Datorteknik
Tomas Nordström
Föreläsning 7
Avbrott
För utveckling av verksamhet, produkter och livskvalitet.
Föreläsning 7
Avbrott
•  References:
• 
• 
[SUM3U-complete] ATMEL AT91SAM ARM-based Flash MCU SAM3U Series (Complete manual), 2012
[Yiu-DefGuide] Joseph Yiu, “The definitive guide to the ARM cortexM3”, second edition, Newnes, 2010
2
Avbrott
Polling
•  Läser hela tiden i en loop. Processorn är ”låst” till
detta hela tiden. Kallas ibland programstyrt I/O.
Interrupt - avbrott
•  Processorn kan göra annat och blir avbruten av en
extern händelse, t ex någon skriver på ett
tangentbord. Mycket effektivare. Man kan göra
annat under tiden. Kräver att processorn har
hårdvarustöd för detta.
3
Avbrott
Grundprinciper
•  Interrupt, exception och undantag är andra namn
•  Något som avbryter processorns vanliga programkörning
(instruktionscykeln) och utför automatiskt en förutbestämd
undantagssekvens. Delar av denna sker automatiskt, andra delar
får man skriva kod för själv
•  Källorna till avbrott kan vara olika
•  Det finns nästan alltid någon mekanism i datorn för hantering av
avbrottet. Vår ARM har t.o.m. en speciell enhet för det (NVIC).
•  Det enda sätt vi externt direkt kan påverka processorn, t ex reset,
NMI, avbrott via portar eller I/O pinnar.
•  Två huvudtyper, interna och externa
•  Styr om programflödet (PC) på extern begäran. Avbryter den kod
som körs
4
Avbrott
Interna - Externa
•  Interna avbrott genereras av processorn själv vid olika
sorters fel. Dessa används för att man själv ska kunna ta
hand om de eventuella fel som kan uppstå.
•  Ex) Usage fault (tex okänd instruktion), Memory
Management Error (Minneshanterings fel, tex kan inte hämta
data), Division by Zero (division med noll)
•  Externa avbrott genereras utifrån processorn. Genom att
påverka vissa pinnar på kapseln. Hit räknas även de som
bygger på interna timers och liknande.
•  Ex) Timer, reset, NMI-pinne, portar
5
Sidonotering – Usage fault
•  Om vi försöker växla till ARM mode i en Cortex M3
så genereras ett ”usage fault”.
•  Man kan växla mode genom
•  ett hopp med BX instruktionen där bit 0 i registret avgör
mode (ARM=0; Thumb=1)
•  hopp via MOV, LDR, POP (med R15/PC som destination)
•  värdet på bit-0 i adresser i avbrottsvektorn
•  Men eftersom Cortex M3 alltid är i Thumb-mode så
måste bit-0 alltid vara 1 när PC laddas
•  Detta tas oftast hand om av assemblern, men kan
vara förvirrande när man ser på koden som
genererats.
6
Externa avbrott Användningsområde
Används för att
•  Effektivisera normal I/O-hantering, eg polling. Slippa ha kod
för att läsa av I/O överallt, men ändå kunna läsa av externa
händelser.
ex) Avläsning av musen i en PC
•  Utföra periodiska händelser, bli avbruten med j ämna
mellanrum av en sk Timer.
ex) Byta mellan program vid multitaskande operativsystem
Multitasking = Flera program (task) kör samtidigt. Ej möjligt
utan avbrott
•  Avbryta kod pga externa händelser
ex) Larmknapp, Reset
7
Avbrottsmekanism
•  I sista delen av instruktionscykeln kontrolleras om avbrott
skett. Det betyder att den pågående instruktionen alltid
slutförs innan avbrottet servas!
•  Antag avbrott har genererats. Följande händer då:
1.  Statusregister sparas. PC och eventuellt några andra register
sparas. [automatiskt]
2.  Ett hopp sker till ett förutbestämt ställe. Beror på
avbrottstypen. [automatiskt]
3.  Slå av avbrott med samma eller lägre prioritet, så att inte
avbrottsrutinen avbryts av oviktiga saker
4.  Utför avbrottskod
5.  Återgång till normal programkörning. Ofta med speciell
instruktion.
Detta återställer sparade PC och statusregister och eventuella
andra register
8
Varför spara både PC och
Statusregister?
•  Man kan se själva avbrottskoden som en subrutin
som körs på externt anrop, t ex då man trycker på
resetknapp. Dvs man kan i själva koden INTE veta
när avbrott kommer.
Antag att avbrott kommer här!
!CMP R1, #4!
!BEQ TEST!
•  Avbrottet kommer mitt i då statusflaggorna är
satta pga jämförelsen. Skulle då avbrottskoden
ställa om flaggorna och sedan gå tillbaka skulle
man kunna få effekten att hoppet inte tas även om
R1 =4!
9
Hur vet man vilket avbrott som
skett?
Två principer finns:
•  Autovektoriserade) Vid avbrott hoppar man
automatiskt till olika adresser pga källan till
avbrottet. Sköts hårdvarumässigt. Det finns en
färdig tabell i minnet på ett förutbestämt ställe.
Ofta i början på minnet.
•  Icke vektoriserade) Vid avbrott hoppar man
alltid till samma plats. Man har sedan ett speciellt
register som håller reda på vilket avbrott som
skett. Man får själv skriva kod för att läsa av
registret samt utför hopp till olika kod. Denna kod
kallas en handler
10
Terminologi vid avbrott
•  Maskbara (avbrott som går att slå på/av) vs. Icke
maskbara avbrott, NMI - Non Maskable Interrupt,
(sådana man inte kan slå av)
ex)
Maskbara: De flesta externa, timers
Icke maskbara avbrott: Internt
genererade. Ex) Reset, Illegal Instruction
•  Prioritering) Ibland har olika avbrott olika prioritet om
de sker samtidigt. Detta styrs hårdvarumässigt. Ibland
kan även vissa högre prioriterade avbrott avbryta
körning av sådana med lägre prioritet.
11
Exempel polling
• 
Anta att huvudprogrammet
består av tre moment. Vid
knapptryck ska larmkod
utföras.
• 
LARM anropas från
huvudprogram.
• 
Huvudprogrammet måste
läsa av knappen hela tiden
för att inte riskera att missa
någon tryckning.
• 
Avläsning av knapp sker
med mjukvara. Komplex
kod.
12
Exempel avbrott
• 
Anta huvudprogrammet består
av tre moment. Vid knapptryck
ska larmkod utföras.
• 
LARM anropas med avbrott.
• 
Huvudprogrammet behöver inte
bekymra sig över inläsning. Så
fort knapp trycks ned genereras
ett avbrott och LARM anropas
automatiskt.
• 
Avläsning av knapp sker med
hårdvara. Enklare kod
13
Liknelse: Avbrott - En bartender!
• 
• 
• 
• 
• 
Bartendem gör vanliga sysslor då ingen beställer något (vanlig
programköming). Alternativet hade varit att han frågat varje person
efter varandra om de velat beställa, sen börjar om på person ett.
Ineffektivt! Polling
Då någon ropar (beställer) en viss drink/öl utför bartendern en
beställning direkt på vad man frågar efter. Autovektoriserat avbrott
Ropar man bara "Hej!" avbryter man också bartendern, men han
måste då fråga vad man vill beställa. Icke vektoriserat avbrott
Då t ex ölen tar slut måste en tunna bytas och man avbryter
pågående beställning för detta (högre prioritet). Prioriterade avbrott
Bartendern kan välja att strunta i vissa avbrott (kunder), medan
andra (t ex chefen) inte går att ignorera. Maskbara avbrott
14
ARM - Programmers model
AVBROTT
Anta att det vanliga
programmet körs
1.  Avbrott kommer
2.  Avbrottskod körs
(handler). Avgör vilken
kod som ska köras
härnäst
3.  Återlämna kontroll till
huvudprogram
15
Avbrott
Delade resurser - problem!
•  Vad är en delad resurs? - register, hårdvara som både
avbrottskod och huvudprogram har tillgång till!
Ex)!
Avbrottet råkar komma här!
CMP R7,#0!
BEQ TEST
!
!
!
!; inuti TEST måste R7 vara noll !
!; annars blir det fel!!
Avbrott:!
LDR R7,=0x1 !
!
!
!; R1 är den delade resursen! !
!; (delas av avbrott och huvudprogram)!
•  Då avbrottet kom vid en olämplig tidpunkt 1-ställdes R7
innan man hoppar till TEST. Tanken var att man inte skulle
hoppa till TEST om inte R7 var 0.
Ett svårhittat fel!
16
Avbrott
Delade resurser - lösning!
•  Slå av avbrottet vid delad resurs!
Ex)!
<slå av avbrott>!
CMP R7,#0!
BEQ TEST
!
<tillåt avbrott>!
!!
Skyddad mot avbrott här
Ingen risk att man hamnar i TEST och R7=1
Avbrott:!
LDR R7,=0x1
Slutsats: Använd helst inte delade resurser och avbrott. Leder
till svåra problem. Använd ej globala variabler som delas av
avbrottsrutin och huvudprogram. Måste man ha detta, tänk på
att slå av avbrott i huvudprogram då den delade resursen
används!!
17
ARM - Avbrottskällor
1-15
16-255
Systemavbrott
Yttre avbrott
18
ARM pratar om 4 klasser av avbrott
•  Reset
•  Fault
•  Hard fault
•  Memory management fault
•  Bus fault
•  Interrupt
• 
• 
• 
• 
NMI
Interrupt (IRQ) – Externa avbrott
SysTick
PendSV För OS stöd i samband med SVcall
•  Supervisor Call
•  SVcall
För att stödja OS
19
ARM Cortex M3
Systemavbrott
[Yiu-DefGuide]
20
ARM – SAM3U
Yttre Avbrott
[SUM3U-complete] •  Totalt 30 olika
yttre enheter
kan ge avbrott
21
ARM Cortex M3
NVIC
The Cortex-M3 processor includes an interrupt
controller called the Nested Vectored Interrupt
Controller (NVIC). It is closely coupled to the
processor core and provides a number of features as
follows:
•  Nested interrupt support
•  Vectored interrupt support
•  Dynamic priority changes support
•  Reduction of interrupt latency
•  Interrupt masking
22
ARM Cortex M3
NVIC
The Nested Vectored Interrupt Controller (NVIC) supports:
•  1 to 30 interrupts on SAM3U (240 in general)
•  A programmable priority level in SAM3U is 0-15 for each
interrupt (0-255 in general). A higher level corresponds to a
lower priority, so level 0 is the highest interrupt priority.
•  Level detection of interrupt signals.
•  Dynamic reprioritization of interrupts.
•  Grouping of priority values into group priority and subpriority
fields.
•  Interrupt tail-chaining.
23
Vad gör en ARM Cortex M3 vid
avbrott?
When an exception takes place, a number of things
happen, such as
•  Stacking (pushing eight registers’ contents to
stack)
•  Vector fetch (reading the exception handler
starting address from the vector table)
•  Update of the stack pointer, link register (LR), and
program counter (PC)
24
ARM Cortex M3
Register på stacken vid avbrott
•  When an exception takes place, the registers R0–
R3, R12, LR, PC, and Program Status (PSR) are
pushed to the stack.
25
Adressen till avbrottsrutinen
hämtas samtidigt
•  Although the data bus is busy stacking the
registers, the instruction bus carries out another
important task of the interrupt sequence: It
fetches the exception vector (the starting address
of the exception handler) from the vector table.
•  Since the stacking and vector fetch are performed
on separate bus interfaces, they can be carried out
at the same time.
26
Register Updates
• 
• 
• 
• 
• 
• 
On entry of the exception handler, a number of registers will be
updated, as follows:
SP: The SP (either the MSP or the PSP) will be updated to the new
location during stacking. During execution of the interrupt service
routine, the MSP will be used if the stack is accessed.
PSR: The IPSR (the lowest part of the PSR) will be updated to the new
exception number.
PC: This will change to the vector handler as the vector fetch
completes and starts fetching instructions from the exception vector.
LR: The LR will be updated to a special value called EXC_RETURN. This
special value drives the interrupt return operation. The last 4 bits of
the LR is used to provide exception return information.
A number of other NVIC registers will also be updated. For example,
the pending status of the exception will be cleared and the active bit of
the exception will be set.
27
Återhopp efter avbrott
• 
28
Slå på avbrott
Cortex M3
•  Avbrotten styrs av: Interrupt Mask registers
(PRIMASK, FAULTMASK, and BASEPRI)
•  Vid avbrott ger „Interrupt Program Status register
(IPSR)“ information om vilket avbrott som
kommit.
29
Cortex-M3 Interrupt Mask
Registers
• 
• 
The PRIMASK and BASEPRI registers are useful for temporarily
disabling interrupts in timing-critical tasks.
An OS could use FAULTMASK to temporarily disable fault handling
when a task has crashed. In this scenario, a number of different
faults might be taking place when a task crashes. Once the core
starts cleaning up, it might not want to be interrupted by other
faults caused by the crashed process. Therefore, the FAULTMASK
gives the OS kernel time to deal with fault conditions.
MRS
MRS
MRS
MSR
MSR
MSR
r0, BASEPRI ;
r0, PRIMASK ;
r0, FAULTMASK
BASEPRI, r0 ;
PRIMASK, r0 ;
FAULTMASK, r0
Read BASEPRI register into R0!
Read PRIMASK register into R0!
; Read FAULTMASK register into R0!
Write R0 into BASEPRI register!
Write R0 into PRIMASK register!
; Write R0 into FAULTMASK register!
30
Slå på avbrott
NVIC
•  Externt avbrott tillåts genom att ettställa motsvarande bit i
SETENA ”Interrrupt set enable register” och slås av genom
CLRENA ”Interrrupt clear enable register” i NVIC.
Väntande avbrott
•  Om ett avbrott väntar på att få köras så ettställs
motsvarande bit i Pending registret som kan läsas via
SETPEND ”Interrupt Set-pending Registers” (men även
CLRPEND).
•  Om ett avbrott är aktiverat syns detta syns detta genom i
ACTIVE ” Interrupt Active Bit Registers”.
•  Innan man slår på ett avbrott är det en god sed att nollställa
alla ”pending” avbrott. Detta görs genom att skriva en etta
till CLRPEND ”Interrupt Clear Pending Register”.
31
Slå på avbrott
Periferienhet
•  Periferienheter kan oftast generera avbrott, men de måste
slås på separat.
PIO
•  Tex så slår man på PIO avbrott via PIO_IER (Interrupt
Enable Register) och PIO_IDR (Interrupt Disable Register)
för varje pinne på porten, kan läsas via maskreg. (PIO_IMR)
•  Dessutom måste PIO:n konfigureras för när den ska reagera
på yttre händelser med ett avbrott (flank eller nivå)
•  När en ingång upptäcker en avbrottshändelse (flank eller
nivå) på en I/O pinne så sätts motsvarande bit i PIO_ISR
(Interrupt Status Register). Om sedan avbrott är tillåten för
denna biten (i IMR) så generas ett processoravbrott fär den
PIO enhet som avses.
32
Slå på avbrott
Periferienhet - Systick
SYSTICK
•  SYSTICK Control and Status Register
33
Mer om Systick
•  Det primära målet för systemtimern (SysTick) är
att generera periodiska avbrott. Detta är oftast
används för att tillhandahålla tidsbasen i ett
operativsystem.
•  SysTick kan välja sin klockakälla. (I labben sätter
den till Master Clock)
•  SysTick har en 24-bitars räknare.
•  Räknaren kallas Current Value Register (CVR)
•  Startvärdet att ladda in till CVR kallas "reload value" och
är lagrat i Reload Value Register (RVR).
•  Varje gång CVR räknaren når 0, genereras ett avbrott och
värdet i RVR laddas in till CVR.
34
Steg att konfigurera avbrott
Att konfigurera en avbrottskälla kräver sex steg:
1.  Implementera en avbrottshanterare
2.  Lägg till avbrottsrutin i avbrottsvektorn
3.  Avaktivera avbrott ifall det var aktiverat
4.  Rensa alla utestående avbrott
5.  Konfigurera avbrottsprioritet
6.  Tillåt avbrott på periferienhetsnivå
7.  Tillåt avbrott på NVIC nivå
8.  Tillåt avbrott på processornivå
35
Dagens Föreläsning:
Avbrott (Exception, Interrupt)
• 
• 
• 
• 
• 
• 
• 
• 
Avbrott har många fördelar gentemot Pulling
Avbrott kan vara interna eller externa
Autovektorisering eller Icke vektoriserade
Användning av avbrott
Vad sker vid avbrott och hur man återgår
Maskning av avbrott
Prioritering av avbrott
Hur man slår på respektive stänger av avbrott
•  På CPU nivå, NVIC nivå, Periferienhet nivå (tex PIO,
SYSTICK)
36