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
© Copyright 2024