3 August 2015IS1200 Datorteknik föreläsning 71 IS1200 Datorteknik Föreläsning 7 Exceptions Interrupts - Traps
3 August 2015IS1200 Datorteknik föreläsning 72 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 F6Ö5Ö6LAB-2 5 feb
3 August 2015IS1200 Datorteknik föreläsning 73 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
3 August 2015IS1200 Datorteknik föreläsning 74 Viktiga delar i en dator CPU MEM BUS I/O program data
3 August 2015IS1200 Datorteknik föreläsning 75 Programexekvering i två steg, normalfall (decode) EXECUTE FETCH (update PC)
3 August 2015IS1200 Datorteknik föreläsning 76 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 3 August 2015IS1200 Datorteknik föreläsning 77
3 August 2015IS1200 Datorteknik föreläsning 78 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”
3 August 2015IS1200 Datorteknik föreläsning 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
3 August 2015IS1200 Datorteknik föreläsning 710 Viktiga delar i en dator IRQ-signaler, Interrupt ReQuest CPU MEM BUS I/O program data IRQ (t.ex.IRQ31—IRQ00)
3 August 2015IS1200 Datorteknik föreläsning 711 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 NN null
3 August 2015IS1200 Datorteknik föreläsning 712 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)
3 August 2015IS1200 Datorteknik föreläsning 713 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!)
Grindar att öppna före avbrott 3 August 2015IS1200 Datorteknik föreläsning 714 && & Interrupt to CPU PIE-bit in STATUS ctl0 BIT in IENABLE ctl3 BIT in I/O maskreg Interrupt from I/O BIT in IPENDING ctl4 IRQ-bit
3 August 2015IS1200 Datorteknik föreläsning 715 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)
3 August 2015IS1200 Datorteknik föreläsning 716 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)
3 August 2015IS1200 Datorteknik föreläsning 717 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
3 August 2015IS1200 Datorteknik föreläsning 718 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)
3 August 2015IS1200 Datorteknik föreläsning 719 ctl3 ctl4 No Flip-Flops ! Flip-Flops ! Signal Levels ! ctl0 bit 0 EI / DI
Grindar att öppna före avbrott 3 August 2015IS1200 Datorteknik föreläsning 720 && & Interrupt to CPU PIE-bit in STATUS ctl0 BIT in IENABLE ctl3 BIT in I/O maskreg Interrupt from I/O BIT in IPENDING ctl4 IRQ-bit
3 August 2015IS1200 Datorteknik föreläsning 721 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)
3 August 2015IS1200 Datorteknik föreläsning 722 Exceptions Nios-II: Alltid ”hopp” till 0x huvudprogram returadress ”hopp vid anrop” exception instruction jmp ExcHandler 0x800020: Fast adress
3 August 2015IS1200 Datorteknik föreläsning 723 Exception-Handler Nios-II: orsak till exception ? huvudprogram returadress ”hopp vid anrop” exception ExcHandler OPCODE reg jmp ExcHandler Fast adress Symbolisk adress Vi väljer namn IntHandler TrapHandler ElseHandler 0x800020: Symboliska adresser Vi väljer namn ? ? ?
3 August 2015IS1200 Datorteknik föreläsning 724 IntHandler: NoInt: TrapHandler: NoTrap:
3 August 2015IS1200 Datorteknik föreläsning 725 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
3 August 2015IS1200 Datorteknik föreläsning 726 Interrupt-Handler letar fram aktuell IRQ-handler IntHandler irq00-int irq01-int irq31-int retur IRQ-00? IRQ-01? IRQ-02? IRQ-31? irq02-int retur subi r29, r29, 4
3 August 2015IS1200 Datorteknik föreläsning 727 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...
3 August 2015IS1200 Datorteknik föreläsning 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
3 August 2015IS1200 Datorteknik föreläsning 729 Exception-Handler Nios-II: orsak till exception ? huvudprogram returadress ”hopp vid anrop” exception ExcHandler OPCODE reg jmp ExcHandler Fast adress Symbolisk adress Vi väljer namn IntHandler TrapHandler ElseHandler 0x800020: Symboliska adresser Vi väljer namn ? ? ? REPRIS
3 August 2015IS1200 Datorteknik föreläsning 730 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
3 August 2015IS1200 Datorteknik föreläsning 731 IntHandler: NoInt: TrapHandler: NoTrap:
3 August 2015IS1200 Datorteknik föreläsning 732 Interrupt or Trap (alternativ 1)... NoInt:# Alternativ 1 pushr8# skydda/låna r8 ldwr24, -4(r29)# kopiera instruktion moviar8, trapcode# kopiera TRAP code cmpeqr24, r8, r24# yes, TRAP popr8# återställ/återlämna r8 bner24, r0, TrapHandler# yes, TRAP 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
3 August 2015IS1200 Datorteknik föreläsning 733 Interrupt or Trap (alternativ 2)... NoInt:# Alternativ 2 pushr8 # skydda/låna r8 ldwr24, -4(r29)# kopiera instruktion moviar8, trapdum# kopiera TRAP code ldwr8, 0(r8)# till r1 cmpeqr24, r8, r24# yes, TRAP popr8# återställ/återlämna r8 bner24, r0, TrapHandler# yes, TRAP NoTrap:....data# eller i.text.align2# på adress delbar med 4 trapdum:trap# op-code of TRAP
3 August 2015IS1200 Datorteknik föreläsning 734 Vilken TRAP ”System Call med TRAP” TrapHandler: 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
3 August 2015 IS1200 Datorteknik ht2009, föreläsning 7, (D2)35 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 loop: main: br loop ”init”
3 August 2015IS1200 Datorteknik föreläsning 736 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 null Nästan REPRIS
3 August 2015IS1200 Datorteknik föreläsning 737 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
3 August 2015IS1200 Datorteknik föreläsning 738 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);
3 August 2015IS1200 Datorteknik föreläsning 739 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” samt dessutom 1.Initiera IO-enhet, olika för varje IO-enhet 2.Initiera bitar i IENABLE / ctl3 3.Initiera PIE-biten i STATUS / ctl0
Grindar att öppna före avbrott 3 August 2015IS1200 Datorteknik föreläsning 740 && & Interrupt to CPU PIE-bit in STATUS ctl0 BIT in IENABLE ctl3 BIT in I/O maskreg Interrupt from I/O BIT in IPENDING ctl4 IRQ-bit
3 August 2015IS1200 Datorteknik föreläsning 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...)...
3 August 2015IS1200 Datorteknik föreläsning 742 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
3 August 2015IS1200 Datorteknik föreläsning 743 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 ?
3 August 2015IS1200 Datorteknik föreläsning 744 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?
3 August 2015IS1200 Datorteknik föreläsning 745 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
Grindar att öppna före avbrott 3 August 2015IS1200 Datorteknik föreläsning 746 && & Interrupt to CPU PIE-bit in STATUS ctl0 BIT in IENABLE ctl3 BIT in I/O maskreg Interrupt from I/O BIT in IPENDING ctl4 IRQ-bit
3 August 2015IS1200 Datorteknik föreläsning 747 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?)
3 August 2015IS1200 Datorteknik föreläsning 748 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
3 August 2015IS1200 Datorteknik föreläsning 749 Bitar 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
3 August 2015IS1200 Datorteknik föreläsning 750 Ändra bit i ctl-register Read – Modify - Write rRDCTL ri, ctlj# läs/kopiera ctlj till ri rORIri, ri, mask# ettställ med OR rWRCTLctlj,ri # skriv/kopiera ri till ctlj rRDCTL ri, ctlj# läs/kopiera ctlj till ri rANDIri, ri, mask# nollställ med AND rWRCTLctlj,ri # skriv/kopiera ri till ctlj
3 August 2015IS1200 Datorteknik föreläsning 751 IS1200 Datorteknik Laboration 3 Ny/ändrad from våren 2010 tips om I/O-interrupts
3 August 2015IS1200 Datorteknik föreläsning 752 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
3 August 2015IS1200 Datorteknik föreläsning 753 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
3 August 2015IS1200 Datorteknik föreläsning 754 Laboration 3: Exceptions Bakgrundsprogram zBakgrundsprogram beräknar och skriver ut primtal Main: is prime Main: is prime Main: is prime...
3 August 2015IS1200 Datorteknik föreläsning 755 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
3 August 2015IS1200 Datorteknik föreläsning 756 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
3 August 2015IS1200 Datorteknik föreläsning 757 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
3 August 2015IS1200 Datorteknik föreläsning 758 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
3 August 2015IS1200 Datorteknik föreläsning 759 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
3 August 2015IS1200 Datorteknik föreläsning 760 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:57 T 59:58 T 59:59 T Main: is prime! 00:00 T 00:01 T 00:02 T Main: is prime! 00:03 T 00:04 T 00:05 T 00:06 T Main: is prime! 00:07 T 00:08 T 00:09 T
3 August 2015IS1200 Datorteknik föreläsning 761 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 D 59:58T U 59:59T Main: is prime! D 00:00T 00:01T 00:02T Main: is prime! 00:03T U 00:04T 00:05T 00:06T Main: is prime! 00:07T 00:08T 00:09T
3 August 2015IS1200 Datorteknik föreläsning 762 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
3 August 2015IS1200 Datorteknik föreläsning 763 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
3 August 2015IS1200 Datorteknik föreläsning 7643 August 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
3 August 2015IS1200 Datorteknik föreläsning 765 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 D 59:58T U 59:59T Main: is prime! D 00:00T 00:01T 00:02T Main: is prime! 00:03T U 00:04T 00:05T 00:06T Main: is prime! 00:07T 00:08T 00:09T
3 August 2015IS1200 Datorteknik föreläsning 766 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)
3 August 2015IS1200 Datorteknik föreläsning 767 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
3 August 2015IS1200 Datorteknik föreläsning 768 Nios uart_0 Memory Mapped Addresses 0x860 0x864 0x868 RxRdy (IBF) TxRdy (OBE) RxDATA (RD) uart_10x880-88F TxDATA (WR) uart_0
3 August 2015IS1200 Datorteknik föreläsning 769 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
3 August 2015IS1200 Datorteknik föreläsning 770 IRQ-Handler (för KEYS4) letar fram aktuell avbrottskälla KeyHandler: Key0-int: Key1-int: Key3-int: retur Key-0? Key-1? Key-2? Key-3? Key2-int: retur
3 August 2015IS1200 Datorteknik föreläsning 771 Int from IRQ-02 de2_pio_keys_4 KeyHandler: 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)
3 August 2015IS1200 Datorteknik föreläsning 772 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
3 August 2015IS1200 Datorteknik föreläsning 773 IRQ-Handler (för KEYS4) letar fram aktuell avbrottskälla Uart0Handler: Rx0-int: Tx0-int: retur RxRdy? TxRdy?
3 August 2015IS1200 Datorteknik föreläsning 774 Int from IRQ-04 Uart0-Handler Uart0Handler: 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...
3 August 2015IS1200 Datorteknik föreläsning 775 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
3 August 2015IS1200 Datorteknik föreläsning 776 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
3 August 2015IS1200 Datorteknik föreläsning 777 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)...
3 August 2015IS1200 Datorteknik föreläsning 778 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)
3 August 2015IS1200 Datorteknik föreläsning 779 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)
3 August 2015IS1200 Datorteknik föreläsning 780 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
3 August 2015IS1200 Datorteknik föreläsning 781 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 3 August 2015IS1200 Datorteknik föreläsning 782 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) 3 August 2015IS1200 Datorteknik föreläsning 783 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() 3 August 2015IS1200 Datorteknik föreläsning 784 int alt_irq_non_interruptible(alt_u32 oldmask) ” Återställ tillåtna/förbjudna avbrott enligt tidigare ” int_alt_irq_non_interruptible(oldmask); ctl3