Inhoud vandaag Interrupts Algemeen ARM7 AIC
Interrupts Wat is een interrupt? Een interrupt is een onderbreking van de huidige bezigheden ten gevolge van een externe gebeurtenis, zodanig dat de bezigheden na de onderbreking weer kunnen worden hervat. Essentieel is hierbij, dat de onderbreking moet worden veroorzaakt van buitenaf.
Interrupts Interrupts bij computers: Volgorde van de geplande (geprogrammeerde) activiteiten wijzigen. Op een onbepaald tijdstip veranderd de programma flow. Asynchrone aan programma flow.
Interrupts Nut van interrupts Interrupts bij computers worden gebruikt voor: het beheer van het computersysteem bij parallel programmeren (multitasking). de service de signalering bij apparatuurfouten en programmatuurfouten. de communicatie met de buitenwereld, bijvoorbeeld ten behoeve van procesbesturing.
Interrupts Voorbeelden Beheer: Zorgen voor task switchen bij multitasking OS. Service: Systeem onderbreken voor test doeleinden. Beveiliging: Bij niet functionerende apparatuur (apparatuurfout), of een fout in het programma zoals een deling door 0. Communicatie: Een proces kan het lopende programma onderbreken ten behoeve van onmiddellijke actie als bijvoorbeeld het vloeistofniveau in een tank te laag wordt.
Interrupts Voorzieningen ten behoeve van interrupts Er moet een mogelijkheid zijn om de interrupt kenbaar te maken. een bepaalde activiteit uitgevoerd kunnen worden. De onderbroken activiteit moet zinvol voortgezet kunnen worden. Bepaalde interrupts moeten geblokkeerd kunnen worden. Bij meerdere interrupts moet nagegaan kunnen worden waar de interrupt vandaan komt.
Interrupts Soorten interrupts hardware interrupts Wordt kenbaar gemaakt aan microprocessor via interrupt ingang. Kan op ieder willekeurig moment optreden, dus asynchroon. software interrupts Uitgevoerd bij een bepaalde instructie. Komt op een door de programmeur bepaalde plaats in het programma, dus synchrone. Wordt vaak gebruikt om systeem software aan te roepen (system calls) traps Situatie die ontstaat door programma zelf, bijvoorbeeld niet bestaande opcode, of divide bij 0. Treedt op als direct gevolg van instructie, dus synchrone.
Interrupts Opdracht: Bedenk welke acties worden uitgevoerd bij het detecteren van een interrupt? En in welke volgorde.
Interrupts Interruptafhandeling Interrupts detecteren Instructie afmaken Terugkeeradres bewaren Flags opslaan Voldoende stackruimte Interrupt Service Routine starten ISR uitvoeren en Interrupts weghalen Onderbroken programma voortzetten
Interrupts Interrupts detecteren Interrupt moet voldoende lang aanwezig zijn. Instructie afmaken Eerst instructie afmaken.
Interrupts Terugkeeradres bewaren Geheugen locatie bewaren van de volgende instructie van het onderbroken programma. Flags opslaan Opslaan van control en status registers (conditie codes). Voldoende stackruimte Stackpointer moet een adres bevatten waar voldoende geheugen aanwezig is. Interrupt Service Routine starten Uitvoeren van een stuk programmatuur. Processor dient te weten waar dit programma in het geheugen begint. Vaste geheugen locatie Adres van ISR op vaste geheugen locatie. Interrupt aanvrager levert adres, mbv een vector. Externe hardware vertaalt interruptvector naar adres.
Interrupts ISR uitvoeren Interrupt service routine wordt uitgevoerd. Zo kort mogelijk houden, om de normale programma flow zo minmogelijk te beïnvloeden. Zorgen dat de interrupt oorzaak wordt verwijderd. Onderbroken programma voortzetten Aan het eind van een ISR wordt terug gesprongen naar het hoofdprogramma. Registers moeten zijn hersteld naar de waarde van voor de interrupt.
Interrupts, meerdere interrupts Een interrupt per interrupt ingang een microprocessor met vier interrupt ingangen; IRQ1, IRQ2, IRQ3 en IRQ4 vier interruptvectoren VEC1, VEC2, VEC3 en VEC4, die de respectievelijke startadressen ISR1,ISR2,IS3 en ISR4 van de vier interrupt service routines bevatten.
Interrupts Hoe kunnen we meerdere interrupt sources aansluiten op 1 interrupt ingang. En hoe kan dan de aanvrager worden opgespoord.
Interrupts, meerdere interrupts Prioriteit Meerdere interrupts tegelijk, dan IRQ met hoogste prioriteit eerst. Meerdere interrupt aanvragers op dezelfde interruptingang
Interrupts, meerdere interrupts Meerdere interrupt aanvragers op dezelfde interrupt ingang Als de microprocessor een interrupt detecteert, weet hij niet van welke aanvrager deze afkomstig is. Methode om de aanvrager op te sporen: 1. polling 2. vectoring
Interrupts, meerdere interrupts Polling Beurtelings aftasten van de diverse aanvragers om te achterhalen wie om een actie verzoekt Speelt zich af binnen de Interrupt Service Routine. Daar de polling in dit geval met behulp van instructies (in de ISR) wordt uitgevoerd, spreekt men van software polling.
Interrupts, meerdere interrupts Voorbeelden software polling
Interrupts, meerdere interrupts Voor- nadeel van software polling: Voordeel Grote flexibiliteit, prioriteit volgorde wordt bepaald door programmeur. Nadeel Traagheid, er gaat veel tijd verloren met het opsporen van de interrupt aanvrager. Traagheid neemt toe bij meer aanvragers. OPLOSSING: Hardware Vectoring
Interrupts, meerdere interrupts Principe hardware vectoring: interrupt aanvragers niet aangesloten op de interrupt ingang van de microprocessor, maar op verschillende interrupt ingangen van een externe hardware schakeling. Procedure: Zodra een van de interrupt ingangen actief wordt, geeft deze schakeling een interrupt af naar de processor. De processor reageert door de bijbehorende interrupt vector te adresseren,de externe schakeling vertaalt dit vectoradres in een ander adres of levert het startadres van de bijbehorende ISR. Is er geen interrupt aanvraag dan wordt het adres zonder vertaling doorgegeven aan de adresbus
Interrupts, meerdere interrupts Hardware methoden voor het opstarten van de juiste Interrupt Service Routine: De interrupt hardware vertaalt het interruptvectoradres. De interrupt hardware levert het startadres van de ISR. De interruptaanvrager levert de vectorinformatie. Hardware polling. Software polling gecombineerd met hardware vectoring. Interrupt levels ( eventueel in combinatie met software polling of hardware vectoring).
Interrupts, meerdere interrupts De interrupt hardware vertaalt het interruptvectoradres. interruptvectoradres door de externe hardware vertaald in een ander adres, dat afhangt van de interrupt aanvrager. Dit vertaalde adres wordt aangeboden aan het geheugen, dat op zijn beurt het ISR startadres levert.
Interrupts, meerdere interrupts De interrupt hardware levert het startadres van de ISR. Het is ook mogelijk om in plaats van het vectoradres de inhoud van de interruptvector (of een gedeelte daarvan, bijvoorbeeld 1 byte) door externe hardware te laten vertalen.
Interrupts, meerdere interrupts De interruptaanvrager levert de vectorinformatie Bij sommige processoren moet de interrupt aanvrager zelf vectorinformatie leveren. In dit geval zendt de microprocessor na het detecteren van een interrupt een IACK-signaal (Interrupt ACKnowledge) naar de interrupt aanvrager. Deze antwoordt hierop met het op de databus zetten van de vectorinformatie
Interrupts, meerdere interrupts Interrupt levels Er zijn microprocessoren met gecodeerde interrupt ingangen. Men spreekt hier van interrupt levels.
Interrupts ARM7TDMI processor De ARM7TDMI heeft 2 interrupt ingangen, de IRQ en FIRQ. De FIRQ ingang heeft een hogere prioriteit als de IRQ ingang. Starten Interrupt Service Routine Bij het optreden van een interrupt worden de volgende stappen uitgevoerd: Bewaar het adres van de volgende instructie in het LR (link register). Kopieer de inhoud van het CPSR (Current Program Status Register) naar het SPSR (Saved Program Status Register). Set het juiste bit in het CPSR afhankelijk van het soort interrupt, IRQ of FIRQ. Laad de PC (Program Counter) met een waarde van de exception vector en voer de volgende instructie (de eerste instructie van de ISR) uit.
Interrupts ARM7TDMI processor Interrupt Service Routine verlaten Bij het verlaten van de interrupt service routine, als deze is afgelopen, moeten de volgende stappen worden uitgevoerd: Laad de program counter met de waarde uit het Link register. Kopieer de inhoud van het SPSR terug naar het CPSR. Reset de interrupt disable flaggen.
Interrupts ARM7TDMI processor Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Advanced Interrupt Controller (AIC) Blokschema Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Advanced Interrupt Controller (AIC) Kenmerken 8 prioriteit niveaus Individueel maskeerbare interrupts Werk met interrupt vectoren 32 interrupt sources Stuurt de FIQ en IRQ lijnen van de ARM aan Inputs interne periferals Inputs externe pinnen Kan ieder interrupt source 1 van de 8 prioriteiten geven. Interrupts sources kunnen worden ingesteld op: Niveaus (hoog/laag) of flank afhankelijk (opgaande/ neergaande). Alle interrupts sources kunnen gebruik maken van de Fast Interrupt request faciliteit. (FIQ)
Advanced Interrupt Controller (AIC) Interrupt lijnen Extern De FIQ en IRQ0.. IRQn zijn gedeelde lijnen van de PIO controller. Intern Komen van de diverse interne (embedded) periferals.
Advanced Interrupt Controller (AIC) Interrupt sources Een interrupt source is of een interne periferal of 1 van de externe interrupt ingangen. Interrupt source 0 is altijd verbonden met FIQ input. Interrupt source 1 wordt altijd gebruikt voor de systeem interrupts, zoals; system timer, realtime clock, power manager. Ze zijn dus d.m.v. een wired-or met elkaar verbonden. Bij een interrupt op source 1 moeten dus de status registers van alle systeem functies worden getest in de interrupt service routine.
Advanced Interrupt Controller (AIC) Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Advanced Interrupt Controller (AIC) De AIC kan iedere interrupt source onafhankelijk van elkaar programmeren d.m.v. de volgende registers: AIC_SMR (Source Mode Register) prioriteit tussen 0 en 7 (7 = hoogste). conditie (flank/level gevoeligheid). AIC_IECR (Interrupt Enable Command Register) en AIC_IDCR (Interrupt Disable Command Register) Iedere Interrupt source individueel te enablen en disablen. AIC_IMR (Interrupt Mask Register) Hierin zijn de gemaskeerde interrupts af te lezen (welke door AIC_IECR en AIC_IDCR zijn ingesteld)
Advanced Interrupt Controller (AIC) Vervolg registers: AIC_ISCR (Interrupt Set Command Register) en AIC_ICCR (Interrupt Clear Command Register) Clearen en setten van interrupt source, alleen van invloed op flank gevoelige interrupts. Clear meestal bij initialisatie Set voor test en debug doeleinden AIC_IVR (Interrupt Vector Register) Staat interrupt vector van huidige interrupt Lezen van dit register zorgt voor een automatische clear van de interrupt AIC_SVR (Source Vector Registers) Staat het adres in van de desbetreffende interrupt source. AIC_IPR (Interrupt Pending Register) Laat alle actieve interrupts zien, gemaskeerd of niet.
Advanced Interrupt Controller (AIC) Vervolg registers: AIC_ISR (Interrupt Status Register) Geeft huidige actieve interrupt aan. AIC_CISR (Core Interrupt Status) Geeft de status van de IRQ en FIQ lijnen aan die met de ARM7TDMI core is verbonden.
Advanced Interrupt Controller (AIC) Interrupt latency De globale interrupt latencies (vertraging) is afhankelijk van een aantal parameters: De tijd dat de software de interrupts heeft gemaskeerd. Moment van optreden. De executie tijd van een instructie die net wordt uitgevoerd op het moment dat een interrupt optreedt. Hoe wordt omgegaan met interrupts van hogere prioriteit.
Advanced Interrupt Controller (AIC) Vertraging tussen aankomen interrupt op AIC en het aansturen van de IRQ/FIQ lijnen van de ARM processor: Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Advanced Interrupt Controller (AIC) Werking bij normale interrupts Interrupt op interrupt source (op ingestelde manier) Check of interrupt actief en prioriteit. Interrupt vector behorende bij interrupt source wordt gekopieerd naar IAC_IVR IAC_IVR wordt gelezen, hierdoor wordt automatisch desbetreffende interrupt flag in de AIC gecleared. Interrupt service routine wordt uitgevoerd vanaf adres uit IAC_IVR. Aan eind van ISR wordt het AIC_EOICR geschreven om aan te geven dat interrupt is afgehandeld.
Advanced Interrupt Controller (AIC) Werking bij fast interrupts Interrupt op interrupt source 0 (op ingestelde mannier) Interrupt vector behorende bij interrupt source 0 wordt gekopieerd naar IAC_FVR IAC_FVR wordt gelezen, hierdoor wordt automatisch desbetreffende interrupt flag in de AIC gecleared. Interrupt service routine wordt uitgevoerd vanaf adres uit IAC_FVR. Aan eind van ISR wordt het AIC_EOICR geschreven om aan te geven dat interrupt is afgehandeld.
Advanced Interrupt Controller (AIC) Spurious interrupts De AIC detecteert Spurious Interrupts Dit zijn interrupts die lang genoeg actief zijn om een interrupt te generen op de AIC maar al weer weg zijn op het moment dat het interrupt vector register wordt gelezen. Bij een Spurious Interrupts wordt de routine uitgevoerd waarvan het adres in het AIC_SPU register staat.
Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Bron : http://www.atmel.com/dyn/resources/prod_documents/6222s.pdf
Opdracht Stel de AIC zo in dat: PWMC een interrupt kan genereren op een opgaande flank, met de hoogste prioriteit. De interrupt service routine start op adres $08001000