Avbrott och undantag Ur innehållet: Cortex M4 "exceptions" Avbrott NVIC Externa avbrott: Avbrottsvippa Läsanvisningar: Arbetsbok kap 7 IRQ Flip-Flop STM32F4xx Cortex M4 programming manual Kap 2.3 Exception model SCB, sidor 206-227 NVIC, sidor 194-205 STM32F407 reference manual Interrupts and events, kap 12, 368-384 SYSCFG, kap 9, 286-298 Avbrott och undantag 1
Undantagshantering - "exception" ARM Processor RESET Applikation Undantag RESET NMI Exception Entry (inträde) Applikationskod "Thread Mode" Undantagskod "Handler Mode" Exception Return (utträde) Hard Fault Memory Management fault Bus Fault Usage Fault SV Call Pend SV Utträde från undantagshantering kan också vara ett nytt (annat) undantag med lägre prioritet. SysTick Avbrott Avbrott och undantag 2
Processorns olika tillstånd Handler/Thread modes, sköts automatiskt av processorn. För att underlätta konstruktion av operativsystem finns också: Privileged/ Non-privileged, kan programmeras. Non-priveleged mode tillåter inte alla instruktioner att exekveras. Ett försök att göra så resulterar i undantagshantering. Main stack/process stack kan programmeras, processorn använder olika fysiska register för stack. Operativsystemets programvara (kernel) exekveras med alla resurser tillgängliga. Applikationsprogrammet exekveras i en begänsad miljö, övervakad av kernel. Avbrott och undantag 3
Register Speciella register används för att ange Om flyttalsprocessor ska aktiveras Vilken stack som används Vilken exekverings-mode som används Om avbrott ska betjänas Avbrott och undantag 4
Speciella register Avbrott och undantag 5
Undantagsvektorer Första vektorn anger den initiala stackpekaren. Överiga vektorer innehåller addresser till funktioner för undantagshantering, adresserna har alltid LSB=1. (Thumb) Arkitekturen tillåter en tabell med högst 496 avbrott, men aktuell storlek bestäms av implementationen. Tabellen kan flyttas, dvs. relokeras av programvara, Vector Table Offsset Register (VTOR). Address Vector # 0x40 + 4*N External N 16 + N 0x40 0x3C 0x38 0x34 0x30 0x2C External 0 SysTick PendSV Reserved Debug Monitor SVC 16 15 14 13 12 11 0x1C to 0x28 0x18 0x14 0x10 0x0C 0x08 0x04 0x00 Reserved (x4) Usage Fault Bus Fault Mem Manage Fault Hard Fault NMI Reset Initial Main SP 7-10 6 5 4 3 2 1 N/A Avbrott och undantag 6
Main 5 Main 4 Reset Handler 4 1 Exception Handler 3 1 0x04 0x00 Reset Handler Vector Initial value of MSP r13 (MSP) 1. A reset occurs (Reset input was asserted) 2. Load MSP (Main Stack Pointer) register initial value from address 0x00 3. Load reset handler vector address from address 0x04 4. Reset handler executes in Thread Mode 5. Optional: Reset handler branches to the main program 2 3 Exception Vector 1. Exception occurs Current instruction stream stops Processor accesses vector table 2. Vector address for the exception loaded from the vector table 3. Exception handler executes in Handler Mode 4. Exception handler returns to main 2 Avbrott och undantag 7
Undantagshantering -detaljerna Main Application 1. Save processor status Copies CPSR into SPSR_<mode> Stores the return address in LR_<mode> Adjusts LR based on exception type 2. Change processor status for exception Mode field bits ARM or Thumb state Interrupt disable bits (if appropriate) Exception handler Sets PC to vector address 3. Execute exception handler <users code> 4. Return to main application Restore CPSR from SPSR_<mode> Restore PC from LR_<mode> 1 and 2 performed automatically by the core 3 and 4 responsibility of software Avbrott och undantag 8
Stacken i avbrottsfunktionen Ej aktiverad flyttalsenhet Före avbrott Processorn fyller automatiskt ut med 4 bytes om detta skulle krävas för att SP ska innehålla adress på adress jämnt delbar med 8. Detta indikeras med att bit9 i PSR sätts till 1. Avbrott och undantag 9
Återgång från avbrott Värdet i LR (EXC_RETURN) anger detaljerna för återställning av stack och PC efter avbrott Åter till handler mode använd main stack Åter till thread mode använd main stack Åter till thread mode använd process stack Flyttal aktiverat 0xFFFFFFE1 0xFFFFFFE9 0xFFFFFFED Flyttal ej aktiverat 0xFFFFFFF1 0xFFFFFFF9 0xFFFFFFFD Avbrott och undantag 10
Can return from interrupt with the following instructions when the PC is loaded with magic value of 0xFFFF_FFFX (same format as EXC_RETURN) LDR PC,.. LDM/POP which includes loading the PC BX LR (most common) If no interrupts are pending, foreground state is restored Stack and state specified by EXC_RETURN is used Context restore on Cortex-M3 and Cortex-M4 requires 10 cycles If other interrupts are pending, the highest priority may be serviced Serviced if interrupt priority is higher than the foreground s base priority Process is called Tail-Chaining as foreground state is not yet restored Latency for servicing new interrupt is only 6 cycles on M3/M4 (state already saved) If state restore is interrupted, it is abandoned New ISR executed without state saving (original state still intact and valid) Must still fetch new vector and refill pipeline (6-cycle latency on M3/M4) Avbrott och undantag 11
Externa avbrott Externa avbrott är en form av undantag. Registerinnehåll (xpsr, PC, LR, R12, R3-R0) sparas och återställs automatiskt av processorn Avbrottshanterare kan skrivas uteslutande med C -kod. Avbrott och undantag 12
Avbrottstabellen Anger position för de olika avbrottsvektorerna. De 16 första positionerna är samma för alla Cortex-M4. Resten av tabellen är specifik för den aktuella microcontrollern. Avbrott och undantag 13
Vectortabell i C typedef void(* const ExecptionFunctionPtr)(void); ExecptionFunctionPtr exception_table[] = { 0, (ExecptionFunctionPtr) main, NMIException, HardFaultException, MemManageException, BusFaultException, UsageFaultException, 0, 0, 0, 0, /* Reserved */ SVCHandler, DebugMonitor, 0, /* Reserved */ PendSVC, SysTickHandler /* Configurable interrupts start here...*/ } ; attribute ((section (".vector_table_section")) ); Avbrott och undantag 14
Vectortabell i assembler.thumb.section.globl Vectors interrupt_vectors Vectors:.WORD 0x2001A000 @ Top of Stack.WORD Reset_Handler.WORD NMI_Handler.WORD HardFault_Handler.WORD MemManage_Handler.WORD BusFault_Handler.WORD UsageFault_Handler.WORD 0, 0, 0, 0 @ Reserved x4.word SVC_Handler.WORD Debug_Monitor.WORD 0 @ Reserved.WORD PendSV_Handler.WORD SysTick_Handler @ External vectors start here Avbrott och undantag 15
VTOR - relokering Avbrott och undantag 16
EXEMPEL - Externt avbrott, avbrottsvippa EXEMPEL: Skriv en enkel applikation som använder PE3 hos MD407 som avbrottsingång och som registrerar varje avbrott, med en enkel räknare, och i huvudprogrammet skriver ut antalet avbrott till en visningsenhet enligt: void main(void) { app_init(); enable_interrupts(); while(1){ * portbargraphodrlow = count; } } Avbrott och undantag 17
IRQ-FlipFlop - avbrottsvippor Avbrott och undantag 18
SysCfg Används för att koppla IO-pinnar till processorns avbrottssystem Avbrott och undantag 19
Koppla PE(3) till EXTI3 avbrott Bits 15:0 EXTIx[3:0]: Dessa bitar bestämmer hur en IOpinne dirigeras till någon av de 16 avbrottslinorna EXTI0..EXTI15. 0000: PA[x] pin 0001: PB[x] pin 0010: PC[x] pin 0011: PD[x] pin 0100: PE[x] pin 0101: PF[x] pin 0110: PG[x] pin 0111: PH[x] pin 1000: PI[x] pin 1001: PJ[x] pin 1010: PK[x] pin Nollställ bitar som ska programmeras: SYSCFG_EXTICR1 &= ~0xFFF; Ettställ bitar för PE: SYSCFG_EXTICR1 = 0x4000; Avbrott och undantag 20