13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)1 IS1200 Datorteknik Föreläsning 7 Exceptions ht 2009 – vt 2010 (period 2-3) för D-2
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)2 F1F2F3F4F5F7F8F9F10Ö2Ö1Ö3LAB-1Hemlab-1Ö4Ö7LAB-3Hemlab-2Ö8Hemlab-3Ö9TentamenÖ10 Assemblerkod 4 stegs pipeline Nios2time C-kod Nios2io Nios2int Cache-minnen CPU-scheduling IS1200 Datorteknik Hösten 2009 Våren 2010 F6Ö5Ö6LAB-2 22 jan feb feb mars mars feb
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)3 Litteraturhänvisningar +Kursboken, kapitel 5.2 Avbrott, principer (ej MIPS) +Nios-2-manualen, chap 3 (October 2007) +Exempelsamling del 7 med lösningar +Lab-PM för laboration 3, nios2int
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)4 Viktiga delar i en dator CPU MEM BUS I/O program data
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)5 Programexekvering i två steg, normalfall (decode) EXECUTE FETCH (update PC)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)6 Exceptions ”Undantag” / ”Särfall” Under den normala programexekveringen kan det inträffa ”speciella händelser” av olika slag som hanteras på likartat sätt 1. Interrupts, externa ”händelser”, avbrottssignaler (hardware interrupt) 2. TRAP-instruktioner (software exception) 3. Andra undantag, interna
Hantering av Exception Då ett exception inträffar avbryts pågående program och exekvering ”hoppar” till en annan programdel som kallas Exception Handler Programkoden i Exception Handler åtgärdar undantaget och därefter sker ”returhopp” till det avbrutna programmet 13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)7
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)8 Exception Handler Huvudprogram returhopp retur-adress ”hopp vid exception” exception ExceptionHandler Var placeras koden för ExceptionHandler ? Hur utförs hopp till ExceptionHandler ? Hur utförs hopp till returadressen ? intruction ”hopp vid retur”
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)9 1. Asynchronous Exceptions External Hardware Interrupts Yttre händelser orsaker avbrott (External) Elektrisk signal till CPU-chippet. Avbrott kan komma när som helst i förhållande till det program som körs (Asynchronous) Det måste finnas minst en insignal/pinne (Hardware) på CPU-chippet med funktionen IRQ - Interrupt ReQuest, troligen flera insignaler/pinnar Nios II har 32, IRQ31—IRQ00
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)10 Viktiga delar i en dator IRQ-signaler, Interrupt ReQuest CPU MEM BUS I/O program data IRQ (t.ex.IRQ31—IRQ00)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)11 Exceptions in many CPU:s Exception Vector Table exc00Handexc01HandexcNNHand instr Exception Vector Table Mjukvara eller Hårdvara som automatiskt gör hopp till rätt Exception-Handler samt lite till nämligen NN null
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)12 Nios-II Exceptions Control Registers Det finns ”fem” Control Registers 0.status - ctl0, read/write (status) 1.estatus - ctl1, read/write (exception status) 2.bstatus - ctl2, read/write (break status) 3.ienable - ctl3, read/write (interrrupt enable) 4.ipending - ctl4, read (interrupt pending) (det finns ev. fler men de diskuteras ej här)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)13 Nios-II control register 0 status, ctl U PIE Endast en (två) bit(ar) används: PIE = Processor Interrupt Enable (1=enable, 0=disable) (U = User Mode, 1=User Mode, 0=Supervisor Mode) (User och Supervisor mode är INTE implementerat i vår utrustning!)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)14 Nios-II control-register 0 status, ctl0 Bit med index 0 i status-register betecknas PIE – Processor Interrupt Enable PIE = 0 förbjuder interrupt (disable interrupts) PIE = 1 tillåter interrupt (enable interrupts)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)15 Nios-II instruktioner för att läsa och skriva ctl-regs Läsning, kopiera från ctli till rj RDCTLrj, ctli Skrivning, kopiera till ctli från rj WRCTL ctli, rj (RDCTL och WRCTL kan bara exekveras i supervisor mode. Ger access-violation exception i user mode. Vi använder alltid supervisor mode i våra labbar)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)16 Nios-II control register 1 estatus, ctl1 (exception status) Då en exception accepteras, kopieras status till estatus så att ”gamla” status- värden kan läsas/skrivas av koden i Exception Handler Vid retur från Exception Handler, med instruktionen eret, kopieras estatus tillbaks till status
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)17 Nios-II control register 3 ienable, ctl3 (interrupt enable) ctl3 är ett 32 bitars register (32 vippor) För var och en av de 32 IRQ-signalerna finns en maskbit vars värde 0 förbjuder avbrott (disable) värde 1 tillåter avbrott (enable) Se figur 3-1 i manualen (October 2007)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)18 ctl3 ctl4 No Flip-Flops ! Flip-Flops ! Signal Levels ! ctl0 bit 0 EI / DI
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)19 Nios-II control register 4 ipending, ctl4 (interrupt pending) ctl4 är 32 avläsbara signaler (inga vippor) För var och en av de 32 IRQ-signalerna finns en bit som programvaran kan läsa och som anger värde 0 inget avbrott begärs eller är förbjudet värde 1 avbrott begärs och är tillåtet Se figur 3-1 i manualen (October 2007)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)20 Exceptions Nios-II: Alltid ”hopp” till 0x huvudprogram returadress ”hopp vid anrop” exception instruction jmp ExcHandler 0x800020: Fast adress
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)21 Exception-Handler Nios-II: orsak till exception ? huvudprogram returadress ”hopp vid anrop” exception ExcHandler OPCODE reg jmp ExcHandler fast adress valbar adress ? IntHandler valbar adress TrapHandler valbar adress ElseHandler valbar adress 0x800020: ? ?
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)22
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)23 Interrupt or Trap ? figur 3-2 i manualen ExcHandler:# r24/et = exception temporary rdctlr24, ctl1# copy ctl1/estatus andir24, r24, 0b1# select index 0 beqr24, r0, NoInt# if EPIE == 0 rdctlr24, ctl4# copy ctl4/ipending beqr24, r0, NoInt# if ctl4 == 0 IntHandler:...# Interrupt Handler... NoInt:...# code see below
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)24 Interrupt-Handler letar fram aktuell IRQ-handler IntHandler valbar adress irq00-int valbara adresser IRQ-00? IRQ-01? IRQ-02?. IRQ-04?. IRQ-31? ??? irq04-int irq31-int retur
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)25 Vilken Interrupt ? figur 3-2 i manualen IntHandler: subir29, r29, 4# justera ea/returadress rdctlr24, ctl4# läs ipending andir24, r24, 0b1# IRQ-00? bner24, r0, irq00-int# int on IRQ-00 rdctlr24, ctl4# läs ipending andir24, r24, 0b10# IRQ-01? bner24, r0, irq01-int# int on IRQ-01...# ytterligare upp till IRQ-15 och sedan rdctlr24, ctl4# läs ipending andhir24, r24, 0x0001# IRQ-16? !!! bner24, r0, irq16-int# int on IRQ-16...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)26 2. Synchronous Exceptions TRAP instruction zException med hjälp av TRAP-instruktion zPlaceras av programmeraren på önskad och känd plats (Synchronous) Används t.ex. för OS System Call (SysCall) zNios-2: TRAP erbjuder en enda TRAP till den enda fasta adressen = 0x zParameter (i r4) möjliggör olika SysCall
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)27 Exception-Handler Interrupt eller Trap ? huvudprogram returadress ”hopp vid anrop” exception OPCODE reg jmp ExcHandler fast adress valbar adress ExcHandler IntHandler valbar adress TrapHandler valbar adress ElseHandler valbar adress 0x800020: REPRIS ? ? ?
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)28 Interrupt or Trap ? (cont.) figur 3-2 i manualen REPRIS ExcHandler:# r24/et = exception temporary rdctlr24, ctl1# copy ctl1/estatus andir24, r24, 0b1# select index 0 beqr24, r0, NoInt# if PIE == 0 rdctlr24, ctl4# copy ctl4/ipending beqr24, r0, NoInt# if ctl4 == 0 IntHandler:...# Interrupt Handler... NoInt:...# code see below
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)29 REPRIS
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)30 Interrupt or Trap figur 3-2 i manualen... NoInt:# Alternativ 1 pushr8# skydda/låna r8 ldwr24, -4(r29)# kopiera instruktion moviar8, trapcode# kopiera TRAP code beqr8, r24, TrapHandler# yes, TRAP popr8# återställ/återlämna r8 NoTrap:....equ trapcode, 0x003B683A# op-code of TRAP OBS r1 kan inte användas! (kan ju innehålla värdefull information) Lösning: Använd stacken för att skydda t.ex. r8
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)31 Interrupt or Trap figur 3-2 i manualen... NoInt:# Alternativ 2 pushr8 # skydda/låna r8 ldwr24, -4(r29)# kopiera instruktion moviar8, trapdum# kopiera TRAP code ldwr8, 0(r8)# till r1 beqr8, r24, TrapHandler# yes, TRAP popr8 # återställ/återlämna r8 NoTrap:....data# eller i.text.align2# på adress delbar med 4 trapdum:trap# op-code of TRAP
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)32 Vilken TRAP System Call med TRAP TrapHandler: popr8# återställ r8 movir24, 0# konstant 0 till r1 beqr4, r24, SysCall-0# javisst movir24, 1# konstant 1 till r1 beqr4, r24, SysCall-1# javisst...# och så vidare
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)33 Exceptions in Nios-II Suggested software structure trap 0x800020:”jmp ExcHand” Int ?Trap ? ExcHand: ElseHand Yes No IRQ00 IRQ01 IRQ31 error IntHand: No irq00Hand Yes irq01Hand Yes irq31Hand Yes subi r29, r29, 4 eret No trap0 trap1 trapn error TrapHand: No trap0Hand Yes trap1Hand Yes trapnHand Yes eret No instr int
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)34 Interrupts in many CPU:s Interrupt Vector Table irq00Handirq01Handirq31Hand instr Interrupt Vector Table Mjukvara eller Hårdvara som automatiskt gör hopp till rätt Interrupt Handler samt lite till nämligen null Nästan REPRIS
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)35 Traps in many CPU:s Trap Vector Table trap0Handtrap1HandtrapnHand TRAP Exception Trap Vector Table Mjukvara eller Hårdvara som automatiskt gör hopp till rätt TrapHandler 0123n0123n null
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)36 Registrera en Interrupt Handler vad menas med det ? Koppla ihop en Interrupt Handler kod med en avbrottssignal med ett visst index dvs Skriv in startadress på rätt plats i avbrottsvektortabellen Kallas ibland ”register an interrupt” Nios-II: Det finns en C-function för detta: retval = alt_irq_register(3 parameters);
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)37 Initiera för avbrott flera steg i Nios-II zKopiera ”stubbe” till adress 0x zFör varje avbrottskälla Skriv kod för en Interrupt Handler och registrera i avbrottsvektortabellen, zInitiera IO-enhet, olika för varje IO-enhet zInitiera bitar i IENABLE / ctl3 zInitiera PIE-biten i STATUS / ctl0
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)38 3. Synchronous Exceptions Internal Exceptions 1.”Inre” händelser kan orsaka exception (Internal Synchronous Exception) 2.”Upptäcks” av hårdvara internt i CPU:n 3.Exempel (olika typ av ”error”) Unimplemented/Illegal instructions Overflow (arithmetic/logic operation) Misaligned Memory Reference Divide by zero Access violation (in User Mode...)...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)39 Exceptions i Nios-II Interrupt Vector Table ? Programräknaren får ett nytt värde som anges av hårdvaran till 0x Avbrottsvektortabell används EJ av hårdvaran i Nios-II Returadress sparas på lämplig plats (ea/r29) Mjukvaran kan administreras i tabell-form som liknar en avbrottsvektortabell
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)40 Priority - prioritet Viktiga frågor Exekverar processorn på en viss prioritet ? Var finns information om CPU-priority ? Har varje exception olika prioritet ? Prioritet för en external interrupt ? Prioritet för en TRAP-instruktion ? Prioritet för en internal exception ?
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)41 Nios-II Priority Interrupt har en viss prioritet, 31—00 (hur avgörs prioritet ?) TRAP-instruktion, är ohejdbar (non-maskable) varför? Internal exception, är ohejdbar (non-maskable) varför?
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)42 Nios-II Exceptions Enable/Disable Exception 1.Globally Enable/Disable Interrupt by PIE-bit in ctl0 / status control register 2.Selectively Enable/Disable Interrrupt by bits in ctl3 / ienable control register 3.TRAP instructions can not be disabled (non-maskable) 4.Internal exceptions can not be disabled (non-maskable) 5.Selectively Enable/Disable each I/O (lab3) 6.Acknowledge interrupt signals from I/O ”clear/reset” interrupt hardware signal
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)43 Nios-II Exceptions Exception Processing Sequence performed by hardware 1. Copy status into estatus (ctl0 into ctl1) 2. Set PIE to 0, disabling all interrupts (in ctl0) (3. Set U to 0, execute in supervisor mode, in ctl0) 4. Save returnaddress in ea=r29 5. Set PC to predefined value (0x800020) 6. Continue fetch-execute (Remark: return address must be decremented by 4 before executing eret in interrupt handler but not in trap handler, why?)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)44 Nios II: eret exception return-instruction performed by hardware eret #return from exception using #content of r29 as return address 1. status estatus copy ctl1 back to ctl0 2. PC ea / r29 3. Continue fetch-execute
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)45 Ändra i ctl-register Read – Modify - Write Exempel på användbara instruktioner rRDCTL ri, ctlj# läs/kopiera ctlj till ri rWRCTL ctlj,ri # skriv/kopiera ri till ctlj rANDIri, rj, ”mask”# ”nollställ” bitvis # ”maska fram” rORIri, rj, ”mask”# ”ettställ” bitvis rXORIri, rj, ”mask”# ”invertera” bitvis
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)46 IS1200 Datorteknik Laboration 3 Ny/ändrad from våren 2010 tips om I/O-interrupts
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)47 Nios-2 Interrupt signals CPU MEM BUS I/O TIMER_1 IRQ10 TOGGLES-18 IRQ3 KEYS-4 IRQ2 IRQ bus logic I/O Uart_0 IRQ4 I/O Uart_1 IRQ5
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)48 Nios-2 Interrupt signals z32 separata IRQ som kan aktiveras av extern hårdvara zAktiva IRQ kan pollas av program zFigur 3-1 i manualen
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)49 Laboration 3: Exceptions Bakgrundsprogram zBakgrundsprogram beräknar och skriver ut primtal Main: is prime Main: is prime Main: is prime...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)50 Laboration 3: HA1 Exceptions med nios II-kod Home Assignment – HA HA1: lägger till avbrott från timer_1 som (dessutom) varje sekund ger utskrift av tid 59:57 59:58 59:59 Main: is prime 00:00 00:01 00:02 Main: is prime 00:03 00:04 00:05 00:06 Main: is prime 00:07 00:08 00:09
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)51 Nios Timer Hårdvaru-figur counter clock period copy write from program using store run start time-out Q Q’ D cl set clear stop zero snap-shot read from program using load copy store Q Q’ D cl load
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)52 0x920 status 0x924 control 0x928 periodl 0x92C periodh 0x930 snapl 0x934 snaph Nios timer_1 Status / Control etc Run T0 - Time-Out ITO cont start stop 15 0 IRQ at index 10
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)53 Nios timer_1 Hokus Pokus zTO - Time Out, bit 0 at address 0x920 zRun, bit 1 på adress 0x920 zClear Time Out, Write anything to 0x920 zContinous Counting, ”set” bit 1 at 0x924 zStart Run, ”set” bit 2 at 0x924 zStop Counting, ”set” bit 3 at 0x924 zWR anything to snapshot, copy Counter to SnapShot zEnable interupt, set bit 0 at 0x924
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)54 Laboration 3: HA2 TRAP med nios II-kod HA1: avbrott från timer_1 ger utskrift av tid HA2: trap i ”main-loop” ger (dessutom) utskrift av ”!” 59:57 59:58 59:59 Main: is prime! 00:00 00:01 00:02 Main: is prime! 00:03 00:04 00:05 00:06 Main: is prime! 00:07 00:08 00:09
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)55 Laboration 3: HA3 TRAP med nios II-kod HA1: avbrott från timer_1 ger utskrift av tid HA2: trap i main-loop ger utskrift av ”!” HA3: trap i timer-avbrottsrutin ger (dessutom) utskrift av ”T” 59:57T 59:58T 59:59T Main: is prime! 00:00T 00:01T 00:02T Main: is prime! 00:03T 00:04T 00:05T 00:06T Main: is prime! 00:07T 00:08T 00:09T
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)56 Laboration 3: HA4 Interrupts med nios II-kod HA1: avbrott från timer_1 ger utskrift av tid HA2: trap i main-loop ger utskrift av ”!” HA3: trap i avbrottsrutin ger utskrift av ”T” HA4: avbrott från knappen KEY0 Down and Up ger (dessutom) utskrift av D och U 59:57T D59:58T U59:59T Main: is prime! D00:00T 00:01T 00:02T Main: is prime! 00:03T U00:04T 00:05T 00:06T Main: is prime! 00:07T 00:08T 00:09T
13 October 2015 IS1200 Datorteknik ht2009 föreläsning 6, (D2)57 de2_pio_keys4 Memory Mapped Addresses 0x840 0x844 0x848 0x84C KEY3 KEY2 KEY1 KEY0 Delar av Lab-kortet Direction Register Interrupt Mask Register Edge Capture Register - ECR Data Register
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)58 Nios II: de2_pio_toggles_18 de2_pio_keys_4 zDirection Register: 0=in, 1=out zBidirectional bits are possible, ”has_tri” zInterrupt Mask: 0=disable, 1=enable (each bit) zEdge Capture: rising, falling, any, none (all bits) zOnly input pins can capture edges zClear Edge Capture Register, Write anything to edge capture register at 0xNNC
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)5913 October de2_pio_toggles18 Memory Mapped Addresses 0x850 0x854 0x858 0x85C SW3 SW2 SW1 SW0 Delar av Lab-kortet SW14 SW15 SW16 SW17 Direction Register Interrupt Mask Register Edge Capture Register - ECR Data Register
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)60 Laboration 3: Surprice #1 Interrupts med nios II-kod HA1: avbrott från timer_1 ger utskrift av tid HA2: trap i main-loop ger utskrift av ”!” HA3: trap i avbrottsrutin ger utskrift av ”T” HA4: avbrott från knappen KEY0 Down and Up ger (dessutom) utskrift av D och U Surprice: något ytterligare 59:57T D59:58T U59:59T Main: is prime! D00:00T 00:01T 00:02T Main: is prime! 00:03T U00:04T 00:05T 00:06T Main: is prime! 00:07T 00:08T 00:09T
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)61 Laboration 3 Interrupts Exceptions med C-kod C-code given (background and interrupts): ___59:58___DdU___Dd____59:59__U_ HA6: Toggles (and interrupts from TOGGLES18) __Ss___DdU___Dd__Ss__U__59:59___ HA7: Nested Interrupts (interrupt in interrupthandler) ___SDdUs_____SDdsU__59:59___ LA8: Surprice Assignement (surprice)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)62 Laboration 3 Interrupts (forts.) zAvbrott från serieportar är möjligt zAvbrott då RxRdy blir 1 (IBF) zAvbrott då TxRdy blir 1 (OBE) zDet finns: Separata ”Enable/Disable Interrupt” för IBF/RxRdy och OBE/TxRdy
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)63 Nios uart_0 Memory Mapped Addresses 0x860 0x864 0x868 RxRdy (IBF) TxRdy (OBE) RxDATA (RD) uart_10x880-88F TxDATA (WR) uart_0
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)64 Nios uart_0 Memory Mapped Addresses 0x860 0x864 0x868 0x86C RxDATA (RD) uart_00x860-86F (IRQ at index 4) uart_1 0x880-88F (IRQ at index 5) TxDATA (WR) uart_0: IRQ at index 4 Enable interrupt for RxRdy - IRxRdy Enable interrupt for TxRdy - ITxRdy
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)65 IRQ-Handler (för KEYS4) letar fram aktuell avbrottskälla irq02-int valbar adress key0-int valbara adresser KEY0 ? KEY1 ? KEY2 ? KEY3 ? ??? retur key3-int
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)66 Int from IRQ-02 de2_pio_keys_4 irq02-int: pushr8 moviar24, 0x840# bas-adress till KEYS4 ldwr8, 12(r24)# läs ECR stwr0, 12(r24)# clear ECR / acknowledge andir24, r8, 0b0001# KEY0 ? bner24, r0, key0-int# yes, int from key-0 andir24, r8, 0b0010# KEY1 ? bner24, r0, key1-int# yes, int from key-1...# and perhaps 2 more keys (r24=et) (kom ihåg att göra ”pop r8” innan eret)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)67 Int from IRQ-2 de2_pio_keys_4 : key0int key0-int: push...# vid behov # skriv ut ’D’ paus ’d’ om ”down” pop...# vid behov popr8# vid behov eret# returhopp
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)68 IRQ-Handler (för TOGGLES18) letar fram aktuell avbrottskälla irq03-int valbar adress tog0-int valbara adresser TOGGLES0 ? TOGGLES1 ?... TOGGLES8 ?... ??? retur tog8-int
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)69 Int from IRQ-03 TOGGLES18 irq03-int: pushr8 moviar24, 0x850# bas-adress till TOGGLES18 ldwr8, 12(r24)# läs ECR stwr0, 12(r24)# clear ECR andir24, r8, 0b0001# TOGGLES-0 ? bner24, r0, tog0-int# yes, int from TOGGLES-0 andir24, r8, 0b0010# TOGGLES-1 ? bner24, r0, tog1-int# yes, int from TOGGLES-1...# and maybe 16 more toggles
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)70 IRQ-Handler (för uart_0) letar fram aktuell avbrottskälla irq04-int valbar adress Rx0-int valbara adresser RxRdy ?. TxRdy ? ??? Tx0-int retur
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)71 Int from IRQ-04 uart_0 irq04-int: pushr8 moviar24, uart_0# adress till uart0 ldwr8, 12(r24)# läs status andir24, r8, 0x80# RxRdy ? bner24, r0, Rx0-int# yes, int from RxRdy andir24, r8, 0x40# TxRdy ? bner24, r0, Tx0-int# yes, int from TxRdy...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)72 IRQ-Handler (för timer_1) letar fram aktuell avbrottskälla irq10-int valbar adress Timer_1-int valbara adresser... T1-Int ?. ??? retur
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)73 Int from IRQ-10 timer_1 irq10-int: moviar24, timer_1# adress till timer ldwr24, 0(r24)# läs status andir24, r24, 0b1# TO=1 ? beqr24, r0, NoTimeInt # no, int from timer Timer_1-int: moviar24, timer# adress till timer stwr0, 0(r24)# clear Time-Out...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)74 Möjligt: Flödesschema för korsvis kommunikation avbrottstyrd med paritetskontroll in_charparmakerec_charpartest eret errmakesend_charout_char eret RxRdy-INT
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)75 Några användbara makro:n till Nios-2.macroEI# Enable Interrupt rdctl r24, ctl0 orir24, r24, 0b01# wrctl ctl0, r24.endm.macroDI# Disable Interrupt pushr8# r8 istf r24 rdctlr8, ctl0# för det kan bli andir8, r8, 0xFE# avbrott här wrctl ctl0, 8 popr8.endm
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)76 Några användbara makro:n för Nios-2.macroPUSH reg# lägg reg på stack subisp, sp, 4 stw\reg, 0(sp).endm.macroPOP reg# från stack till reg ldw\reg, 0(sp) addisp, sp, 4.endm; OBS ej reg=sp OBS
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)77 Samlad information IRQ-levelUnitAddressAcknowledge... IRQ-02KEYS40x840stw any, 0xC(0x840) IRQ-03TOGGLES180x850stw any, 0xC(0x850) IRQ-04uart_00x860read/write data IRQ-05uart_10x880read/write data... IRQ-10timer_10x920stw any, 0(0x920)...
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)78 HAL-functions Hardware Abstraction Layer zKoppla en exceptionhandler till ett index (”registrera”) retvalue = alt_irq_register(3 parameters) (bra beskrivning finns i lab-PM nios2int !) zDet finns även (används i lab nios2int ! Se lab-PM) zTillåt bara avbrott med högre prioritet än index oldmask=alt_irq_interruptible(index) zÅterställ till tidigare läge med avbrott avstängda alt_irq_non_interruptible(oldmask)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)79 static alt_u32 alt_irq_interruptible(alt_u32 priority) (används i lab nios2int) Tillåt endast avbrott med högre prioritet än angiven priority dvs med index lägre än priority Som returvärde erhålls gamla IENABLE/ctl3 Eller på en högre akademisk nivå ”den gamla prioritetsmasken” Och, det görs EI dvs bit med index 0 i STATUS ettställs aktivt Bottom Up: Nollställ alla bitar med samma eller högre index i IENABLE/ctl3 Samt ettställ bit med index 0 i STATUS (”Enable Interrupt”) Returnera gamla värdet av från IENABLE/ctl3 (som kan kallas oldmask)
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)80 void alt_irq_non_interruptible(alt_u32 oldmask) (används i lab nios2int) Stäng av alla avbrott och ”återställ” IENABLE/ctl3 Inparameter oldmask förutsätts vara returvärdet från oldmask = alt_irq_interruptible(index) Inget returvärde Bottom-Up: Nollställ bit med index 0 i STATUS Ettställ bitar med samma eller lägre prioritet som var ettställda ”tidigare” in i IENABLE
13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)81 int alt_irq_disable(alt_u32 id) ”förbjud avbrott med visst index” Nollställ enstaka bit i IENABLE/ctl3 Returvärde är alltid 0 Effekten är att man kan förbjuda avbrott på en viss nivå / med ett visst index retval = int_alt_irq_disable(7); ctl3
Ettställ enstaka bit i IENABLE/ctl3 Returvärde är alltid 0 Effekten är att man kan tillåta avbrott på en viss nivå / med ett visst index 13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)82 int alt_irq_enable(alt_u32 id) ”tillåt avbrott med visst index” retval = int_alt_irq_enable(7); ctl3
Nollställ alla bitar i IENABLE/ctl3 med index > eller = med id Tillåt avbrott genom att ettställa PIE-biten i register STATUS/ctl0 Returvärde är innehållet i IENABLE/ctl3 före nollställningen Effekten är att man tillåter avbrott enligt innehåll i ienable/ctl3 men endast avbrott med prioritet > id (dvs med index < id) 13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)83 int alt_irq_interruptible(alt_u32 id) ” Tillåt endast avbrott med högre prioritet” oldmask = int_alt_irq_interruptible(7); ctl3
Förbjud avbrott genom att nollställa PIE-biten i register STATUS/ctl0 Återställ bitar i IENABLE/ctl3 enligt värde i inparameter Inparameter ska vara returvärde från int_alt_irq_interruptible() Används för att återställa STATUS och IENABLE som det var innan närmast föregående anrop av int_alt_irq_interruptible() 13 October 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)84 int alt_irq_non_interruptible(alt_u32 oldmask) ” Återställ tillåtna/förbjudna avbrott enligt tidigare ” int_alt_irq_non_interruptible(oldmask); ctl3